diff --git a/metrics-server/vendor/k8s.io/apiserver/LICENSE b/metrics-server/vendor/k8s.io/apiserver/LICENSE
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/LICENSE
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/attributes.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/attributes.go
new file mode 100644
index 0000000..7272e88
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/attributes.go
@@ -0,0 +1,140 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package admission
+
+import (
+	"fmt"
+	"strings"
+	"sync"
+
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apimachinery/pkg/util/validation"
+	"k8s.io/apiserver/pkg/authentication/user"
+)
+
+type attributesRecord struct {
+	kind        schema.GroupVersionKind
+	namespace   string
+	name        string
+	resource    schema.GroupVersionResource
+	subresource string
+	operation   Operation
+	object      runtime.Object
+	oldObject   runtime.Object
+	userInfo    user.Info
+
+	// other elements are always accessed in single goroutine.
+	// But ValidatingAdmissionWebhook add annotations concurrently.
+	annotations     map[string]string
+	annotationsLock sync.RWMutex
+}
+
+func NewAttributesRecord(object runtime.Object, oldObject runtime.Object, kind schema.GroupVersionKind, namespace, name string, resource schema.GroupVersionResource, subresource string, operation Operation, userInfo user.Info) Attributes {
+	return &attributesRecord{
+		kind:        kind,
+		namespace:   namespace,
+		name:        name,
+		resource:    resource,
+		subresource: subresource,
+		operation:   operation,
+		object:      object,
+		oldObject:   oldObject,
+		userInfo:    userInfo,
+	}
+}
+
+func (record *attributesRecord) GetKind() schema.GroupVersionKind {
+	return record.kind
+}
+
+func (record *attributesRecord) GetNamespace() string {
+	return record.namespace
+}
+
+func (record *attributesRecord) GetName() string {
+	return record.name
+}
+
+func (record *attributesRecord) GetResource() schema.GroupVersionResource {
+	return record.resource
+}
+
+func (record *attributesRecord) GetSubresource() string {
+	return record.subresource
+}
+
+func (record *attributesRecord) GetOperation() Operation {
+	return record.operation
+}
+
+func (record *attributesRecord) GetObject() runtime.Object {
+	return record.object
+}
+
+func (record *attributesRecord) GetOldObject() runtime.Object {
+	return record.oldObject
+}
+
+func (record *attributesRecord) GetUserInfo() user.Info {
+	return record.userInfo
+}
+
+// getAnnotations implements privateAnnotationsGetter.It's a private method used
+// by WithAudit decorator.
+func (record *attributesRecord) getAnnotations() map[string]string {
+	record.annotationsLock.RLock()
+	defer record.annotationsLock.RUnlock()
+
+	if record.annotations == nil {
+		return nil
+	}
+	cp := make(map[string]string, len(record.annotations))
+	for key, value := range record.annotations {
+		cp[key] = value
+	}
+	return cp
+}
+
+func (record *attributesRecord) AddAnnotation(key, value string) error {
+	if err := checkKeyFormat(key); err != nil {
+		return err
+	}
+
+	record.annotationsLock.Lock()
+	defer record.annotationsLock.Unlock()
+
+	if record.annotations == nil {
+		record.annotations = make(map[string]string)
+	}
+	if v, ok := record.annotations[key]; ok && v != value {
+		return fmt.Errorf("admission annotations are not allowd to be overwritten, key:%q, old value: %q, new value:%q", key, record.annotations[key], value)
+	}
+	record.annotations[key] = value
+	return nil
+}
+
+func checkKeyFormat(key string) error {
+	parts := strings.Split(key, "/")
+	if len(parts) != 2 {
+		return fmt.Errorf("annotation key has invalid format, the right format is a DNS subdomain prefix and '/' and key name. (e.g. 'podsecuritypolicy.admission.k8s.io/admit-policy')")
+	}
+	if msgs := validation.IsQualifiedName(key); len(msgs) != 0 {
+		return fmt.Errorf("annotation key has invalid format %s. A qualified name like 'podsecuritypolicy.admission.k8s.io/admit-policy' is required.", strings.Join(msgs, ","))
+	}
+	return nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/audit.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/audit.go
new file mode 100644
index 0000000..13d86b3
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/audit.go
@@ -0,0 +1,95 @@
+/*
+Copyright 2018 The Kubernetes Authors.
+
+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.
+*/
+
+package admission
+
+import (
+	"fmt"
+
+	auditinternal "k8s.io/apiserver/pkg/apis/audit"
+	"k8s.io/apiserver/pkg/audit"
+)
+
+// auditHandler logs annotations set by other admission handlers
+type auditHandler struct {
+	Interface
+	ae *auditinternal.Event
+}
+
+var _ Interface = &auditHandler{}
+var _ MutationInterface = &auditHandler{}
+var _ ValidationInterface = &auditHandler{}
+
+// WithAudit is a decorator for a admission phase. It saves annotations
+// of attribute into the audit event. Attributes passed to the Admit and
+// Validate function must be instance of privateAnnotationsGetter or
+// AnnotationsGetter, otherwise an error is returned.
+func WithAudit(i Interface, ae *auditinternal.Event) Interface {
+	if i == nil {
+		return i
+	}
+	return &auditHandler{i, ae}
+}
+
+func (handler auditHandler) Admit(a Attributes) error {
+	if !handler.Interface.Handles(a.GetOperation()) {
+		return nil
+	}
+	if err := ensureAnnotationGetter(a); err != nil {
+		return err
+	}
+	var err error
+	if mutator, ok := handler.Interface.(MutationInterface); ok {
+		err = mutator.Admit(a)
+		handler.logAnnotations(a)
+	}
+	return err
+}
+
+func (handler auditHandler) Validate(a Attributes) error {
+	if !handler.Interface.Handles(a.GetOperation()) {
+		return nil
+	}
+	if err := ensureAnnotationGetter(a); err != nil {
+		return err
+	}
+	var err error
+	if validator, ok := handler.Interface.(ValidationInterface); ok {
+		err = validator.Validate(a)
+		handler.logAnnotations(a)
+	}
+	return err
+}
+
+func ensureAnnotationGetter(a Attributes) error {
+	_, okPrivate := a.(privateAnnotationsGetter)
+	_, okPublic := a.(AnnotationsGetter)
+	if okPrivate || okPublic {
+		return nil
+	}
+	return fmt.Errorf("attributes must be an instance of privateAnnotationsGetter or AnnotationsGetter")
+}
+
+func (handler auditHandler) logAnnotations(a Attributes) {
+	switch a := a.(type) {
+	case privateAnnotationsGetter:
+		audit.LogAnnotations(handler.ae, a.getAnnotations())
+	case AnnotationsGetter:
+		audit.LogAnnotations(handler.ae, a.GetAnnotations())
+	default:
+		// this will never happen, because we have already checked it in ensureAnnotationGetter
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/chain.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/chain.go
new file mode 100644
index 0000000..011641f
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/chain.go
@@ -0,0 +1,68 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package admission
+
+// chainAdmissionHandler is an instance of admission.NamedHandler that performs admission control using
+// a chain of admission handlers
+type chainAdmissionHandler []Interface
+
+// NewChainHandler creates a new chain handler from an array of handlers. Used for testing.
+func NewChainHandler(handlers ...Interface) chainAdmissionHandler {
+	return chainAdmissionHandler(handlers)
+}
+
+// Admit performs an admission control check using a chain of handlers, and returns immediately on first error
+func (admissionHandler chainAdmissionHandler) Admit(a Attributes) error {
+	for _, handler := range admissionHandler {
+		if !handler.Handles(a.GetOperation()) {
+			continue
+		}
+		if mutator, ok := handler.(MutationInterface); ok {
+			err := mutator.Admit(a)
+			if err != nil {
+				return err
+			}
+		}
+	}
+	return nil
+}
+
+// Validate performs an admission control check using a chain of handlers, and returns immediately on first error
+func (admissionHandler chainAdmissionHandler) Validate(a Attributes) error {
+	for _, handler := range admissionHandler {
+		if !handler.Handles(a.GetOperation()) {
+			continue
+		}
+		if validator, ok := handler.(ValidationInterface); ok {
+			err := validator.Validate(a)
+			if err != nil {
+				return err
+			}
+		}
+	}
+	return nil
+}
+
+// Handles will return true if any of the handlers handles the given operation
+func (admissionHandler chainAdmissionHandler) Handles(operation Operation) bool {
+	for _, handler := range admissionHandler {
+		if handler.Handles(operation) {
+			return true
+		}
+	}
+	return false
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/config.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/config.go
new file mode 100644
index 0000000..f59d060
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/config.go
@@ -0,0 +1,178 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package admission
+
+import (
+	"bytes"
+	"fmt"
+	"io"
+	"io/ioutil"
+	"os"
+	"path"
+	"path/filepath"
+
+	"github.com/ghodss/yaml"
+	"github.com/golang/glog"
+
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/serializer"
+	"k8s.io/apimachinery/pkg/util/sets"
+	"k8s.io/apiserver/pkg/apis/apiserver"
+	apiserverv1alpha1 "k8s.io/apiserver/pkg/apis/apiserver/v1alpha1"
+)
+
+func makeAbs(path, base string) (string, error) {
+	if filepath.IsAbs(path) {
+		return path, nil
+	}
+	if len(base) == 0 || base == "." {
+		cwd, err := os.Getwd()
+		if err != nil {
+			return "", err
+		}
+		base = cwd
+	}
+	return filepath.Join(base, path), nil
+}
+
+// ReadAdmissionConfiguration reads the admission configuration at the specified path.
+// It returns the loaded admission configuration if the input file aligns with the required syntax.
+// If it does not align with the provided syntax, it returns a default configuration for the enumerated
+// set of pluginNames whose config location references the specified configFilePath.
+// It does this to preserve backward compatibility when admission control files were opaque.
+// It returns an error if the file did not exist.
+func ReadAdmissionConfiguration(pluginNames []string, configFilePath string, configScheme *runtime.Scheme) (ConfigProvider, error) {
+	if configFilePath == "" {
+		return configProvider{config: &apiserver.AdmissionConfiguration{}}, nil
+	}
+	// a file was provided, so we just read it.
+	data, err := ioutil.ReadFile(configFilePath)
+	if err != nil {
+		return nil, fmt.Errorf("unable to read admission control configuration from %q [%v]", configFilePath, err)
+	}
+	codecs := serializer.NewCodecFactory(configScheme)
+	decoder := codecs.UniversalDecoder()
+	decodedObj, err := runtime.Decode(decoder, data)
+	// we were able to decode the file successfully
+	if err == nil {
+		decodedConfig, ok := decodedObj.(*apiserver.AdmissionConfiguration)
+		if !ok {
+			return nil, fmt.Errorf("unexpected type: %T", decodedObj)
+		}
+		baseDir := path.Dir(configFilePath)
+		for i := range decodedConfig.Plugins {
+			if decodedConfig.Plugins[i].Path == "" {
+				continue
+			}
+			// we update relative file paths to absolute paths
+			absPath, err := makeAbs(decodedConfig.Plugins[i].Path, baseDir)
+			if err != nil {
+				return nil, err
+			}
+			decodedConfig.Plugins[i].Path = absPath
+		}
+		return configProvider{
+			config: decodedConfig,
+			scheme: configScheme,
+		}, nil
+	}
+	// we got an error where the decode wasn't related to a missing type
+	if !(runtime.IsMissingVersion(err) || runtime.IsMissingKind(err) || runtime.IsNotRegisteredError(err)) {
+		return nil, err
+	}
+
+	// Only tolerate load errors if the file appears to be one of the two legacy plugin configs
+	unstructuredData := map[string]interface{}{}
+	if err2 := yaml.Unmarshal(data, &unstructuredData); err2 != nil {
+		return nil, err
+	}
+	_, isLegacyImagePolicy := unstructuredData["imagePolicy"]
+	_, isLegacyPodNodeSelector := unstructuredData["podNodeSelectorPluginConfig"]
+	if !isLegacyImagePolicy && !isLegacyPodNodeSelector {
+		return nil, err
+	}
+
+	// convert the legacy format to the new admission control format
+	// in order to preserve backwards compatibility, we set plugins that
+	// previously read input from a non-versioned file configuration to the
+	// current input file.
+	legacyPluginsWithUnversionedConfig := sets.NewString("ImagePolicyWebhook", "PodNodeSelector")
+	externalConfig := &apiserverv1alpha1.AdmissionConfiguration{}
+	for _, pluginName := range pluginNames {
+		if legacyPluginsWithUnversionedConfig.Has(pluginName) {
+			externalConfig.Plugins = append(externalConfig.Plugins,
+				apiserverv1alpha1.AdmissionPluginConfiguration{
+					Name: pluginName,
+					Path: configFilePath})
+		}
+	}
+	configScheme.Default(externalConfig)
+	internalConfig := &apiserver.AdmissionConfiguration{}
+	if err := configScheme.Convert(externalConfig, internalConfig, nil); err != nil {
+		return nil, err
+	}
+	return configProvider{
+		config: internalConfig,
+		scheme: configScheme,
+	}, nil
+}
+
+type configProvider struct {
+	config *apiserver.AdmissionConfiguration
+	scheme *runtime.Scheme
+}
+
+// GetAdmissionPluginConfigurationFor returns a reader that holds the admission plugin configuration.
+func GetAdmissionPluginConfigurationFor(pluginCfg apiserver.AdmissionPluginConfiguration) (io.Reader, error) {
+	// if there is a nest object, return it directly
+	if pluginCfg.Configuration != nil {
+		return bytes.NewBuffer(pluginCfg.Configuration.Raw), nil
+	}
+	// there is nothing nested, so we delegate to path
+	if pluginCfg.Path != "" {
+		content, err := ioutil.ReadFile(pluginCfg.Path)
+		if err != nil {
+			glog.Fatalf("Couldn't open admission plugin configuration %s: %#v", pluginCfg.Path, err)
+			return nil, err
+		}
+		return bytes.NewBuffer(content), nil
+	}
+	// there is no special config at all
+	return nil, nil
+}
+
+// ConfigFor returns a reader for the specified plugin.
+// If no specific configuration is present, we return a nil reader.
+func (p configProvider) ConfigFor(pluginName string) (io.Reader, error) {
+	// there is no config, so there is no potential config
+	if p.config == nil {
+		return nil, nil
+	}
+	// look for matching plugin and get configuration
+	for _, pluginCfg := range p.config.Plugins {
+		if pluginName != pluginCfg.Name {
+			continue
+		}
+		pluginConfig, err := GetAdmissionPluginConfigurationFor(pluginCfg)
+		if err != nil {
+			return nil, err
+		}
+		return pluginConfig, nil
+	}
+	// there is no registered config that matches on plugin name.
+	return nil, nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/configuration/configuration_manager.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/configuration/configuration_manager.go
new file mode 100644
index 0000000..4c4bf74
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/configuration/configuration_manager.go
@@ -0,0 +1,166 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package configuration
+
+import (
+	"fmt"
+	"sync"
+	"time"
+
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/util/wait"
+)
+
+const (
+	defaultInterval             = 1 * time.Second
+	defaultFailureThreshold     = 5
+	defaultBootstrapRetries     = 5
+	defaultBootstrapGraceperiod = 5 * time.Second
+)
+
+var (
+	ErrNotReady = fmt.Errorf("configuration is not ready")
+	ErrDisabled = fmt.Errorf("disabled")
+)
+
+type getFunc func() (runtime.Object, error)
+
+// When running, poller calls `get` every `interval`. If `get` is
+// successful, `Ready()` returns ready and `configuration()` returns the
+// `mergedConfiguration`; if `get` has failed more than `failureThreshold ` times,
+// `Ready()` returns not ready and `configuration()` returns nil configuration.
+// In an HA setup, the poller is consistent only if the `get` is
+// doing consistent read.
+type poller struct {
+	// a function to consistently read the latest configuration
+	get getFunc
+	// consistent read interval
+	// read-only
+	interval time.Duration
+	// if the number of consecutive read failure equals or exceeds the failureThreshold , the
+	// configuration is regarded as not ready.
+	// read-only
+	failureThreshold int
+	// number of consecutive failures so far.
+	failures int
+	// If the poller has passed the bootstrap phase. The poller is considered
+	// bootstrapped either bootstrapGracePeriod after the first call of
+	// configuration(), or when setConfigurationAndReady() is called, whichever
+	// comes first.
+	bootstrapped bool
+	// configuration() retries bootstrapRetries times if poller is not bootstrapped
+	// read-only
+	bootstrapRetries int
+	// Grace period for bootstrapping
+	// read-only
+	bootstrapGracePeriod time.Duration
+	once                 sync.Once
+	// if the configuration is regarded as ready.
+	ready               bool
+	mergedConfiguration runtime.Object
+	lastErr             error
+	// lock must be hold when reading/writing the data fields of poller.
+	lock sync.RWMutex
+}
+
+func newPoller(get getFunc) *poller {
+	p := poller{
+		get:                  get,
+		interval:             defaultInterval,
+		failureThreshold:     defaultFailureThreshold,
+		bootstrapRetries:     defaultBootstrapRetries,
+		bootstrapGracePeriod: defaultBootstrapGraceperiod,
+	}
+	return &p
+}
+
+func (a *poller) lastError(err error) {
+	a.lock.Lock()
+	defer a.lock.Unlock()
+	a.lastErr = err
+}
+
+func (a *poller) notReady() {
+	a.lock.Lock()
+	defer a.lock.Unlock()
+	a.ready = false
+}
+
+func (a *poller) bootstrapping() {
+	// bootstrapGracePeriod is read-only, so no lock is required
+	timer := time.NewTimer(a.bootstrapGracePeriod)
+	go func() {
+		defer timer.Stop()
+		<-timer.C
+		a.lock.Lock()
+		defer a.lock.Unlock()
+		a.bootstrapped = true
+	}()
+}
+
+// If the poller is not bootstrapped yet, the configuration() gets a few chances
+// to retry. This hides transient failures during system startup.
+func (a *poller) configuration() (runtime.Object, error) {
+	a.once.Do(a.bootstrapping)
+	a.lock.RLock()
+	defer a.lock.RUnlock()
+	retries := 1
+	if !a.bootstrapped {
+		retries = a.bootstrapRetries
+	}
+	for count := 0; count < retries; count++ {
+		if count > 0 {
+			a.lock.RUnlock()
+			time.Sleep(a.interval)
+			a.lock.RLock()
+		}
+		if a.ready {
+			return a.mergedConfiguration, nil
+		}
+	}
+	if a.lastErr != nil {
+		return nil, a.lastErr
+	}
+	return nil, ErrNotReady
+}
+
+func (a *poller) setConfigurationAndReady(value runtime.Object) {
+	a.lock.Lock()
+	defer a.lock.Unlock()
+	a.bootstrapped = true
+	a.mergedConfiguration = value
+	a.ready = true
+	a.lastErr = nil
+}
+
+func (a *poller) Run(stopCh <-chan struct{}) {
+	go wait.Until(a.sync, a.interval, stopCh)
+}
+
+func (a *poller) sync() {
+	configuration, err := a.get()
+	if err != nil {
+		a.failures++
+		a.lastError(err)
+		if a.failures >= a.failureThreshold {
+			a.notReady()
+		}
+		return
+	}
+	a.failures = 0
+	a.setConfigurationAndReady(configuration)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/configuration/initializer_manager.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/configuration/initializer_manager.go
new file mode 100644
index 0000000..986524b
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/configuration/initializer_manager.go
@@ -0,0 +1,88 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package configuration
+
+import (
+	"fmt"
+	"reflect"
+	"sort"
+
+	"github.com/golang/glog"
+
+	"k8s.io/api/admissionregistration/v1alpha1"
+	"k8s.io/apimachinery/pkg/api/errors"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+)
+
+type InitializerConfigurationLister interface {
+	List(opts metav1.ListOptions) (*v1alpha1.InitializerConfigurationList, error)
+}
+
+type InitializerConfigurationManager struct {
+	*poller
+}
+
+func NewInitializerConfigurationManager(c InitializerConfigurationLister) *InitializerConfigurationManager {
+	getFn := func() (runtime.Object, error) {
+		list, err := c.List(metav1.ListOptions{})
+		if err != nil {
+			if errors.IsNotFound(err) || errors.IsForbidden(err) {
+				glog.V(5).Infof("Initializers are disabled due to an error: %v", err)
+				return nil, ErrDisabled
+			}
+			return nil, err
+		}
+		return mergeInitializerConfigurations(list), nil
+	}
+	return &InitializerConfigurationManager{
+		newPoller(getFn),
+	}
+}
+
+// Initializers returns the merged InitializerConfiguration.
+func (im *InitializerConfigurationManager) Initializers() (*v1alpha1.InitializerConfiguration, error) {
+	configuration, err := im.poller.configuration()
+	if err != nil {
+		return nil, err
+	}
+	initializerConfiguration, ok := configuration.(*v1alpha1.InitializerConfiguration)
+	if !ok {
+		return nil, fmt.Errorf("expected type %v, got type %v", reflect.TypeOf(initializerConfiguration), reflect.TypeOf(configuration))
+	}
+	return initializerConfiguration, nil
+}
+
+func (im *InitializerConfigurationManager) Run(stopCh <-chan struct{}) {
+	im.poller.Run(stopCh)
+}
+
+func mergeInitializerConfigurations(initializerConfigurationList *v1alpha1.InitializerConfigurationList) *v1alpha1.InitializerConfiguration {
+	configurations := initializerConfigurationList.Items
+	sort.SliceStable(configurations, InitializerConfigurationSorter(configurations).ByName)
+	var ret v1alpha1.InitializerConfiguration
+	for _, c := range configurations {
+		ret.Initializers = append(ret.Initializers, c.Initializers...)
+	}
+	return &ret
+}
+
+type InitializerConfigurationSorter []v1alpha1.InitializerConfiguration
+
+func (a InitializerConfigurationSorter) ByName(i, j int) bool {
+	return a[i].Name < a[j].Name
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/configuration/mutating_webhook_manager.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/configuration/mutating_webhook_manager.go
new file mode 100644
index 0000000..4b2256e
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/configuration/mutating_webhook_manager.go
@@ -0,0 +1,97 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package configuration
+
+import (
+	"fmt"
+	"sort"
+	"sync/atomic"
+
+	"k8s.io/api/admissionregistration/v1beta1"
+	"k8s.io/apimachinery/pkg/labels"
+	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
+	"k8s.io/apiserver/pkg/admission/plugin/webhook/generic"
+	"k8s.io/client-go/informers"
+	admissionregistrationlisters "k8s.io/client-go/listers/admissionregistration/v1beta1"
+	"k8s.io/client-go/tools/cache"
+)
+
+// mutatingWebhookConfigurationManager collects the mutating webhook objects so that they can be called.
+type mutatingWebhookConfigurationManager struct {
+	configuration *atomic.Value
+	lister        admissionregistrationlisters.MutatingWebhookConfigurationLister
+	hasSynced     func() bool
+}
+
+var _ generic.Source = &mutatingWebhookConfigurationManager{}
+
+func NewMutatingWebhookConfigurationManager(f informers.SharedInformerFactory) generic.Source {
+	informer := f.Admissionregistration().V1beta1().MutatingWebhookConfigurations()
+	manager := &mutatingWebhookConfigurationManager{
+		configuration: &atomic.Value{},
+		lister:        informer.Lister(),
+		hasSynced:     informer.Informer().HasSynced,
+	}
+
+	// Start with an empty list
+	manager.configuration.Store(&v1beta1.MutatingWebhookConfiguration{})
+
+	// On any change, rebuild the config
+	informer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
+		AddFunc:    func(_ interface{}) { manager.updateConfiguration() },
+		UpdateFunc: func(_, _ interface{}) { manager.updateConfiguration() },
+		DeleteFunc: func(_ interface{}) { manager.updateConfiguration() },
+	})
+
+	return manager
+}
+
+// Webhooks returns the merged MutatingWebhookConfiguration.
+func (m *mutatingWebhookConfigurationManager) Webhooks() []v1beta1.Webhook {
+	return m.configuration.Load().(*v1beta1.MutatingWebhookConfiguration).Webhooks
+}
+
+func (m *mutatingWebhookConfigurationManager) HasSynced() bool {
+	return m.hasSynced()
+}
+
+func (m *mutatingWebhookConfigurationManager) updateConfiguration() {
+	configurations, err := m.lister.List(labels.Everything())
+	if err != nil {
+		utilruntime.HandleError(fmt.Errorf("error updating configuration: %v", err))
+		return
+	}
+	m.configuration.Store(mergeMutatingWebhookConfigurations(configurations))
+}
+
+func mergeMutatingWebhookConfigurations(configurations []*v1beta1.MutatingWebhookConfiguration) *v1beta1.MutatingWebhookConfiguration {
+	var ret v1beta1.MutatingWebhookConfiguration
+	// The internal order of webhooks for each configuration is provided by the user
+	// but configurations themselves can be in any order. As we are going to run these
+	// webhooks in serial, they are sorted here to have a deterministic order.
+	sort.SliceStable(configurations, MutatingWebhookConfigurationSorter(configurations).ByName)
+	for _, c := range configurations {
+		ret.Webhooks = append(ret.Webhooks, c.Webhooks...)
+	}
+	return &ret
+}
+
+type MutatingWebhookConfigurationSorter []*v1beta1.MutatingWebhookConfiguration
+
+func (a MutatingWebhookConfigurationSorter) ByName(i, j int) bool {
+	return a[i].Name < a[j].Name
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/configuration/validating_webhook_manager.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/configuration/validating_webhook_manager.go
new file mode 100644
index 0000000..9258258
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/configuration/validating_webhook_manager.go
@@ -0,0 +1,97 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package configuration
+
+import (
+	"fmt"
+	"sort"
+	"sync/atomic"
+
+	"k8s.io/api/admissionregistration/v1beta1"
+	"k8s.io/apimachinery/pkg/labels"
+	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
+	"k8s.io/apiserver/pkg/admission/plugin/webhook/generic"
+	"k8s.io/client-go/informers"
+	admissionregistrationlisters "k8s.io/client-go/listers/admissionregistration/v1beta1"
+	"k8s.io/client-go/tools/cache"
+)
+
+// validatingWebhookConfigurationManager collects the validating webhook objects so that they can be called.
+type validatingWebhookConfigurationManager struct {
+	configuration *atomic.Value
+	lister        admissionregistrationlisters.ValidatingWebhookConfigurationLister
+	hasSynced     func() bool
+}
+
+var _ generic.Source = &validatingWebhookConfigurationManager{}
+
+func NewValidatingWebhookConfigurationManager(f informers.SharedInformerFactory) generic.Source {
+	informer := f.Admissionregistration().V1beta1().ValidatingWebhookConfigurations()
+	manager := &validatingWebhookConfigurationManager{
+		configuration: &atomic.Value{},
+		lister:        informer.Lister(),
+		hasSynced:     informer.Informer().HasSynced,
+	}
+
+	// Start with an empty list
+	manager.configuration.Store(&v1beta1.ValidatingWebhookConfiguration{})
+
+	// On any change, rebuild the config
+	informer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
+		AddFunc:    func(_ interface{}) { manager.updateConfiguration() },
+		UpdateFunc: func(_, _ interface{}) { manager.updateConfiguration() },
+		DeleteFunc: func(_ interface{}) { manager.updateConfiguration() },
+	})
+
+	return manager
+}
+
+// Webhooks returns the merged ValidatingWebhookConfiguration.
+func (v *validatingWebhookConfigurationManager) Webhooks() []v1beta1.Webhook {
+	return v.configuration.Load().(*v1beta1.ValidatingWebhookConfiguration).Webhooks
+}
+
+// HasSynced returns true if the shared informers have synced.
+func (v *validatingWebhookConfigurationManager) HasSynced() bool {
+	return v.hasSynced()
+}
+
+func (v *validatingWebhookConfigurationManager) updateConfiguration() {
+	configurations, err := v.lister.List(labels.Everything())
+	if err != nil {
+		utilruntime.HandleError(fmt.Errorf("error updating configuration: %v", err))
+		return
+	}
+	v.configuration.Store(mergeValidatingWebhookConfigurations(configurations))
+}
+
+func mergeValidatingWebhookConfigurations(
+	configurations []*v1beta1.ValidatingWebhookConfiguration,
+) *v1beta1.ValidatingWebhookConfiguration {
+	sort.SliceStable(configurations, ValidatingWebhookConfigurationSorter(configurations).ByName)
+	var ret v1beta1.ValidatingWebhookConfiguration
+	for _, c := range configurations {
+		ret.Webhooks = append(ret.Webhooks, c.Webhooks...)
+	}
+	return &ret
+}
+
+type ValidatingWebhookConfigurationSorter []*v1beta1.ValidatingWebhookConfiguration
+
+func (a ValidatingWebhookConfigurationSorter) ByName(i, j int) bool {
+	return a[i].Name < a[j].Name
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/decorator.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/decorator.go
new file mode 100644
index 0000000..a4b0b28
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/decorator.go
@@ -0,0 +1,39 @@
+/*
+Copyright 2018 The Kubernetes Authors.
+
+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.
+*/
+
+package admission
+
+type Decorator interface {
+	Decorate(handler Interface, name string) Interface
+}
+
+type DecoratorFunc func(handler Interface, name string) Interface
+
+func (d DecoratorFunc) Decorate(handler Interface, name string) Interface {
+	return d(handler, name)
+}
+
+type Decorators []Decorator
+
+// Decorate applies the decorator in inside-out order, i.e. the first decorator in the slice is first applied to the given handler.
+func (d Decorators) Decorate(handler Interface, name string) Interface {
+	result := handler
+	for _, d := range d {
+		result = d.Decorate(result, name)
+	}
+
+	return result
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/errors.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/errors.go
new file mode 100644
index 0000000..9a069a2
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/errors.go
@@ -0,0 +1,72 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+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.
+*/
+
+package admission
+
+import (
+	apierrors "k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/api/meta"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	utilerrors "k8s.io/apimachinery/pkg/util/errors"
+)
+
+func extractResourceName(a Attributes) (name string, resource schema.GroupResource, err error) {
+	resource = a.GetResource().GroupResource()
+
+	if len(a.GetName()) > 0 {
+		return a.GetName(), resource, nil
+	}
+
+	name = "Unknown"
+	obj := a.GetObject()
+	if obj != nil {
+		accessor, err := meta.Accessor(obj)
+		if err != nil {
+			// not all object have ObjectMeta.  If we don't, return a name with a slash (always illegal)
+			return "Unknown/errorGettingName", resource, nil
+		}
+
+		// this is necessary because name object name generation has not occurred yet
+		if len(accessor.GetName()) > 0 {
+			name = accessor.GetName()
+		} else if len(accessor.GetGenerateName()) > 0 {
+			name = accessor.GetGenerateName()
+		}
+	}
+	return name, resource, nil
+}
+
+// NewForbidden is a utility function to return a well-formatted admission control error response
+func NewForbidden(a Attributes, internalError error) error {
+	// do not double wrap an error of same type
+	if apierrors.IsForbidden(internalError) {
+		return internalError
+	}
+	name, resource, err := extractResourceName(a)
+	if err != nil {
+		return apierrors.NewInternalError(utilerrors.NewAggregate([]error{internalError, err}))
+	}
+	return apierrors.NewForbidden(resource, name, internalError)
+}
+
+// NewNotFound is a utility function to return a well-formatted admission control error response
+func NewNotFound(a Attributes) error {
+	name, resource, err := extractResourceName(a)
+	if err != nil {
+		return apierrors.NewInternalError(err)
+	}
+	return apierrors.NewNotFound(resource, name)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/handler.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/handler.go
new file mode 100644
index 0000000..d2a9e7d
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/handler.go
@@ -0,0 +1,79 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+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.
+*/
+
+package admission
+
+import (
+	"time"
+
+	"k8s.io/apimachinery/pkg/util/sets"
+)
+
+const (
+	// timeToWaitForReady is the amount of time to wait to let an admission controller to be ready to satisfy a request.
+	// this is useful when admission controllers need to warm their caches before letting requests through.
+	timeToWaitForReady = 10 * time.Second
+)
+
+// ReadyFunc is a function that returns true if the admission controller is ready to handle requests.
+type ReadyFunc func() bool
+
+// Handler is a base for admission control handlers that
+// support a predefined set of operations
+type Handler struct {
+	operations sets.String
+	readyFunc  ReadyFunc
+}
+
+// Handles returns true for methods that this handler supports
+func (h *Handler) Handles(operation Operation) bool {
+	return h.operations.Has(string(operation))
+}
+
+// NewHandler creates a new base handler that handles the passed
+// in operations
+func NewHandler(ops ...Operation) *Handler {
+	operations := sets.NewString()
+	for _, op := range ops {
+		operations.Insert(string(op))
+	}
+	return &Handler{
+		operations: operations,
+	}
+}
+
+// SetReadyFunc allows late registration of a ReadyFunc to know if the handler is ready to process requests.
+func (h *Handler) SetReadyFunc(readyFunc ReadyFunc) {
+	h.readyFunc = readyFunc
+}
+
+// WaitForReady will wait for the readyFunc (if registered) to return ready, and in case of timeout, will return false.
+func (h *Handler) WaitForReady() bool {
+	// there is no ready func configured, so we return immediately
+	if h.readyFunc == nil {
+		return true
+	}
+
+	timeout := time.After(timeToWaitForReady)
+	for !h.readyFunc() {
+		select {
+		case <-time.After(100 * time.Millisecond):
+		case <-timeout:
+			return h.readyFunc()
+		}
+	}
+	return true
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/initializer/initializer.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/initializer/initializer.go
new file mode 100644
index 0000000..abe764b
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/initializer/initializer.go
@@ -0,0 +1,70 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package initializer
+
+import (
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apiserver/pkg/admission"
+	"k8s.io/apiserver/pkg/authorization/authorizer"
+	"k8s.io/client-go/informers"
+	"k8s.io/client-go/kubernetes"
+)
+
+type pluginInitializer struct {
+	externalClient    kubernetes.Interface
+	externalInformers informers.SharedInformerFactory
+	authorizer        authorizer.Authorizer
+	scheme            *runtime.Scheme
+}
+
+// New creates an instance of admission plugins initializer.
+// TODO(p0lyn0mial): make the parameters public, this construction seems to be redundant.
+func New(
+	extClientset kubernetes.Interface,
+	extInformers informers.SharedInformerFactory,
+	authz authorizer.Authorizer,
+	scheme *runtime.Scheme,
+) pluginInitializer {
+	return pluginInitializer{
+		externalClient:    extClientset,
+		externalInformers: extInformers,
+		authorizer:        authz,
+		scheme:            scheme,
+	}
+}
+
+// Initialize checks the initialization interfaces implemented by a plugin
+// and provide the appropriate initialization data
+func (i pluginInitializer) Initialize(plugin admission.Interface) {
+	if wants, ok := plugin.(WantsExternalKubeClientSet); ok {
+		wants.SetExternalKubeClientSet(i.externalClient)
+	}
+
+	if wants, ok := plugin.(WantsExternalKubeInformerFactory); ok {
+		wants.SetExternalKubeInformerFactory(i.externalInformers)
+	}
+
+	if wants, ok := plugin.(WantsAuthorizer); ok {
+		wants.SetAuthorizer(i.authorizer)
+	}
+
+	if wants, ok := plugin.(WantsScheme); ok {
+		wants.SetScheme(i.scheme)
+	}
+}
+
+var _ admission.PluginInitializer = pluginInitializer{}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/initializer/interfaces.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/initializer/interfaces.go
new file mode 100644
index 0000000..98a0758
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/initializer/interfaces.go
@@ -0,0 +1,49 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package initializer
+
+import (
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apiserver/pkg/admission"
+	"k8s.io/apiserver/pkg/authorization/authorizer"
+	"k8s.io/client-go/informers"
+	"k8s.io/client-go/kubernetes"
+)
+
+// WantsExternalKubeClientSet defines a function which sets external ClientSet for admission plugins that need it
+type WantsExternalKubeClientSet interface {
+	SetExternalKubeClientSet(kubernetes.Interface)
+	admission.InitializationValidator
+}
+
+// WantsExternalKubeInformerFactory defines a function which sets InformerFactory for admission plugins that need it
+type WantsExternalKubeInformerFactory interface {
+	SetExternalKubeInformerFactory(informers.SharedInformerFactory)
+	admission.InitializationValidator
+}
+
+// WantsAuthorizer defines a function which sets Authorizer for admission plugins that need it.
+type WantsAuthorizer interface {
+	SetAuthorizer(authorizer.Authorizer)
+	admission.InitializationValidator
+}
+
+// WantsScheme defines a function that accepts runtime.Scheme for admission plugins that need it.
+type WantsScheme interface {
+	SetScheme(*runtime.Scheme)
+	admission.InitializationValidator
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/interfaces.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/interfaces.go
new file mode 100644
index 0000000..68ef558
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/interfaces.go
@@ -0,0 +1,119 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package admission
+
+import (
+	"io"
+
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apiserver/pkg/authentication/user"
+)
+
+// Attributes is an interface used by AdmissionController to get information about a request
+// that is used to make an admission decision.
+type Attributes interface {
+	// GetName returns the name of the object as presented in the request.  On a CREATE operation, the client
+	// may omit name and rely on the server to generate the name.  If that is the case, this method will return
+	// the empty string
+	GetName() string
+	// GetNamespace is the namespace associated with the request (if any)
+	GetNamespace() string
+	// GetResource is the name of the resource being requested.  This is not the kind.  For example: pods
+	GetResource() schema.GroupVersionResource
+	// GetSubresource is the name of the subresource being requested.  This is a different resource, scoped to the parent resource, but it may have a different kind.
+	// For instance, /pods has the resource "pods" and the kind "Pod", while /pods/foo/status has the resource "pods", the sub resource "status", and the kind "Pod"
+	// (because status operates on pods). The binding resource for a pod though may be /pods/foo/binding, which has resource "pods", subresource "binding", and kind "Binding".
+	GetSubresource() string
+	// GetOperation is the operation being performed
+	GetOperation() Operation
+	// GetObject is the object from the incoming request prior to default values being applied
+	GetObject() runtime.Object
+	// GetOldObject is the existing object. Only populated for UPDATE requests.
+	GetOldObject() runtime.Object
+	// GetKind is the type of object being manipulated.  For example: Pod
+	GetKind() schema.GroupVersionKind
+	// GetUserInfo is information about the requesting user
+	GetUserInfo() user.Info
+
+	// AddAnnotation sets annotation according to key-value pair. The key should be qualified, e.g., podsecuritypolicy.admission.k8s.io/admit-policy, where
+	// "podsecuritypolicy" is the name of the plugin, "admission.k8s.io" is the name of the organization, "admit-policy" is the key name.
+	// An error is returned if the format of key is invalid. When trying to overwrite annotation with a new value, an error is returned.
+	// Both ValidationInterface and MutationInterface are allowed to add Annotations.
+	AddAnnotation(key, value string) error
+}
+
+// privateAnnotationsGetter is a private interface which allows users to get annotations from Attributes.
+type privateAnnotationsGetter interface {
+	getAnnotations() map[string]string
+}
+
+// AnnotationsGetter allows users to get annotations from Attributes. An alternate Attribute should implement
+// this interface.
+type AnnotationsGetter interface {
+	GetAnnotations() map[string]string
+}
+
+// Interface is an abstract, pluggable interface for Admission Control decisions.
+type Interface interface {
+	// Handles returns true if this admission controller can handle the given operation
+	// where operation can be one of CREATE, UPDATE, DELETE, or CONNECT
+	Handles(operation Operation) bool
+}
+
+type MutationInterface interface {
+	Interface
+
+	// Admit makes an admission decision based on the request attributes
+	Admit(a Attributes) (err error)
+}
+
+// ValidationInterface is an abstract, pluggable interface for Admission Control decisions.
+type ValidationInterface interface {
+	Interface
+
+	// Validate makes an admission decision based on the request attributes.  It is NOT allowed to mutate
+	Validate(a Attributes) (err error)
+}
+
+// Operation is the type of resource operation being checked for admission control
+type Operation string
+
+// Operation constants
+const (
+	Create  Operation = "CREATE"
+	Update  Operation = "UPDATE"
+	Delete  Operation = "DELETE"
+	Connect Operation = "CONNECT"
+)
+
+// PluginInitializer is used for initialization of shareable resources between admission plugins.
+// After initialization the resources have to be set separately
+type PluginInitializer interface {
+	Initialize(plugin Interface)
+}
+
+// InitializationValidator holds ValidateInitialization functions, which are responsible for validation of initialized
+// shared resources and should be implemented on admission plugins
+type InitializationValidator interface {
+	ValidateInitialization() error
+}
+
+// ConfigProvider provides a way to get configuration for an admission plugin based on its name
+type ConfigProvider interface {
+	ConfigFor(pluginName string) (io.Reader, error)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/metrics/metrics.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/metrics/metrics.go
new file mode 100644
index 0000000..0955a98
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/metrics/metrics.go
@@ -0,0 +1,217 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package metrics
+
+import (
+	"fmt"
+	"strconv"
+	"time"
+
+	"github.com/prometheus/client_golang/prometheus"
+
+	"k8s.io/apiserver/pkg/admission"
+)
+
+const (
+	namespace = "apiserver"
+	subsystem = "admission"
+)
+
+var (
+	// Use buckets ranging from 25 ms to ~2.5 seconds.
+	latencyBuckets       = prometheus.ExponentialBuckets(25000, 2.5, 5)
+	latencySummaryMaxAge = 5 * time.Hour
+
+	// Metrics provides access to all admission metrics.
+	Metrics = newAdmissionMetrics()
+)
+
+// ObserverFunc is a func that emits metrics.
+type ObserverFunc func(elapsed time.Duration, rejected bool, attr admission.Attributes, stepType string, extraLabels ...string)
+
+const (
+	stepValidate = "validate"
+	stepAdmit    = "admit"
+)
+
+// WithControllerMetrics is a decorator for named admission handlers.
+func WithControllerMetrics(i admission.Interface, name string) admission.Interface {
+	return WithMetrics(i, Metrics.ObserveAdmissionController, name)
+}
+
+// WithStepMetrics is a decorator for a whole admission phase, i.e. admit or validation.admission step.
+func WithStepMetrics(i admission.Interface) admission.Interface {
+	return WithMetrics(i, Metrics.ObserveAdmissionStep)
+}
+
+// WithMetrics is a decorator for admission handlers with a generic observer func.
+func WithMetrics(i admission.Interface, observer ObserverFunc, extraLabels ...string) admission.Interface {
+	return &pluginHandlerWithMetrics{
+		Interface:   i,
+		observer:    observer,
+		extraLabels: extraLabels,
+	}
+}
+
+// pluginHandlerWithMetrics decorates a admission handler with metrics.
+type pluginHandlerWithMetrics struct {
+	admission.Interface
+	observer    ObserverFunc
+	extraLabels []string
+}
+
+// Admit performs a mutating admission control check and emit metrics.
+func (p pluginHandlerWithMetrics) Admit(a admission.Attributes) error {
+	mutatingHandler, ok := p.Interface.(admission.MutationInterface)
+	if !ok {
+		return nil
+	}
+
+	start := time.Now()
+	err := mutatingHandler.Admit(a)
+	p.observer(time.Since(start), err != nil, a, stepAdmit, p.extraLabels...)
+	return err
+}
+
+// Validate performs a non-mutating admission control check and emits metrics.
+func (p pluginHandlerWithMetrics) Validate(a admission.Attributes) error {
+	validatingHandler, ok := p.Interface.(admission.ValidationInterface)
+	if !ok {
+		return nil
+	}
+
+	start := time.Now()
+	err := validatingHandler.Validate(a)
+	p.observer(time.Since(start), err != nil, a, stepValidate, p.extraLabels...)
+	return err
+}
+
+// AdmissionMetrics instruments admission with prometheus metrics.
+type AdmissionMetrics struct {
+	step       *metricSet
+	controller *metricSet
+	webhook    *metricSet
+}
+
+// newAdmissionMetrics create a new AdmissionMetrics, configured with default metric names.
+func newAdmissionMetrics() *AdmissionMetrics {
+	// Admission metrics for a step of the admission flow. The entire admission flow is broken down into a series of steps
+	// Each step is identified by a distinct type label value.
+	step := newMetricSet("step",
+		[]string{"type", "operation", "group", "version", "resource", "subresource", "rejected"},
+		"Admission sub-step %s, broken out for each operation and API resource and step type (validate or admit).", true)
+
+	// Built-in admission controller metrics. Each admission controller is identified by name.
+	controller := newMetricSet("controller",
+		[]string{"name", "type", "operation", "group", "version", "resource", "subresource", "rejected"},
+		"Admission controller %s, identified by name and broken out for each operation and API resource and type (validate or admit).", false)
+
+	// Admission webhook metrics. Each webhook is identified by name.
+	webhook := newMetricSet("webhook",
+		[]string{"name", "type", "operation", "group", "version", "resource", "subresource", "rejected"},
+		"Admission webhook %s, identified by name and broken out for each operation and API resource and type (validate or admit).", false)
+
+	step.mustRegister()
+	controller.mustRegister()
+	webhook.mustRegister()
+	return &AdmissionMetrics{step: step, controller: controller, webhook: webhook}
+}
+
+func (m *AdmissionMetrics) reset() {
+	m.step.reset()
+	m.controller.reset()
+	m.webhook.reset()
+}
+
+// ObserveAdmissionStep records admission related metrics for a admission step, identified by step type.
+func (m *AdmissionMetrics) ObserveAdmissionStep(elapsed time.Duration, rejected bool, attr admission.Attributes, stepType string, extraLabels ...string) {
+	gvr := attr.GetResource()
+	m.step.observe(elapsed, append(extraLabels, stepType, string(attr.GetOperation()), gvr.Group, gvr.Version, gvr.Resource, attr.GetSubresource(), strconv.FormatBool(rejected))...)
+}
+
+// ObserveAdmissionController records admission related metrics for a built-in admission controller, identified by it's plugin handler name.
+func (m *AdmissionMetrics) ObserveAdmissionController(elapsed time.Duration, rejected bool, attr admission.Attributes, stepType string, extraLabels ...string) {
+	gvr := attr.GetResource()
+	m.controller.observe(elapsed, append(extraLabels, stepType, string(attr.GetOperation()), gvr.Group, gvr.Version, gvr.Resource, attr.GetSubresource(), strconv.FormatBool(rejected))...)
+}
+
+// ObserveWebhook records admission related metrics for a admission webhook.
+func (m *AdmissionMetrics) ObserveWebhook(elapsed time.Duration, rejected bool, attr admission.Attributes, stepType string, extraLabels ...string) {
+	gvr := attr.GetResource()
+	m.webhook.observe(elapsed, append(extraLabels, stepType, string(attr.GetOperation()), gvr.Group, gvr.Version, gvr.Resource, attr.GetSubresource(), strconv.FormatBool(rejected))...)
+}
+
+type metricSet struct {
+	latencies        *prometheus.HistogramVec
+	latenciesSummary *prometheus.SummaryVec
+}
+
+func newMetricSet(name string, labels []string, helpTemplate string, hasSummary bool) *metricSet {
+	var summary *prometheus.SummaryVec
+	if hasSummary {
+		summary = prometheus.NewSummaryVec(
+			prometheus.SummaryOpts{
+				Namespace: namespace,
+				Subsystem: subsystem,
+				Name:      fmt.Sprintf("%s_admission_latencies_seconds_summary", name),
+				Help:      fmt.Sprintf(helpTemplate, "latency summary"),
+				MaxAge:    latencySummaryMaxAge,
+			},
+			labels,
+		)
+	}
+
+	return &metricSet{
+		latencies: prometheus.NewHistogramVec(
+			prometheus.HistogramOpts{
+				Namespace: namespace,
+				Subsystem: subsystem,
+				Name:      fmt.Sprintf("%s_admission_latencies_seconds", name),
+				Help:      fmt.Sprintf(helpTemplate, "latency histogram"),
+				Buckets:   latencyBuckets,
+			},
+			labels,
+		),
+
+		latenciesSummary: summary,
+	}
+}
+
+// MustRegister registers all the prometheus metrics in the metricSet.
+func (m *metricSet) mustRegister() {
+	prometheus.MustRegister(m.latencies)
+	if m.latenciesSummary != nil {
+		prometheus.MustRegister(m.latenciesSummary)
+	}
+}
+
+// Reset resets all the prometheus metrics in the metricSet.
+func (m *metricSet) reset() {
+	m.latencies.Reset()
+	if m.latenciesSummary != nil {
+		m.latenciesSummary.Reset()
+	}
+}
+
+// Observe records an observed admission event to all metrics in the metricSet.
+func (m *metricSet) observe(elapsed time.Duration, labels ...string) {
+	elapsedMicroseconds := float64(elapsed / time.Microsecond)
+	m.latencies.WithLabelValues(labels...).Observe(elapsedMicroseconds)
+	if m.latenciesSummary != nil {
+		m.latenciesSummary.WithLabelValues(labels...).Observe(elapsedMicroseconds)
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/initialization/initialization.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/initialization/initialization.go
new file mode 100644
index 0000000..1bb59da
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/initialization/initialization.go
@@ -0,0 +1,368 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package initialization
+
+import (
+	"fmt"
+	"io"
+	"strings"
+
+	"github.com/golang/glog"
+
+	"k8s.io/api/admissionregistration/v1alpha1"
+	"k8s.io/api/core/v1"
+	"k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/api/meta"
+	"k8s.io/apimachinery/pkg/api/validation"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apimachinery/pkg/util/validation/field"
+	"k8s.io/apimachinery/pkg/util/wait"
+	"k8s.io/apiserver/pkg/admission"
+	"k8s.io/apiserver/pkg/admission/configuration"
+	"k8s.io/apiserver/pkg/authorization/authorizer"
+	"k8s.io/apiserver/pkg/features"
+	utilfeature "k8s.io/apiserver/pkg/util/feature"
+	clientset "k8s.io/client-go/kubernetes"
+)
+
+const (
+	// Name of admission plug-in
+	PluginName = "Initializers"
+)
+
+// Register registers a plugin
+func Register(plugins *admission.Plugins) {
+	plugins.Register(PluginName, func(config io.Reader) (admission.Interface, error) {
+		return NewInitializer(), nil
+	})
+}
+
+type initializerOptions struct {
+	Initializers []string
+}
+
+type InitializationConfig interface {
+	Run(stopCh <-chan struct{})
+	Initializers() (*v1alpha1.InitializerConfiguration, error)
+}
+
+type initializer struct {
+	config     InitializationConfig
+	authorizer authorizer.Authorizer
+}
+
+// NewInitializer creates a new initializer plugin which assigns newly created resources initializers
+// based on configuration loaded from the admission API group.
+// FUTURE: this may be moved to the storage layer of the apiserver, but for now this is an alpha feature
+//   that can be disabled.
+func NewInitializer() admission.Interface {
+	return &initializer{}
+}
+
+// ValidateInitialization implements the InitializationValidator interface.
+func (i *initializer) ValidateInitialization() error {
+	if i.config == nil {
+		return fmt.Errorf("the Initializer admission plugin requires a Kubernetes client to be provided")
+	}
+	if i.authorizer == nil {
+		return fmt.Errorf("the Initializer admission plugin requires an authorizer to be provided")
+	}
+
+	if !utilfeature.DefaultFeatureGate.Enabled(features.Initializers) {
+		if err := utilfeature.DefaultFeatureGate.Set(string(features.Initializers) + "=true"); err != nil {
+			glog.Errorf("error enabling Initializers feature as part of admission plugin setup: %v", err)
+		} else {
+			glog.Infof("enabled Initializers feature as part of admission plugin setup")
+		}
+	}
+
+	i.config.Run(wait.NeverStop)
+	return nil
+}
+
+// SetExternalKubeClientSet implements the WantsExternalKubeClientSet interface.
+func (i *initializer) SetExternalKubeClientSet(client clientset.Interface) {
+	i.config = configuration.NewInitializerConfigurationManager(client.AdmissionregistrationV1alpha1().InitializerConfigurations())
+}
+
+// SetAuthorizer implements the WantsAuthorizer interface.
+func (i *initializer) SetAuthorizer(a authorizer.Authorizer) {
+	i.authorizer = a
+}
+
+var initializerFieldPath = field.NewPath("metadata", "initializers")
+
+// readConfig holds requests instead of failing them if the server is not yet initialized
+// or is unresponsive. It formats the returned error for client use if necessary.
+func (i *initializer) readConfig(a admission.Attributes) (*v1alpha1.InitializerConfiguration, error) {
+	// read initializers from config
+	config, err := i.config.Initializers()
+	if err == nil {
+		return config, nil
+	}
+
+	// if initializer configuration is disabled, fail open
+	if err == configuration.ErrDisabled {
+		return &v1alpha1.InitializerConfiguration{}, nil
+	}
+
+	e := errors.NewServerTimeout(a.GetResource().GroupResource(), "create", 1)
+	if err == configuration.ErrNotReady {
+		e.ErrStatus.Message = fmt.Sprintf("Waiting for initialization configuration to load: %v", err)
+		e.ErrStatus.Reason = "LoadingConfiguration"
+		e.ErrStatus.Details.Causes = append(e.ErrStatus.Details.Causes, metav1.StatusCause{
+			Type:    "InitializerConfigurationPending",
+			Message: "The server is waiting for the initializer configuration to be loaded.",
+		})
+	} else {
+		e.ErrStatus.Message = fmt.Sprintf("Unable to refresh the initializer configuration: %v", err)
+		e.ErrStatus.Reason = "LoadingConfiguration"
+		e.ErrStatus.Details.Causes = append(e.ErrStatus.Details.Causes, metav1.StatusCause{
+			Type:    "InitializerConfigurationFailure",
+			Message: "An error has occurred while refreshing the initializer configuration, no resources can be created until a refresh succeeds.",
+		})
+	}
+	return nil, e
+}
+
+// Admit checks for create requests to add initializers, or update request to enforce invariants.
+// The admission controller fails open if the object doesn't have ObjectMeta (can't be initialized).
+// A client with sufficient permission ("initialize" verb on resource) can specify its own initializers
+// or an empty initializers struct (which bypasses initialization). Only clients with the initialize verb
+// can update objects that have not completed initialization. Sub resources can still be modified on
+// resources that are undergoing initialization.
+// TODO: once this logic is ready for beta, move it into the REST storage layer.
+func (i *initializer) Admit(a admission.Attributes) (err error) {
+	switch a.GetOperation() {
+	case admission.Create, admission.Update:
+	default:
+		return nil
+	}
+
+	// TODO: should sub-resource action should be denied until the object is initialized?
+	if len(a.GetSubresource()) > 0 {
+		return nil
+	}
+
+	switch a.GetOperation() {
+	case admission.Create:
+		accessor, err := meta.Accessor(a.GetObject())
+		if err != nil {
+			// objects without meta accessor cannot be checked for initialization, and it is possible to make calls
+			// via our API that don't have ObjectMeta
+			return nil
+		}
+		existing := accessor.GetInitializers()
+		if existing != nil {
+			glog.V(5).Infof("Admin bypassing initialization for %s", a.GetResource())
+
+			// it must be possible for some users to bypass initialization - for now, check the initialize operation
+			if err := i.canInitialize(a, "create with initializers denied"); err != nil {
+				return err
+			}
+			// allow administrators to bypass initialization by setting an empty initializers struct
+			if len(existing.Pending) == 0 && existing.Result == nil {
+				accessor.SetInitializers(nil)
+				return nil
+			}
+		} else {
+			glog.V(5).Infof("Checking initialization for %s", a.GetResource())
+
+			config, err := i.readConfig(a)
+			if err != nil {
+				return err
+			}
+
+			// Mirror pods are exempt from initialization because they are created and initialized
+			// on the Kubelet before they appear in the API.
+			// TODO: once this moves to REST storage layer, this becomes a pod specific concern
+			if a.GetKind().GroupKind() == v1.SchemeGroupVersion.WithKind("Pod").GroupKind() {
+				accessor, err := meta.Accessor(a.GetObject())
+				if err != nil {
+					return err
+				}
+				annotations := accessor.GetAnnotations()
+				if _, isMirror := annotations[v1.MirrorPodAnnotationKey]; isMirror {
+					return nil
+				}
+			}
+
+			names := findInitializers(config, a.GetResource())
+			if len(names) == 0 {
+				glog.V(5).Infof("No initializers needed")
+				return nil
+			}
+
+			glog.V(5).Infof("Found initializers for %s: %v", a.GetResource(), names)
+			accessor.SetInitializers(newInitializers(names))
+		}
+
+	case admission.Update:
+		accessor, err := meta.Accessor(a.GetObject())
+		if err != nil {
+			// objects without meta accessor cannot be checked for initialization, and it is possible to make calls
+			// via our API that don't have ObjectMeta
+			return nil
+		}
+		updated := accessor.GetInitializers()
+
+		// controllers deployed with an empty initializers.pending have their initializers set to nil
+		// but should be able to update without changing their manifest
+		if updated != nil && len(updated.Pending) == 0 && updated.Result == nil {
+			accessor.SetInitializers(nil)
+			updated = nil
+		}
+
+		existingAccessor, err := meta.Accessor(a.GetOldObject())
+		if err != nil {
+			// if the old object does not have an accessor, but the new one does, error out
+			return fmt.Errorf("initialized resources must be able to set initializers (%T): %v", a.GetOldObject(), err)
+		}
+		existing := existingAccessor.GetInitializers()
+
+		// updates on initialized resources are allowed
+		if updated == nil && existing == nil {
+			return nil
+		}
+
+		glog.V(5).Infof("Modifying uninitialized resource %s", a.GetResource())
+
+		// because we are called before validation, we need to ensure the update transition is valid.
+		if errs := validation.ValidateInitializersUpdate(updated, existing, initializerFieldPath); len(errs) > 0 {
+			return errors.NewInvalid(a.GetKind().GroupKind(), a.GetName(), errs)
+		}
+
+		// caller must have the ability to mutate un-initialized resources
+		if err := i.canInitialize(a, "update to uninitialized resource denied"); err != nil {
+			return err
+		}
+
+		// TODO: restrict initialization list changes to specific clients?
+	}
+
+	return nil
+}
+
+func (i *initializer) canInitialize(a admission.Attributes, message string) error {
+	// caller must have the ability to mutate un-initialized resources
+	decision, reason, err := i.authorizer.Authorize(authorizer.AttributesRecord{
+		Name:            a.GetName(),
+		ResourceRequest: true,
+		User:            a.GetUserInfo(),
+		Verb:            "initialize",
+		Namespace:       a.GetNamespace(),
+		APIGroup:        a.GetResource().Group,
+		APIVersion:      a.GetResource().Version,
+		Resource:        a.GetResource().Resource,
+	})
+	if err != nil {
+		return err
+	}
+	if decision != authorizer.DecisionAllow {
+		return errors.NewForbidden(a.GetResource().GroupResource(), a.GetName(), fmt.Errorf("%s: %s", message, reason))
+	}
+	return nil
+}
+
+// Handles returns true if this admission controller can handle the given operation
+// where operation can be one of CREATE, UPDATE, DELETE, or CONNECT
+func (i *initializer) Handles(op admission.Operation) bool {
+	return op == admission.Create || op == admission.Update
+}
+
+// newInitializers populates an Initializers struct.
+func newInitializers(names []string) *metav1.Initializers {
+	if len(names) == 0 {
+		return nil
+	}
+	var init []metav1.Initializer
+	for _, name := range names {
+		init = append(init, metav1.Initializer{Name: name})
+	}
+	return &metav1.Initializers{
+		Pending: init,
+	}
+}
+
+// findInitializers returns the list of initializer names that apply to a config. It returns an empty list
+// if no initializers apply.
+func findInitializers(initializers *v1alpha1.InitializerConfiguration, gvr schema.GroupVersionResource) []string {
+	var names []string
+	for _, init := range initializers.Initializers {
+		if !matchRule(init.Rules, gvr) {
+			continue
+		}
+		names = append(names, init.Name)
+	}
+	return names
+}
+
+// matchRule returns true if any rule matches the provided group version resource.
+func matchRule(rules []v1alpha1.Rule, gvr schema.GroupVersionResource) bool {
+	for _, rule := range rules {
+		if !hasGroup(rule.APIGroups, gvr.Group) {
+			return false
+		}
+		if !hasVersion(rule.APIVersions, gvr.Version) {
+			return false
+		}
+		if !hasResource(rule.Resources, gvr.Resource) {
+			return false
+		}
+	}
+	return len(rules) > 0
+}
+
+func hasGroup(groups []string, group string) bool {
+	if groups[0] == "*" {
+		return true
+	}
+	for _, g := range groups {
+		if g == group {
+			return true
+		}
+	}
+	return false
+}
+
+func hasVersion(versions []string, version string) bool {
+	if versions[0] == "*" {
+		return true
+	}
+	for _, v := range versions {
+		if v == version {
+			return true
+		}
+	}
+	return false
+}
+
+func hasResource(resources []string, resource string) bool {
+	if resources[0] == "*" || resources[0] == "*/*" {
+		return true
+	}
+	for _, r := range resources {
+		if strings.Contains(r, "/") {
+			continue
+		}
+		if r == resource {
+			return true
+		}
+	}
+	return false
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle/admission.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle/admission.go
new file mode 100644
index 0000000..81c24f6
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle/admission.go
@@ -0,0 +1,223 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+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.
+*/
+
+package lifecycle
+
+import (
+	"fmt"
+	"io"
+	"time"
+
+	"github.com/golang/glog"
+
+	"k8s.io/api/core/v1"
+	"k8s.io/apimachinery/pkg/api/errors"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	utilcache "k8s.io/apimachinery/pkg/util/cache"
+	"k8s.io/apimachinery/pkg/util/clock"
+	"k8s.io/apimachinery/pkg/util/sets"
+	"k8s.io/apiserver/pkg/admission"
+	"k8s.io/apiserver/pkg/admission/initializer"
+	"k8s.io/client-go/informers"
+	"k8s.io/client-go/kubernetes"
+	corelisters "k8s.io/client-go/listers/core/v1"
+)
+
+const (
+	// Name of admission plug-in
+	PluginName = "NamespaceLifecycle"
+	// how long a namespace stays in the force live lookup cache before expiration.
+	forceLiveLookupTTL = 30 * time.Second
+	// how long to wait for a missing namespace before re-checking the cache (and then doing a live lookup)
+	// this accomplishes two things:
+	// 1. It allows a watch-fed cache time to observe a namespace creation event
+	// 2. It allows time for a namespace creation to distribute to members of a storage cluster,
+	//    so the live lookup has a better chance of succeeding even if it isn't performed against the leader.
+	missingNamespaceWait = 50 * time.Millisecond
+)
+
+// Register registers a plugin
+func Register(plugins *admission.Plugins) {
+	plugins.Register(PluginName, func(config io.Reader) (admission.Interface, error) {
+		return NewLifecycle(sets.NewString(metav1.NamespaceDefault, metav1.NamespaceSystem, metav1.NamespacePublic))
+	})
+}
+
+// Lifecycle is an implementation of admission.Interface.
+// It enforces life-cycle constraints around a Namespace depending on its Phase
+type Lifecycle struct {
+	*admission.Handler
+	client             kubernetes.Interface
+	immortalNamespaces sets.String
+	namespaceLister    corelisters.NamespaceLister
+	// forceLiveLookupCache holds a list of entries for namespaces that we have a strong reason to believe are stale in our local cache.
+	// if a namespace is in this cache, then we will ignore our local state and always fetch latest from api server.
+	forceLiveLookupCache *utilcache.LRUExpireCache
+}
+
+var _ = initializer.WantsExternalKubeInformerFactory(&Lifecycle{})
+var _ = initializer.WantsExternalKubeClientSet(&Lifecycle{})
+
+func (l *Lifecycle) Admit(a admission.Attributes) error {
+	// prevent deletion of immortal namespaces
+	if a.GetOperation() == admission.Delete && a.GetKind().GroupKind() == v1.SchemeGroupVersion.WithKind("Namespace").GroupKind() && l.immortalNamespaces.Has(a.GetName()) {
+		return errors.NewForbidden(a.GetResource().GroupResource(), a.GetName(), fmt.Errorf("this namespace may not be deleted"))
+	}
+
+	// always allow non-namespaced resources
+	if len(a.GetNamespace()) == 0 && a.GetKind().GroupKind() != v1.SchemeGroupVersion.WithKind("Namespace").GroupKind() {
+		return nil
+	}
+
+	if a.GetKind().GroupKind() == v1.SchemeGroupVersion.WithKind("Namespace").GroupKind() {
+		// if a namespace is deleted, we want to prevent all further creates into it
+		// while it is undergoing termination.  to reduce incidences where the cache
+		// is slow to update, we add the namespace into a force live lookup list to ensure
+		// we are not looking at stale state.
+		if a.GetOperation() == admission.Delete {
+			l.forceLiveLookupCache.Add(a.GetName(), true, forceLiveLookupTTL)
+		}
+		// allow all operations to namespaces
+		return nil
+	}
+
+	// always allow deletion of other resources
+	if a.GetOperation() == admission.Delete {
+		return nil
+	}
+
+	// always allow access review checks.  Returning status about the namespace would be leaking information
+	if isAccessReview(a) {
+		return nil
+	}
+
+	// we need to wait for our caches to warm
+	if !l.WaitForReady() {
+		return admission.NewForbidden(a, fmt.Errorf("not yet ready to handle request"))
+	}
+
+	var (
+		exists bool
+		err    error
+	)
+
+	namespace, err := l.namespaceLister.Get(a.GetNamespace())
+	if err != nil {
+		if !errors.IsNotFound(err) {
+			return errors.NewInternalError(err)
+		}
+	} else {
+		exists = true
+	}
+
+	if !exists && a.GetOperation() == admission.Create {
+		// give the cache time to observe the namespace before rejecting a create.
+		// this helps when creating a namespace and immediately creating objects within it.
+		time.Sleep(missingNamespaceWait)
+		namespace, err = l.namespaceLister.Get(a.GetNamespace())
+		switch {
+		case errors.IsNotFound(err):
+			// no-op
+		case err != nil:
+			return errors.NewInternalError(err)
+		default:
+			exists = true
+		}
+		if exists {
+			glog.V(4).Infof("found %s in cache after waiting", a.GetNamespace())
+		}
+	}
+
+	// forceLiveLookup if true will skip looking at local cache state and instead always make a live call to server.
+	forceLiveLookup := false
+	if _, ok := l.forceLiveLookupCache.Get(a.GetNamespace()); ok {
+		// we think the namespace was marked for deletion, but our current local cache says otherwise, we will force a live lookup.
+		forceLiveLookup = exists && namespace.Status.Phase == v1.NamespaceActive
+	}
+
+	// refuse to operate on non-existent namespaces
+	if !exists || forceLiveLookup {
+		// as a last resort, make a call directly to storage
+		namespace, err = l.client.CoreV1().Namespaces().Get(a.GetNamespace(), metav1.GetOptions{})
+		switch {
+		case errors.IsNotFound(err):
+			return err
+		case err != nil:
+			return errors.NewInternalError(err)
+		}
+		glog.V(4).Infof("found %s via storage lookup", a.GetNamespace())
+	}
+
+	// ensure that we're not trying to create objects in terminating namespaces
+	if a.GetOperation() == admission.Create {
+		if namespace.Status.Phase != v1.NamespaceTerminating {
+			return nil
+		}
+
+		// TODO: This should probably not be a 403
+		return admission.NewForbidden(a, fmt.Errorf("unable to create new content in namespace %s because it is being terminated", a.GetNamespace()))
+	}
+
+	return nil
+}
+
+// NewLifecycle creates a new namespace Lifecycle admission control handler
+func NewLifecycle(immortalNamespaces sets.String) (*Lifecycle, error) {
+	return newLifecycleWithClock(immortalNamespaces, clock.RealClock{})
+}
+
+func newLifecycleWithClock(immortalNamespaces sets.String, clock utilcache.Clock) (*Lifecycle, error) {
+	forceLiveLookupCache := utilcache.NewLRUExpireCacheWithClock(100, clock)
+	return &Lifecycle{
+		Handler:              admission.NewHandler(admission.Create, admission.Update, admission.Delete),
+		immortalNamespaces:   immortalNamespaces,
+		forceLiveLookupCache: forceLiveLookupCache,
+	}, nil
+}
+
+// SetExternalKubeInformerFactory implements the WantsExternalKubeInformerFactory interface.
+func (l *Lifecycle) SetExternalKubeInformerFactory(f informers.SharedInformerFactory) {
+	namespaceInformer := f.Core().V1().Namespaces()
+	l.namespaceLister = namespaceInformer.Lister()
+	l.SetReadyFunc(namespaceInformer.Informer().HasSynced)
+}
+
+// SetExternalKubeClientSet implements the WantsExternalKubeClientSet interface.
+func (l *Lifecycle) SetExternalKubeClientSet(client kubernetes.Interface) {
+	l.client = client
+}
+
+// ValidateInitialization implements the InitializationValidator interface.
+func (l *Lifecycle) ValidateInitialization() error {
+	if l.namespaceLister == nil {
+		return fmt.Errorf("missing namespaceLister")
+	}
+	if l.client == nil {
+		return fmt.Errorf("missing client")
+	}
+	return nil
+}
+
+// accessReviewResources are resources which give a view into permissions in a namespace.  Users must be allowed to create these
+// resources because returning "not found" errors allows someone to search for the "people I'm going to fire in 2017" namespace.
+var accessReviewResources = map[schema.GroupResource]bool{
+	{Group: "authorization.k8s.io", Resource: "localsubjectaccessreviews"}: true,
+}
+
+func isAccessReview(a admission.Attributes) bool {
+	return accessReviewResources[a.GetResource().GroupResource()]
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/doc.go
new file mode 100644
index 0000000..63ab310
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/doc.go
@@ -0,0 +1,19 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+// +k8s:deepcopy-gen=package
+
+package webhookadmission
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/register.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/register.go
new file mode 100644
index 0000000..c958d15
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/register.go
@@ -0,0 +1,51 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package webhookadmission
+
+import (
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+)
+
+var (
+	SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)
+	AddToScheme   = SchemeBuilder.AddToScheme
+)
+
+// GroupName is the group name use in this package
+const GroupName = "apiserver.config.k8s.io"
+
+// SchemeGroupVersion is group version used to register these objects
+var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: runtime.APIVersionInternal}
+
+// Kind takes an unqualified kind and returns a Group qualified GroupKind
+func Kind(kind string) schema.GroupKind {
+	return SchemeGroupVersion.WithKind(kind).GroupKind()
+}
+
+// Resource takes an unqualified resource and returns a Group qualified GroupResource
+func Resource(resource string) schema.GroupResource {
+	return SchemeGroupVersion.WithResource(resource).GroupResource()
+}
+
+func addKnownTypes(scheme *runtime.Scheme) error {
+	// TODO this will get cleaned up with the scheme types are fixed
+	scheme.AddKnownTypes(SchemeGroupVersion,
+		&WebhookAdmission{},
+	)
+	return nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/types.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/types.go
new file mode 100644
index 0000000..71ce47b
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/types.go
@@ -0,0 +1,29 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package webhookadmission
+
+import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// WebhookAdmission provides configuration for the webhook admission controller.
+type WebhookAdmission struct {
+	metav1.TypeMeta
+
+	// KubeConfigFile is the path to the kubeconfig file.
+	KubeConfigFile string
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1alpha1/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1alpha1/doc.go
new file mode 100644
index 0000000..04c376f
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1alpha1/doc.go
@@ -0,0 +1,23 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+// +k8s:deepcopy-gen=package
+// +k8s:conversion-gen=k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission
+// +k8s:defaulter-gen=TypeMeta
+
+// Package v1alpha1 is the v1alpha1 version of the API.
+// +groupName=apiserver.config.k8s.io
+package v1alpha1
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1alpha1/register.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1alpha1/register.go
new file mode 100644
index 0000000..56489f7
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1alpha1/register.go
@@ -0,0 +1,50 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package v1alpha1
+
+import (
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+)
+
+// GroupName is the group name use in this package
+const GroupName = "apiserver.config.k8s.io"
+
+// SchemeGroupVersion is group version used to register these objects
+var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1alpha1"}
+
+var (
+	// TODO: move SchemeBuilder with zz_generated.deepcopy.go to k8s.io/api.
+	// localSchemeBuilder and AddToScheme will stay in k8s.io/kubernetes.
+	SchemeBuilder      runtime.SchemeBuilder
+	localSchemeBuilder = &SchemeBuilder
+	AddToScheme        = localSchemeBuilder.AddToScheme
+)
+
+func init() {
+	// We only register manually written functions here. The registration of the
+	// generated functions takes place in the generated files. The separation
+	// makes the code compile even when the generated files are missing.
+	localSchemeBuilder.Register(addKnownTypes)
+}
+
+func addKnownTypes(scheme *runtime.Scheme) error {
+	scheme.AddKnownTypes(SchemeGroupVersion,
+		&WebhookAdmission{},
+	)
+	return nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1alpha1/types.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1alpha1/types.go
new file mode 100644
index 0000000..a49a6a8
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1alpha1/types.go
@@ -0,0 +1,29 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package v1alpha1
+
+import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// WebhookAdmission provides configuration for the webhook admission controller.
+type WebhookAdmission struct {
+	metav1.TypeMeta `json:",inline"`
+
+	// KubeConfigFile is the path to the kubeconfig file.
+	KubeConfigFile string `json:"kubeConfigFile"`
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1alpha1/zz_generated.conversion.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1alpha1/zz_generated.conversion.go
new file mode 100644
index 0000000..3fb2e24
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1alpha1/zz_generated.conversion.go
@@ -0,0 +1,60 @@
+// +build !ignore_autogenerated
+
+/*
+Copyright The Kubernetes Authors.
+
+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.
+*/
+
+// Code generated by conversion-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	conversion "k8s.io/apimachinery/pkg/conversion"
+	runtime "k8s.io/apimachinery/pkg/runtime"
+	webhookadmission "k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission"
+)
+
+func init() {
+	localSchemeBuilder.Register(RegisterConversions)
+}
+
+// RegisterConversions adds conversion functions to the given scheme.
+// Public to allow building arbitrary schemes.
+func RegisterConversions(scheme *runtime.Scheme) error {
+	return scheme.AddGeneratedConversionFuncs(
+		Convert_v1alpha1_WebhookAdmission_To_webhookadmission_WebhookAdmission,
+		Convert_webhookadmission_WebhookAdmission_To_v1alpha1_WebhookAdmission,
+	)
+}
+
+func autoConvert_v1alpha1_WebhookAdmission_To_webhookadmission_WebhookAdmission(in *WebhookAdmission, out *webhookadmission.WebhookAdmission, s conversion.Scope) error {
+	out.KubeConfigFile = in.KubeConfigFile
+	return nil
+}
+
+// Convert_v1alpha1_WebhookAdmission_To_webhookadmission_WebhookAdmission is an autogenerated conversion function.
+func Convert_v1alpha1_WebhookAdmission_To_webhookadmission_WebhookAdmission(in *WebhookAdmission, out *webhookadmission.WebhookAdmission, s conversion.Scope) error {
+	return autoConvert_v1alpha1_WebhookAdmission_To_webhookadmission_WebhookAdmission(in, out, s)
+}
+
+func autoConvert_webhookadmission_WebhookAdmission_To_v1alpha1_WebhookAdmission(in *webhookadmission.WebhookAdmission, out *WebhookAdmission, s conversion.Scope) error {
+	out.KubeConfigFile = in.KubeConfigFile
+	return nil
+}
+
+// Convert_webhookadmission_WebhookAdmission_To_v1alpha1_WebhookAdmission is an autogenerated conversion function.
+func Convert_webhookadmission_WebhookAdmission_To_v1alpha1_WebhookAdmission(in *webhookadmission.WebhookAdmission, out *WebhookAdmission, s conversion.Scope) error {
+	return autoConvert_webhookadmission_WebhookAdmission_To_v1alpha1_WebhookAdmission(in, out, s)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1alpha1/zz_generated.deepcopy.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1alpha1/zz_generated.deepcopy.go
new file mode 100644
index 0000000..a59d62d
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1alpha1/zz_generated.deepcopy.go
@@ -0,0 +1,50 @@
+// +build !ignore_autogenerated
+
+/*
+Copyright The Kubernetes Authors.
+
+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.
+*/
+
+// Code generated by deepcopy-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	runtime "k8s.io/apimachinery/pkg/runtime"
+)
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *WebhookAdmission) DeepCopyInto(out *WebhookAdmission) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WebhookAdmission.
+func (in *WebhookAdmission) DeepCopy() *WebhookAdmission {
+	if in == nil {
+		return nil
+	}
+	out := new(WebhookAdmission)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *WebhookAdmission) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1alpha1/zz_generated.defaults.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1alpha1/zz_generated.defaults.go
new file mode 100644
index 0000000..dd621a3
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1alpha1/zz_generated.defaults.go
@@ -0,0 +1,32 @@
+// +build !ignore_autogenerated
+
+/*
+Copyright The Kubernetes Authors.
+
+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.
+*/
+
+// Code generated by defaulter-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	runtime "k8s.io/apimachinery/pkg/runtime"
+)
+
+// RegisterDefaults adds defaulters functions to the given scheme.
+// Public to allow building arbitrary schemes.
+// All generated defaulters are covering - they call all nested defaulters.
+func RegisterDefaults(scheme *runtime.Scheme) error {
+	return nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/zz_generated.deepcopy.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/zz_generated.deepcopy.go
new file mode 100644
index 0000000..90b7e0a
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/zz_generated.deepcopy.go
@@ -0,0 +1,50 @@
+// +build !ignore_autogenerated
+
+/*
+Copyright The Kubernetes Authors.
+
+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.
+*/
+
+// Code generated by deepcopy-gen. DO NOT EDIT.
+
+package webhookadmission
+
+import (
+	runtime "k8s.io/apimachinery/pkg/runtime"
+)
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *WebhookAdmission) DeepCopyInto(out *WebhookAdmission) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WebhookAdmission.
+func (in *WebhookAdmission) DeepCopy() *WebhookAdmission {
+	if in == nil {
+		return nil
+	}
+	out := new(WebhookAdmission)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *WebhookAdmission) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/authentication.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/authentication.go
new file mode 100644
index 0000000..9b70c97
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/authentication.go
@@ -0,0 +1,175 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package config
+
+import (
+	"fmt"
+	"io/ioutil"
+	"strings"
+	"time"
+
+	"k8s.io/client-go/rest"
+	"k8s.io/client-go/tools/clientcmd"
+	clientcmdapi "k8s.io/client-go/tools/clientcmd/api"
+)
+
+// AuthenticationInfoResolverWrapper can be used to inject Dial function to the
+// rest.Config generated by the resolver.
+type AuthenticationInfoResolverWrapper func(AuthenticationInfoResolver) AuthenticationInfoResolver
+
+// AuthenticationInfoResolver builds rest.Config base on the server or service
+// name and service namespace.
+type AuthenticationInfoResolver interface {
+	// ClientConfigFor builds rest.Config based on the server.
+	ClientConfigFor(server string) (*rest.Config, error)
+	// ClientConfigForService builds rest.Config based on the serviceName and
+	// serviceNamespace.
+	ClientConfigForService(serviceName, serviceNamespace string) (*rest.Config, error)
+}
+
+// AuthenticationInfoResolverDelegator implements AuthenticationInfoResolver.
+type AuthenticationInfoResolverDelegator struct {
+	ClientConfigForFunc        func(server string) (*rest.Config, error)
+	ClientConfigForServiceFunc func(serviceName, serviceNamespace string) (*rest.Config, error)
+}
+
+func (a *AuthenticationInfoResolverDelegator) ClientConfigFor(server string) (*rest.Config, error) {
+	return a.ClientConfigForFunc(server)
+}
+
+func (a *AuthenticationInfoResolverDelegator) ClientConfigForService(serviceName, serviceNamespace string) (*rest.Config, error) {
+	return a.ClientConfigForServiceFunc(serviceName, serviceNamespace)
+}
+
+type defaultAuthenticationInfoResolver struct {
+	kubeconfig clientcmdapi.Config
+}
+
+// NewDefaultAuthenticationInfoResolver generates an AuthenticationInfoResolver
+// that builds rest.Config based on the kubeconfig file. kubeconfigFile is the
+// path to the kubeconfig.
+func NewDefaultAuthenticationInfoResolver(kubeconfigFile string) (AuthenticationInfoResolver, error) {
+	if len(kubeconfigFile) == 0 {
+		return &defaultAuthenticationInfoResolver{}, nil
+	}
+
+	loadingRules := clientcmd.NewDefaultClientConfigLoadingRules()
+	loadingRules.ExplicitPath = kubeconfigFile
+	loader := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, &clientcmd.ConfigOverrides{})
+	clientConfig, err := loader.RawConfig()
+	if err != nil {
+		return nil, err
+	}
+
+	return &defaultAuthenticationInfoResolver{kubeconfig: clientConfig}, nil
+}
+
+func (c *defaultAuthenticationInfoResolver) ClientConfigFor(server string) (*rest.Config, error) {
+	return c.clientConfig(server)
+}
+
+func (c *defaultAuthenticationInfoResolver) ClientConfigForService(serviceName, serviceNamespace string) (*rest.Config, error) {
+	return c.clientConfig(serviceName + "." + serviceNamespace + ".svc")
+}
+
+func (c *defaultAuthenticationInfoResolver) clientConfig(target string) (*rest.Config, error) {
+	// exact match
+	if authConfig, ok := c.kubeconfig.AuthInfos[target]; ok {
+		return restConfigFromKubeconfig(authConfig)
+	}
+
+	// star prefixed match
+	serverSteps := strings.Split(target, ".")
+	for i := 1; i < len(serverSteps); i++ {
+		nickName := "*." + strings.Join(serverSteps[i:], ".")
+		if authConfig, ok := c.kubeconfig.AuthInfos[nickName]; ok {
+			return restConfigFromKubeconfig(authConfig)
+		}
+	}
+
+	// if we're trying to hit the kube-apiserver and there wasn't an explicit config, use the in-cluster config
+	if target == "kubernetes.default.svc" {
+		// if we can find an in-cluster-config use that.  If we can't, fall through.
+		inClusterConfig, err := rest.InClusterConfig()
+		if err == nil {
+			return setGlobalDefaults(inClusterConfig), nil
+		}
+	}
+
+	// star (default) match
+	if authConfig, ok := c.kubeconfig.AuthInfos["*"]; ok {
+		return restConfigFromKubeconfig(authConfig)
+	}
+
+	// use the current context from the kubeconfig if possible
+	if len(c.kubeconfig.CurrentContext) > 0 {
+		if currContext, ok := c.kubeconfig.Contexts[c.kubeconfig.CurrentContext]; ok {
+			if len(currContext.AuthInfo) > 0 {
+				if currAuth, ok := c.kubeconfig.AuthInfos[currContext.AuthInfo]; ok {
+					return restConfigFromKubeconfig(currAuth)
+				}
+			}
+		}
+	}
+
+	// anonymous
+	return setGlobalDefaults(&rest.Config{}), nil
+}
+
+func restConfigFromKubeconfig(configAuthInfo *clientcmdapi.AuthInfo) (*rest.Config, error) {
+	config := &rest.Config{}
+
+	// blindly overwrite existing values based on precedence
+	if len(configAuthInfo.Token) > 0 {
+		config.BearerToken = configAuthInfo.Token
+	} else if len(configAuthInfo.TokenFile) > 0 {
+		tokenBytes, err := ioutil.ReadFile(configAuthInfo.TokenFile)
+		if err != nil {
+			return nil, err
+		}
+		config.BearerToken = string(tokenBytes)
+	}
+	if len(configAuthInfo.Impersonate) > 0 {
+		config.Impersonate = rest.ImpersonationConfig{
+			UserName: configAuthInfo.Impersonate,
+			Groups:   configAuthInfo.ImpersonateGroups,
+			Extra:    configAuthInfo.ImpersonateUserExtra,
+		}
+	}
+	if len(configAuthInfo.ClientCertificate) > 0 || len(configAuthInfo.ClientCertificateData) > 0 {
+		config.CertFile = configAuthInfo.ClientCertificate
+		config.CertData = configAuthInfo.ClientCertificateData
+		config.KeyFile = configAuthInfo.ClientKey
+		config.KeyData = configAuthInfo.ClientKeyData
+	}
+	if len(configAuthInfo.Username) > 0 || len(configAuthInfo.Password) > 0 {
+		config.Username = configAuthInfo.Username
+		config.Password = configAuthInfo.Password
+	}
+	if configAuthInfo.AuthProvider != nil {
+		return nil, fmt.Errorf("auth provider not supported")
+	}
+
+	return setGlobalDefaults(config), nil
+}
+
+func setGlobalDefaults(config *rest.Config) *rest.Config {
+	config.UserAgent = "kube-apiserver-admission"
+	config.Timeout = 30 * time.Second
+
+	return config
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/client.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/client.go
new file mode 100644
index 0000000..d520fd0
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/client.go
@@ -0,0 +1,187 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package config
+
+import (
+	"context"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"net"
+	"net/url"
+
+	lru "github.com/hashicorp/golang-lru"
+	admissionv1beta1 "k8s.io/api/admission/v1beta1"
+	"k8s.io/api/admissionregistration/v1beta1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/serializer"
+	utilerrors "k8s.io/apimachinery/pkg/util/errors"
+	webhookerrors "k8s.io/apiserver/pkg/admission/plugin/webhook/errors"
+	"k8s.io/client-go/rest"
+)
+
+const (
+	defaultCacheSize = 200
+)
+
+var (
+	ErrNeedServiceOrURL = errors.New("webhook configuration must have either service or URL")
+)
+
+// ClientManager builds REST clients to talk to webhooks. It caches the clients
+// to avoid duplicate creation.
+type ClientManager struct {
+	authInfoResolver     AuthenticationInfoResolver
+	serviceResolver      ServiceResolver
+	negotiatedSerializer runtime.NegotiatedSerializer
+	cache                *lru.Cache
+}
+
+// NewClientManager creates a clientManager.
+func NewClientManager() (ClientManager, error) {
+	cache, err := lru.New(defaultCacheSize)
+	if err != nil {
+		return ClientManager{}, err
+	}
+	admissionScheme := runtime.NewScheme()
+	admissionv1beta1.AddToScheme(admissionScheme)
+	return ClientManager{
+		cache: cache,
+		negotiatedSerializer: serializer.NegotiatedSerializerWrapper(runtime.SerializerInfo{
+			Serializer: serializer.NewCodecFactory(admissionScheme).LegacyCodec(admissionv1beta1.SchemeGroupVersion),
+		}),
+	}, nil
+}
+
+// SetAuthenticationInfoResolverWrapper sets the
+// AuthenticationInfoResolverWrapper.
+func (cm *ClientManager) SetAuthenticationInfoResolverWrapper(wrapper AuthenticationInfoResolverWrapper) {
+	if wrapper != nil {
+		cm.authInfoResolver = wrapper(cm.authInfoResolver)
+	}
+}
+
+// SetAuthenticationInfoResolver sets the AuthenticationInfoResolver.
+func (cm *ClientManager) SetAuthenticationInfoResolver(resolver AuthenticationInfoResolver) {
+	cm.authInfoResolver = resolver
+}
+
+// SetServiceResolver sets the ServiceResolver.
+func (cm *ClientManager) SetServiceResolver(sr ServiceResolver) {
+	if sr != nil {
+		cm.serviceResolver = sr
+	}
+}
+
+// Validate checks if ClientManager is properly set up.
+func (cm *ClientManager) Validate() error {
+	var errs []error
+	if cm.negotiatedSerializer == nil {
+		errs = append(errs, fmt.Errorf("the clientManager requires a negotiatedSerializer"))
+	}
+	if cm.serviceResolver == nil {
+		errs = append(errs, fmt.Errorf("the clientManager requires a serviceResolver"))
+	}
+	if cm.authInfoResolver == nil {
+		errs = append(errs, fmt.Errorf("the clientManager requires an authInfoResolver"))
+	}
+	return utilerrors.NewAggregate(errs)
+}
+
+// HookClient get a RESTClient from the cache, or constructs one based on the
+// webhook configuration.
+func (cm *ClientManager) HookClient(h *v1beta1.Webhook) (*rest.RESTClient, error) {
+	cacheKey, err := json.Marshal(h.ClientConfig)
+	if err != nil {
+		return nil, err
+	}
+	if client, ok := cm.cache.Get(string(cacheKey)); ok {
+		return client.(*rest.RESTClient), nil
+	}
+
+	complete := func(cfg *rest.Config) (*rest.RESTClient, error) {
+		// Combine CAData from the config with any existing CA bundle provided
+		if len(cfg.TLSClientConfig.CAData) > 0 {
+			cfg.TLSClientConfig.CAData = append(cfg.TLSClientConfig.CAData, '\n')
+		}
+		cfg.TLSClientConfig.CAData = append(cfg.TLSClientConfig.CAData, h.ClientConfig.CABundle...)
+
+		cfg.ContentConfig.NegotiatedSerializer = cm.negotiatedSerializer
+		cfg.ContentConfig.ContentType = runtime.ContentTypeJSON
+		client, err := rest.UnversionedRESTClientFor(cfg)
+		if err == nil {
+			cm.cache.Add(string(cacheKey), client)
+		}
+		return client, err
+	}
+
+	if svc := h.ClientConfig.Service; svc != nil {
+		restConfig, err := cm.authInfoResolver.ClientConfigForService(svc.Name, svc.Namespace)
+		if err != nil {
+			return nil, err
+		}
+		cfg := rest.CopyConfig(restConfig)
+		serverName := svc.Name + "." + svc.Namespace + ".svc"
+		host := serverName + ":443"
+		cfg.Host = "https://" + host
+		if svc.Path != nil {
+			cfg.APIPath = *svc.Path
+		}
+		// Set the server name if not already set
+		if len(cfg.TLSClientConfig.ServerName) == 0 {
+			cfg.TLSClientConfig.ServerName = serverName
+		}
+
+		delegateDialer := cfg.Dial
+		if delegateDialer == nil {
+			var d net.Dialer
+			delegateDialer = d.DialContext
+		}
+		cfg.Dial = func(ctx context.Context, network, addr string) (net.Conn, error) {
+			if addr == host {
+				u, err := cm.serviceResolver.ResolveEndpoint(svc.Namespace, svc.Name)
+				if err != nil {
+					return nil, err
+				}
+				addr = u.Host
+			}
+			return delegateDialer(ctx, network, addr)
+		}
+
+		return complete(cfg)
+	}
+
+	if h.ClientConfig.URL == nil {
+		return nil, &webhookerrors.ErrCallingWebhook{WebhookName: h.Name, Reason: ErrNeedServiceOrURL}
+	}
+
+	u, err := url.Parse(*h.ClientConfig.URL)
+	if err != nil {
+		return nil, &webhookerrors.ErrCallingWebhook{WebhookName: h.Name, Reason: fmt.Errorf("Unparsable URL: %v", err)}
+	}
+
+	restConfig, err := cm.authInfoResolver.ClientConfigFor(u.Host)
+	if err != nil {
+		return nil, err
+	}
+
+	cfg := rest.CopyConfig(restConfig)
+	cfg.Host = u.Scheme + "://" + u.Host
+	cfg.APIPath = u.Path
+
+	return complete(cfg)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/kubeconfig.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/kubeconfig.go
new file mode 100644
index 0000000..7cf0d31
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/kubeconfig.go
@@ -0,0 +1,68 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package config
+
+import (
+	"fmt"
+	"io"
+	"io/ioutil"
+	"path"
+
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/serializer"
+	"k8s.io/apimachinery/pkg/util/validation/field"
+	"k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission"
+	"k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1alpha1"
+)
+
+var (
+	scheme = runtime.NewScheme()
+	codecs = serializer.NewCodecFactory(scheme)
+)
+
+func init() {
+	webhookadmission.AddToScheme(scheme)
+	v1alpha1.AddToScheme(scheme)
+}
+
+// LoadConfig extract the KubeConfigFile from configFile
+func LoadConfig(configFile io.Reader) (string, error) {
+	var kubeconfigFile string
+	if configFile != nil {
+		// we have a config so parse it.
+		data, err := ioutil.ReadAll(configFile)
+		if err != nil {
+			return "", err
+		}
+		decoder := codecs.UniversalDecoder()
+		decodedObj, err := runtime.Decode(decoder, data)
+		if err != nil {
+			return "", err
+		}
+		config, ok := decodedObj.(*webhookadmission.WebhookAdmission)
+		if !ok {
+			return "", fmt.Errorf("unexpected type: %T", decodedObj)
+		}
+
+		if !path.IsAbs(config.KubeConfigFile) {
+			return "", field.Invalid(field.NewPath("kubeConfigFile"), config.KubeConfigFile, "must be an absolute file path")
+		}
+
+		kubeconfigFile = config.KubeConfigFile
+	}
+	return kubeconfigFile, nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/serviceresolver.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/serviceresolver.go
new file mode 100644
index 0000000..47b96a7
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/config/serviceresolver.go
@@ -0,0 +1,45 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package config
+
+import (
+	"errors"
+	"fmt"
+	"net/url"
+)
+
+// ServiceResolver knows how to convert a service reference into an actual location.
+type ServiceResolver interface {
+	ResolveEndpoint(namespace, name string) (*url.URL, error)
+}
+
+type defaultServiceResolver struct{}
+
+func NewDefaultServiceResolver() ServiceResolver {
+	return &defaultServiceResolver{}
+}
+
+// ResolveEndpoint constructs a service URL from a given namespace and name
+// note that the name and namespace are required and by default all created addresses use HTTPS scheme.
+// for example:
+//  name=ross namespace=andromeda resolves to https://ross.andromeda.svc:443
+func (sr defaultServiceResolver) ResolveEndpoint(namespace, name string) (*url.URL, error) {
+	if len(name) == 0 || len(namespace) == 0 {
+		return nil, errors.New("cannot resolve an empty service name or namespace")
+	}
+	return &url.URL{Scheme: "https", Host: fmt.Sprintf("%s.%s.svc:443", name, namespace)}, nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/errors/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/errors/doc.go
new file mode 100644
index 0000000..6e86a1b
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/errors/doc.go
@@ -0,0 +1,18 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+// Package errors contains utilities for admission webhook specific errors
+package errors // import "k8s.io/apiserver/pkg/admission/plugin/webhook/errors"
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/errors/errors.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/errors/errors.go
new file mode 100644
index 0000000..2396152
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/errors/errors.go
@@ -0,0 +1,34 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package errors
+
+import "fmt"
+
+// ErrCallingWebhook is returned for transport-layer errors calling webhooks. It
+// represents a failure to talk to the webhook, not the webhook rejecting a
+// request.
+type ErrCallingWebhook struct {
+	WebhookName string
+	Reason      error
+}
+
+func (e *ErrCallingWebhook) Error() string {
+	if e.Reason != nil {
+		return fmt.Sprintf("failed calling admission webhook %q: %v", e.WebhookName, e.Reason)
+	}
+	return fmt.Sprintf("failed calling admission webhook %q; no further details available", e.WebhookName)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/errors/statuserror.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/errors/statuserror.go
new file mode 100644
index 0000000..f37dec0
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/errors/statuserror.go
@@ -0,0 +1,47 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package errors
+
+import (
+	"fmt"
+
+	apierrors "k8s.io/apimachinery/pkg/api/errors"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+)
+
+// ToStatusErr returns a StatusError with information about the webhook plugin
+func ToStatusErr(webhookName string, result *metav1.Status) *apierrors.StatusError {
+	deniedBy := fmt.Sprintf("admission webhook %q denied the request", webhookName)
+	const noExp = "without explanation"
+
+	if result == nil {
+		result = &metav1.Status{Status: metav1.StatusFailure}
+	}
+
+	switch {
+	case len(result.Message) > 0:
+		result.Message = fmt.Sprintf("%s: %s", deniedBy, result.Message)
+	case len(result.Reason) > 0:
+		result.Message = fmt.Sprintf("%s: %s", deniedBy, result.Reason)
+	default:
+		result.Message = fmt.Sprintf("%s %s", deniedBy, noExp)
+	}
+
+	return &apierrors.StatusError{
+		ErrStatus: *result,
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/generic/conversion.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/generic/conversion.go
new file mode 100644
index 0000000..a75c63f
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/generic/conversion.go
@@ -0,0 +1,55 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package generic
+
+import (
+	"fmt"
+
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+)
+
+// convertor converts objects to the desired version.
+type convertor struct {
+	Scheme *runtime.Scheme
+}
+
+// ConvertToGVK converts object to the desired gvk.
+func (c *convertor) ConvertToGVK(obj runtime.Object, gvk schema.GroupVersionKind) (runtime.Object, error) {
+	// Unlike other resources, custom resources do not have internal version, so
+	// if obj is a custom resource, it should not need conversion.
+	if obj.GetObjectKind().GroupVersionKind() == gvk {
+		return obj, nil
+	}
+	out, err := c.Scheme.New(gvk)
+	if err != nil {
+		return nil, err
+	}
+	err = c.Scheme.Convert(obj, out, nil)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// Validate checks if the conversion has a scheme.
+func (c *convertor) Validate() error {
+	if c.Scheme == nil {
+		return fmt.Errorf("the convertor requires a scheme")
+	}
+	return nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/generic/interfaces.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/generic/interfaces.go
new file mode 100644
index 0000000..3a7edb5
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/generic/interfaces.go
@@ -0,0 +1,45 @@
+/*
+Copyright 2018 The Kubernetes Authors.
+
+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.
+*/
+
+package generic
+
+import (
+	"context"
+
+	"k8s.io/api/admissionregistration/v1beta1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apiserver/pkg/admission"
+)
+
+// Source can list dynamic webhook plugins.
+type Source interface {
+	Webhooks() []v1beta1.Webhook
+	HasSynced() bool
+}
+
+// VersionedAttributes is a wrapper around the original admission attributes, adding versioned
+// variants of the object and old object.
+type VersionedAttributes struct {
+	admission.Attributes
+	VersionedOldObject runtime.Object
+	VersionedObject    runtime.Object
+}
+
+// Dispatcher dispatches webhook call to a list of webhooks with admission attributes as argument.
+type Dispatcher interface {
+	// Dispatch a request to the webhooks using the given webhooks. A non-nil error means the request is rejected.
+	Dispatch(ctx context.Context, a *VersionedAttributes, hooks []*v1beta1.Webhook) error
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/generic/webhook.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/generic/webhook.go
new file mode 100644
index 0000000..fdcbdd9
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/generic/webhook.go
@@ -0,0 +1,202 @@
+/*
+Copyright 2018 The Kubernetes Authors.
+
+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.
+*/
+
+package generic
+
+import (
+	"context"
+	"fmt"
+	"io"
+
+	"k8s.io/api/admissionregistration/v1beta1"
+	apierrors "k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apiserver/pkg/admission"
+	genericadmissioninit "k8s.io/apiserver/pkg/admission/initializer"
+	"k8s.io/apiserver/pkg/admission/plugin/webhook/config"
+	"k8s.io/apiserver/pkg/admission/plugin/webhook/namespace"
+	"k8s.io/apiserver/pkg/admission/plugin/webhook/rules"
+	"k8s.io/client-go/informers"
+	clientset "k8s.io/client-go/kubernetes"
+)
+
+// Webhook is an abstract admission plugin with all the infrastructure to define Admit or Validate on-top.
+type Webhook struct {
+	*admission.Handler
+
+	sourceFactory sourceFactory
+
+	hookSource       Source
+	clientManager    *config.ClientManager
+	convertor        *convertor
+	namespaceMatcher *namespace.Matcher
+	dispatcher       Dispatcher
+}
+
+var (
+	_ genericadmissioninit.WantsExternalKubeClientSet = &Webhook{}
+	_ admission.Interface                             = &Webhook{}
+)
+
+type sourceFactory func(f informers.SharedInformerFactory) Source
+type dispatcherFactory func(cm *config.ClientManager) Dispatcher
+
+// NewWebhook creates a new generic admission webhook.
+func NewWebhook(handler *admission.Handler, configFile io.Reader, sourceFactory sourceFactory, dispatcherFactory dispatcherFactory) (*Webhook, error) {
+	kubeconfigFile, err := config.LoadConfig(configFile)
+	if err != nil {
+		return nil, err
+	}
+
+	cm, err := config.NewClientManager()
+	if err != nil {
+		return nil, err
+	}
+	authInfoResolver, err := config.NewDefaultAuthenticationInfoResolver(kubeconfigFile)
+	if err != nil {
+		return nil, err
+	}
+	// Set defaults which may be overridden later.
+	cm.SetAuthenticationInfoResolver(authInfoResolver)
+	cm.SetServiceResolver(config.NewDefaultServiceResolver())
+
+	return &Webhook{
+		Handler:          handler,
+		sourceFactory:    sourceFactory,
+		clientManager:    &cm,
+		convertor:        &convertor{},
+		namespaceMatcher: &namespace.Matcher{},
+		dispatcher:       dispatcherFactory(&cm),
+	}, nil
+}
+
+// SetAuthenticationInfoResolverWrapper sets the
+// AuthenticationInfoResolverWrapper.
+// TODO find a better way wire this, but keep this pull small for now.
+func (a *Webhook) SetAuthenticationInfoResolverWrapper(wrapper config.AuthenticationInfoResolverWrapper) {
+	a.clientManager.SetAuthenticationInfoResolverWrapper(wrapper)
+}
+
+// SetServiceResolver sets a service resolver for the webhook admission plugin.
+// Passing a nil resolver does not have an effect, instead a default one will be used.
+func (a *Webhook) SetServiceResolver(sr config.ServiceResolver) {
+	a.clientManager.SetServiceResolver(sr)
+}
+
+// SetScheme sets a serializer(NegotiatedSerializer) which is derived from the scheme
+func (a *Webhook) SetScheme(scheme *runtime.Scheme) {
+	if scheme != nil {
+		a.convertor.Scheme = scheme
+	}
+}
+
+// SetExternalKubeClientSet implements the WantsExternalKubeInformerFactory interface.
+// It sets external ClientSet for admission plugins that need it
+func (a *Webhook) SetExternalKubeClientSet(client clientset.Interface) {
+	a.namespaceMatcher.Client = client
+}
+
+// SetExternalKubeInformerFactory implements the WantsExternalKubeInformerFactory interface.
+func (a *Webhook) SetExternalKubeInformerFactory(f informers.SharedInformerFactory) {
+	namespaceInformer := f.Core().V1().Namespaces()
+	a.namespaceMatcher.NamespaceLister = namespaceInformer.Lister()
+	a.hookSource = a.sourceFactory(f)
+	a.SetReadyFunc(func() bool {
+		return namespaceInformer.Informer().HasSynced() && a.hookSource.HasSynced()
+	})
+}
+
+// ValidateInitialization implements the InitializationValidator interface.
+func (a *Webhook) ValidateInitialization() error {
+	if a.hookSource == nil {
+		return fmt.Errorf("kubernetes client is not properly setup")
+	}
+	if err := a.namespaceMatcher.Validate(); err != nil {
+		return fmt.Errorf("namespaceMatcher is not properly setup: %v", err)
+	}
+	if err := a.clientManager.Validate(); err != nil {
+		return fmt.Errorf("clientManager is not properly setup: %v", err)
+	}
+	if err := a.convertor.Validate(); err != nil {
+		return fmt.Errorf("convertor is not properly setup: %v", err)
+	}
+	return nil
+}
+
+// ShouldCallHook makes a decision on whether to call the webhook or not by the attribute.
+func (a *Webhook) ShouldCallHook(h *v1beta1.Webhook, attr admission.Attributes) (bool, *apierrors.StatusError) {
+	var matches bool
+	for _, r := range h.Rules {
+		m := rules.Matcher{Rule: r, Attr: attr}
+		if m.Matches() {
+			matches = true
+			break
+		}
+	}
+	if !matches {
+		return false, nil
+	}
+
+	return a.namespaceMatcher.MatchNamespaceSelector(h, attr)
+}
+
+// Dispatch is called by the downstream Validate or Admit methods.
+func (a *Webhook) Dispatch(attr admission.Attributes) error {
+	if rules.IsWebhookConfigurationResource(attr) {
+		return nil
+	}
+	if !a.WaitForReady() {
+		return admission.NewForbidden(attr, fmt.Errorf("not yet ready to handle request"))
+	}
+	hooks := a.hookSource.Webhooks()
+	ctx := context.TODO()
+
+	var relevantHooks []*v1beta1.Webhook
+	for i := range hooks {
+		call, err := a.ShouldCallHook(&hooks[i], attr)
+		if err != nil {
+			return err
+		}
+		if call {
+			relevantHooks = append(relevantHooks, &hooks[i])
+		}
+	}
+
+	if len(relevantHooks) == 0 {
+		// no matching hooks
+		return nil
+	}
+
+	// convert the object to the external version before sending it to the webhook
+	versionedAttr := VersionedAttributes{
+		Attributes: attr,
+	}
+	if oldObj := attr.GetOldObject(); oldObj != nil {
+		out, err := a.convertor.ConvertToGVK(oldObj, attr.GetKind())
+		if err != nil {
+			return apierrors.NewInternalError(err)
+		}
+		versionedAttr.VersionedOldObject = out
+	}
+	if obj := attr.GetObject(); obj != nil {
+		out, err := a.convertor.ConvertToGVK(obj, attr.GetKind())
+		if err != nil {
+			return apierrors.NewInternalError(err)
+		}
+		versionedAttr.VersionedObject = out
+	}
+	return a.dispatcher.Dispatch(ctx, &versionedAttr, relevantHooks)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating/dispatcher.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating/dispatcher.go
new file mode 100644
index 0000000..88e23c2
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating/dispatcher.go
@@ -0,0 +1,149 @@
+/*
+Copyright 2018 The Kubernetes Authors.
+
+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.
+*/
+
+// Package mutating delegates admission checks to dynamically configured
+// mutating webhooks.
+package mutating
+
+import (
+	"context"
+	"fmt"
+	"time"
+
+	jsonpatch "github.com/evanphx/json-patch"
+	"github.com/golang/glog"
+
+	admissionv1beta1 "k8s.io/api/admission/v1beta1"
+	"k8s.io/api/admissionregistration/v1beta1"
+	apierrors "k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
+	"k8s.io/apimachinery/pkg/runtime"
+	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
+	admissionmetrics "k8s.io/apiserver/pkg/admission/metrics"
+	"k8s.io/apiserver/pkg/admission/plugin/webhook/config"
+	webhookerrors "k8s.io/apiserver/pkg/admission/plugin/webhook/errors"
+	"k8s.io/apiserver/pkg/admission/plugin/webhook/generic"
+	"k8s.io/apiserver/pkg/admission/plugin/webhook/request"
+)
+
+type mutatingDispatcher struct {
+	cm     *config.ClientManager
+	plugin *Plugin
+}
+
+func newMutatingDispatcher(p *Plugin) func(cm *config.ClientManager) generic.Dispatcher {
+	return func(cm *config.ClientManager) generic.Dispatcher {
+		return &mutatingDispatcher{cm, p}
+	}
+}
+
+var _ generic.Dispatcher = &mutatingDispatcher{}
+
+func (a *mutatingDispatcher) Dispatch(ctx context.Context, attr *generic.VersionedAttributes, relevantHooks []*v1beta1.Webhook) error {
+	for _, hook := range relevantHooks {
+		t := time.Now()
+		err := a.callAttrMutatingHook(ctx, hook, attr)
+		admissionmetrics.Metrics.ObserveWebhook(time.Since(t), err != nil, attr.Attributes, "admit", hook.Name)
+		if err == nil {
+			continue
+		}
+
+		ignoreClientCallFailures := hook.FailurePolicy != nil && *hook.FailurePolicy == v1beta1.Ignore
+		if callErr, ok := err.(*webhookerrors.ErrCallingWebhook); ok {
+			if ignoreClientCallFailures {
+				glog.Warningf("Failed calling webhook, failing open %v: %v", hook.Name, callErr)
+				utilruntime.HandleError(callErr)
+				continue
+			}
+			glog.Warningf("Failed calling webhook, failing closed %v: %v", hook.Name, err)
+		}
+		return apierrors.NewInternalError(err)
+	}
+
+	// convert attr.VersionedObject to the internal version in the underlying admission.Attributes
+	if attr.VersionedObject != nil {
+		return a.plugin.scheme.Convert(attr.VersionedObject, attr.Attributes.GetObject(), nil)
+	}
+	return nil
+}
+
+// note that callAttrMutatingHook updates attr
+func (a *mutatingDispatcher) callAttrMutatingHook(ctx context.Context, h *v1beta1.Webhook, attr *generic.VersionedAttributes) error {
+	// Make the webhook request
+	request := request.CreateAdmissionReview(attr)
+	client, err := a.cm.HookClient(h)
+	if err != nil {
+		return &webhookerrors.ErrCallingWebhook{WebhookName: h.Name, Reason: err}
+	}
+	response := &admissionv1beta1.AdmissionReview{}
+	if err := client.Post().Context(ctx).Body(&request).Do().Into(response); err != nil {
+		return &webhookerrors.ErrCallingWebhook{WebhookName: h.Name, Reason: err}
+	}
+
+	if response.Response == nil {
+		return &webhookerrors.ErrCallingWebhook{WebhookName: h.Name, Reason: fmt.Errorf("Webhook response was absent")}
+	}
+
+	if !response.Response.Allowed {
+		return webhookerrors.ToStatusErr(h.Name, response.Response.Result)
+	}
+
+	patchJS := response.Response.Patch
+	if len(patchJS) == 0 {
+		return nil
+	}
+	patchObj, err := jsonpatch.DecodePatch(patchJS)
+	if err != nil {
+		return apierrors.NewInternalError(err)
+	}
+	if len(patchObj) == 0 {
+		return nil
+	}
+
+	// if a non-empty patch was provided, and we have no object we can apply it to (e.g. a DELETE admission operation), error
+	if attr.VersionedObject == nil {
+		return apierrors.NewInternalError(fmt.Errorf("admission webhook %q attempted to modify the object, which is not supported for this operation", h.Name))
+	}
+
+	objJS, err := runtime.Encode(a.plugin.jsonSerializer, attr.VersionedObject)
+	if err != nil {
+		return apierrors.NewInternalError(err)
+	}
+	patchedJS, err := patchObj.Apply(objJS)
+	if err != nil {
+		return apierrors.NewInternalError(err)
+	}
+
+	var newVersionedObject runtime.Object
+	if _, ok := attr.VersionedObject.(*unstructured.Unstructured); ok {
+		// Custom Resources don't have corresponding Go struct's.
+		// They are represented as Unstructured.
+		newVersionedObject = &unstructured.Unstructured{}
+	} else {
+		newVersionedObject, err = a.plugin.scheme.New(attr.GetKind())
+		if err != nil {
+			return apierrors.NewInternalError(err)
+		}
+	}
+	// TODO: if we have multiple mutating webhooks, we can remember the json
+	// instead of encoding and decoding for each one.
+	if _, _, err := a.plugin.jsonSerializer.Decode(patchedJS, nil, newVersionedObject); err != nil {
+		return apierrors.NewInternalError(err)
+	}
+	attr.VersionedObject = newVersionedObject
+	a.plugin.scheme.Default(attr.VersionedObject)
+	return nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating/doc.go
new file mode 100644
index 0000000..d804aca
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating/doc.go
@@ -0,0 +1,19 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+// Package mutating makes calls to mutating webhooks during the admission
+// process.
+package mutating // import "k8s.io/apiserver/pkg/admission/plugin/webhook/mutating"
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating/plugin.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating/plugin.go
new file mode 100644
index 0000000..f03b1b3
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating/plugin.go
@@ -0,0 +1,96 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package mutating
+
+import (
+	"fmt"
+	"io"
+
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/serializer/json"
+	"k8s.io/apiserver/pkg/admission"
+	"k8s.io/apiserver/pkg/admission/configuration"
+	"k8s.io/apiserver/pkg/admission/plugin/webhook/generic"
+)
+
+const (
+	// Name of admission plug-in
+	PluginName = "MutatingAdmissionWebhook"
+)
+
+// Register registers a plugin
+func Register(plugins *admission.Plugins) {
+	plugins.Register(PluginName, func(configFile io.Reader) (admission.Interface, error) {
+		plugin, err := NewMutatingWebhook(configFile)
+		if err != nil {
+			return nil, err
+		}
+
+		return plugin, nil
+	})
+}
+
+// Plugin is an implementation of admission.Interface.
+type Plugin struct {
+	*generic.Webhook
+
+	scheme         *runtime.Scheme
+	jsonSerializer *json.Serializer
+}
+
+var _ admission.MutationInterface = &Plugin{}
+
+// NewMutatingWebhook returns a generic admission webhook plugin.
+func NewMutatingWebhook(configFile io.Reader) (*Plugin, error) {
+	handler := admission.NewHandler(admission.Connect, admission.Create, admission.Delete, admission.Update)
+	p := &Plugin{}
+	var err error
+	p.Webhook, err = generic.NewWebhook(handler, configFile, configuration.NewMutatingWebhookConfigurationManager, newMutatingDispatcher(p))
+	if err != nil {
+		return nil, err
+	}
+
+	return p, nil
+}
+
+// SetScheme sets a serializer(NegotiatedSerializer) which is derived from the scheme
+func (a *Plugin) SetScheme(scheme *runtime.Scheme) {
+	a.Webhook.SetScheme(scheme)
+	if scheme != nil {
+		a.scheme = scheme
+		a.jsonSerializer = json.NewSerializer(json.DefaultMetaFactory, scheme, scheme, false)
+	}
+}
+
+// ValidateInitialization implements the InitializationValidator interface.
+func (a *Plugin) ValidateInitialization() error {
+	if err := a.Webhook.ValidateInitialization(); err != nil {
+		return err
+	}
+	if a.scheme == nil {
+		return fmt.Errorf("scheme is not properly setup")
+	}
+	if a.jsonSerializer == nil {
+		return fmt.Errorf("jsonSerializer is not properly setup")
+	}
+	return nil
+}
+
+// Admit makes an admission decision based on the request attributes.
+func (a *Plugin) Admit(attr admission.Attributes) error {
+	return a.Webhook.Dispatch(attr)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/namespace/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/namespace/doc.go
new file mode 100644
index 0000000..d1a2853
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/namespace/doc.go
@@ -0,0 +1,20 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+// Package namespace defines the utilities that are used by the webhook
+// plugin to decide if a webhook should be applied to an object based on its
+// namespace.
+package namespace // import "k8s.io/apiserver/pkg/admission/plugin/webhook/namespace"
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/namespace/matcher.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/namespace/matcher.go
new file mode 100644
index 0000000..a054119
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/namespace/matcher.go
@@ -0,0 +1,117 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package namespace
+
+import (
+	"fmt"
+
+	"k8s.io/api/admissionregistration/v1beta1"
+	apierrors "k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/api/meta"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/labels"
+	utilerrors "k8s.io/apimachinery/pkg/util/errors"
+	"k8s.io/apiserver/pkg/admission"
+	clientset "k8s.io/client-go/kubernetes"
+	corelisters "k8s.io/client-go/listers/core/v1"
+)
+
+// Matcher decides if a request is exempted by the NamespaceSelector of a
+// webhook configuration.
+type Matcher struct {
+	NamespaceLister corelisters.NamespaceLister
+	Client          clientset.Interface
+}
+
+// Validate checks if the Matcher has a NamespaceLister and Client.
+func (m *Matcher) Validate() error {
+	var errs []error
+	if m.NamespaceLister == nil {
+		errs = append(errs, fmt.Errorf("the namespace matcher requires a namespaceLister"))
+	}
+	if m.Client == nil {
+		errs = append(errs, fmt.Errorf("the namespace matcher requires a namespaceLister"))
+	}
+	return utilerrors.NewAggregate(errs)
+}
+
+// GetNamespaceLabels gets the labels of the namespace related to the attr.
+func (m *Matcher) GetNamespaceLabels(attr admission.Attributes) (map[string]string, error) {
+	// If the request itself is creating or updating a namespace, then get the
+	// labels from attr.Object, because namespaceLister doesn't have the latest
+	// namespace yet.
+	//
+	// However, if the request is deleting a namespace, then get the label from
+	// the namespace in the namespaceLister, because a delete request is not
+	// going to change the object, and attr.Object will be a DeleteOptions
+	// rather than a namespace object.
+	if attr.GetResource().Resource == "namespaces" &&
+		len(attr.GetSubresource()) == 0 &&
+		(attr.GetOperation() == admission.Create || attr.GetOperation() == admission.Update) {
+		accessor, err := meta.Accessor(attr.GetObject())
+		if err != nil {
+			return nil, err
+		}
+		return accessor.GetLabels(), nil
+	}
+
+	namespaceName := attr.GetNamespace()
+	namespace, err := m.NamespaceLister.Get(namespaceName)
+	if err != nil && !apierrors.IsNotFound(err) {
+		return nil, err
+	}
+	if apierrors.IsNotFound(err) {
+		// in case of latency in our caches, make a call direct to storage to verify that it truly exists or not
+		namespace, err = m.Client.CoreV1().Namespaces().Get(namespaceName, metav1.GetOptions{})
+		if err != nil {
+			return nil, err
+		}
+	}
+	return namespace.Labels, nil
+}
+
+// MatchNamespaceSelector decideds whether the request matches the
+// namespaceSelctor of the webhook. Only when they match, the webhook is called.
+func (m *Matcher) MatchNamespaceSelector(h *v1beta1.Webhook, attr admission.Attributes) (bool, *apierrors.StatusError) {
+	namespaceName := attr.GetNamespace()
+	if len(namespaceName) == 0 && attr.GetResource().Resource != "namespaces" {
+		// If the request is about a cluster scoped resource, and it is not a
+		// namespace, it is never exempted.
+		// TODO: figure out a way selective exempt cluster scoped resources.
+		// Also update the comment in types.go
+		return true, nil
+	}
+	namespaceLabels, err := m.GetNamespaceLabels(attr)
+	// this means the namespace is not found, for backwards compatibility,
+	// return a 404
+	if apierrors.IsNotFound(err) {
+		status, ok := err.(apierrors.APIStatus)
+		if !ok {
+			return false, apierrors.NewInternalError(err)
+		}
+		return false, &apierrors.StatusError{status.Status()}
+	}
+	if err != nil {
+		return false, apierrors.NewInternalError(err)
+	}
+	// TODO: adding an LRU cache to cache the translation
+	selector, err := metav1.LabelSelectorAsSelector(h.NamespaceSelector)
+	if err != nil {
+		return false, apierrors.NewInternalError(err)
+	}
+	return selector.Matches(labels.Set(namespaceLabels)), nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/request/admissionreview.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/request/admissionreview.go
new file mode 100644
index 0000000..663349a
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/request/admissionreview.go
@@ -0,0 +1,71 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package request
+
+import (
+	admissionv1beta1 "k8s.io/api/admission/v1beta1"
+	authenticationv1 "k8s.io/api/authentication/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/util/uuid"
+	"k8s.io/apiserver/pkg/admission/plugin/webhook/generic"
+)
+
+// CreateAdmissionReview creates an AdmissionReview for the provided admission.Attributes
+func CreateAdmissionReview(attr *generic.VersionedAttributes) admissionv1beta1.AdmissionReview {
+	gvk := attr.GetKind()
+	gvr := attr.GetResource()
+	aUserInfo := attr.GetUserInfo()
+	userInfo := authenticationv1.UserInfo{
+		Extra:    make(map[string]authenticationv1.ExtraValue),
+		Groups:   aUserInfo.GetGroups(),
+		UID:      aUserInfo.GetUID(),
+		Username: aUserInfo.GetName(),
+	}
+
+	// Convert the extra information in the user object
+	for key, val := range aUserInfo.GetExtra() {
+		userInfo.Extra[key] = authenticationv1.ExtraValue(val)
+	}
+
+	return admissionv1beta1.AdmissionReview{
+		Request: &admissionv1beta1.AdmissionRequest{
+			UID: uuid.NewUUID(),
+			Kind: metav1.GroupVersionKind{
+				Group:   gvk.Group,
+				Kind:    gvk.Kind,
+				Version: gvk.Version,
+			},
+			Resource: metav1.GroupVersionResource{
+				Group:    gvr.Group,
+				Resource: gvr.Resource,
+				Version:  gvr.Version,
+			},
+			SubResource: attr.GetSubresource(),
+			Name:        attr.GetName(),
+			Namespace:   attr.GetNamespace(),
+			Operation:   admissionv1beta1.Operation(attr.GetOperation()),
+			UserInfo:    userInfo,
+			Object: runtime.RawExtension{
+				Object: attr.VersionedObject,
+			},
+			OldObject: runtime.RawExtension{
+				Object: attr.VersionedOldObject,
+			},
+		},
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/request/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/request/doc.go
new file mode 100644
index 0000000..fbacf33
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/request/doc.go
@@ -0,0 +1,18 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+// Package request creates admissionReview request based on admission attributes.
+package request // import "k8s.io/apiserver/pkg/admission/plugin/webhook/request"
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/rules/rules.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/rules/rules.go
new file mode 100644
index 0000000..096ab50
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/rules/rules.go
@@ -0,0 +1,107 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package rules
+
+import (
+	"strings"
+
+	"k8s.io/api/admissionregistration/v1beta1"
+	"k8s.io/apiserver/pkg/admission"
+)
+
+// Matcher determines if the Attr matches the Rule.
+type Matcher struct {
+	Rule v1beta1.RuleWithOperations
+	Attr admission.Attributes
+}
+
+// Matches returns if the Attr matches the Rule.
+func (r *Matcher) Matches() bool {
+	return r.operation() &&
+		r.group() &&
+		r.version() &&
+		r.resource()
+}
+
+func exactOrWildcard(items []string, requested string) bool {
+	for _, item := range items {
+		if item == "*" {
+			return true
+		}
+		if item == requested {
+			return true
+		}
+	}
+
+	return false
+}
+
+func (r *Matcher) group() bool {
+	return exactOrWildcard(r.Rule.APIGroups, r.Attr.GetResource().Group)
+}
+
+func (r *Matcher) version() bool {
+	return exactOrWildcard(r.Rule.APIVersions, r.Attr.GetResource().Version)
+}
+
+func (r *Matcher) operation() bool {
+	attrOp := r.Attr.GetOperation()
+	for _, op := range r.Rule.Operations {
+		if op == v1beta1.OperationAll {
+			return true
+		}
+		// The constants are the same such that this is a valid cast (and this
+		// is tested).
+		if op == v1beta1.OperationType(attrOp) {
+			return true
+		}
+	}
+	return false
+}
+
+func splitResource(resSub string) (res, sub string) {
+	parts := strings.SplitN(resSub, "/", 2)
+	if len(parts) == 2 {
+		return parts[0], parts[1]
+	}
+	return parts[0], ""
+}
+
+func (r *Matcher) resource() bool {
+	opRes, opSub := r.Attr.GetResource().Resource, r.Attr.GetSubresource()
+	for _, res := range r.Rule.Resources {
+		res, sub := splitResource(res)
+		resMatch := res == "*" || res == opRes
+		subMatch := sub == "*" || sub == opSub
+		if resMatch && subMatch {
+			return true
+		}
+	}
+	return false
+}
+
+// IsWebhookConfigurationResource determines if an admission.Attributes object is describing
+// the admission of a ValidatingWebhookConfiguration or a MutatingWebhookConfiguration
+func IsWebhookConfigurationResource(attr admission.Attributes) bool {
+	gvk := attr.GetKind()
+	if gvk.Group == "admissionregistration.k8s.io" {
+		if gvk.Kind == "ValidatingWebhookConfiguration" || gvk.Kind == "MutatingWebhookConfiguration" {
+			return true
+		}
+	}
+	return false
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/validating/dispatcher.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/validating/dispatcher.go
new file mode 100644
index 0000000..528d79a
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/validating/dispatcher.go
@@ -0,0 +1,118 @@
+/*
+Copyright 2018 The Kubernetes Authors.
+
+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.
+*/
+
+package validating
+
+import (
+	"context"
+	"fmt"
+	"sync"
+	"time"
+
+	"github.com/golang/glog"
+	"k8s.io/apiserver/pkg/admission/plugin/webhook/config"
+	"k8s.io/apiserver/pkg/admission/plugin/webhook/generic"
+
+	admissionv1beta1 "k8s.io/api/admission/v1beta1"
+	"k8s.io/api/admissionregistration/v1beta1"
+	apierrors "k8s.io/apimachinery/pkg/api/errors"
+	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
+	admissionmetrics "k8s.io/apiserver/pkg/admission/metrics"
+	webhookerrors "k8s.io/apiserver/pkg/admission/plugin/webhook/errors"
+	"k8s.io/apiserver/pkg/admission/plugin/webhook/request"
+)
+
+type validatingDispatcher struct {
+	cm *config.ClientManager
+}
+
+func newValidatingDispatcher(cm *config.ClientManager) generic.Dispatcher {
+	return &validatingDispatcher{cm}
+}
+
+var _ generic.Dispatcher = &validatingDispatcher{}
+
+func (d *validatingDispatcher) Dispatch(ctx context.Context, attr *generic.VersionedAttributes, relevantHooks []*v1beta1.Webhook) error {
+	wg := sync.WaitGroup{}
+	errCh := make(chan error, len(relevantHooks))
+	wg.Add(len(relevantHooks))
+	for i := range relevantHooks {
+		go func(hook *v1beta1.Webhook) {
+			defer wg.Done()
+
+			t := time.Now()
+			err := d.callHook(ctx, hook, attr)
+			admissionmetrics.Metrics.ObserveWebhook(time.Since(t), err != nil, attr.Attributes, "validating", hook.Name)
+			if err == nil {
+				return
+			}
+
+			ignoreClientCallFailures := hook.FailurePolicy != nil && *hook.FailurePolicy == v1beta1.Ignore
+			if callErr, ok := err.(*webhookerrors.ErrCallingWebhook); ok {
+				if ignoreClientCallFailures {
+					glog.Warningf("Failed calling webhook, failing open %v: %v", hook.Name, callErr)
+					utilruntime.HandleError(callErr)
+					return
+				}
+
+				glog.Warningf("Failed calling webhook, failing closed %v: %v", hook.Name, err)
+				errCh <- apierrors.NewInternalError(err)
+				return
+			}
+
+			glog.Warningf("rejected by webhook %q: %#v", hook.Name, err)
+			errCh <- err
+		}(relevantHooks[i])
+	}
+	wg.Wait()
+	close(errCh)
+
+	var errs []error
+	for e := range errCh {
+		errs = append(errs, e)
+	}
+	if len(errs) == 0 {
+		return nil
+	}
+	if len(errs) > 1 {
+		for i := 1; i < len(errs); i++ {
+			// TODO: merge status errors; until then, just return the first one.
+			utilruntime.HandleError(errs[i])
+		}
+	}
+	return errs[0]
+}
+
+func (d *validatingDispatcher) callHook(ctx context.Context, h *v1beta1.Webhook, attr *generic.VersionedAttributes) error {
+	// Make the webhook request
+	request := request.CreateAdmissionReview(attr)
+	client, err := d.cm.HookClient(h)
+	if err != nil {
+		return &webhookerrors.ErrCallingWebhook{WebhookName: h.Name, Reason: err}
+	}
+	response := &admissionv1beta1.AdmissionReview{}
+	if err := client.Post().Context(ctx).Body(&request).Do().Into(response); err != nil {
+		return &webhookerrors.ErrCallingWebhook{WebhookName: h.Name, Reason: err}
+	}
+
+	if response.Response == nil {
+		return &webhookerrors.ErrCallingWebhook{WebhookName: h.Name, Reason: fmt.Errorf("Webhook response was absent")}
+	}
+	if response.Response.Allowed {
+		return nil
+	}
+	return webhookerrors.ToStatusErr(h.Name, response.Response.Result)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/validating/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/validating/doc.go
new file mode 100644
index 0000000..ede53c6
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/validating/doc.go
@@ -0,0 +1,19 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+// Package validating makes calls to validating (i.e., non-mutating) webhooks
+// during the admission process.
+package validating // import "k8s.io/apiserver/pkg/admission/plugin/webhook/validating"
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/validating/plugin.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/validating/plugin.go
new file mode 100644
index 0000000..8417ccf
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/validating/plugin.go
@@ -0,0 +1,64 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package validating
+
+import (
+	"io"
+
+	"k8s.io/apiserver/pkg/admission"
+	"k8s.io/apiserver/pkg/admission/configuration"
+	"k8s.io/apiserver/pkg/admission/plugin/webhook/generic"
+)
+
+const (
+	// Name of admission plug-in
+	PluginName = "ValidatingAdmissionWebhook"
+)
+
+// Register registers a plugin
+func Register(plugins *admission.Plugins) {
+	plugins.Register(PluginName, func(configFile io.Reader) (admission.Interface, error) {
+		plugin, err := NewValidatingAdmissionWebhook(configFile)
+		if err != nil {
+			return nil, err
+		}
+
+		return plugin, nil
+	})
+}
+
+// Plugin is an implementation of admission.Interface.
+type Plugin struct {
+	*generic.Webhook
+}
+
+var _ admission.ValidationInterface = &Plugin{}
+
+// NewValidatingAdmissionWebhook returns a generic admission webhook plugin.
+func NewValidatingAdmissionWebhook(configFile io.Reader) (*Plugin, error) {
+	handler := admission.NewHandler(admission.Connect, admission.Create, admission.Delete, admission.Update)
+	webhook, err := generic.NewWebhook(handler, configFile, configuration.NewValidatingWebhookConfigurationManager, newValidatingDispatcher)
+	if err != nil {
+		return nil, err
+	}
+	return &Plugin{webhook}, nil
+}
+
+// Validate makes an admission decision based on the request attributes.
+func (a *Plugin) Validate(attr admission.Attributes) error {
+	return a.Webhook.Dispatch(attr)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugins.go b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugins.go
new file mode 100644
index 0000000..c17d62c
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/admission/plugins.go
@@ -0,0 +1,208 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package admission
+
+import (
+	"bytes"
+	"fmt"
+	"io"
+	"io/ioutil"
+	"reflect"
+	"sort"
+	"strings"
+	"sync"
+
+	"github.com/golang/glog"
+)
+
+// Factory is a function that returns an Interface for admission decisions.
+// The config parameter provides an io.Reader handler to the factory in
+// order to load specific configurations. If no configuration is provided
+// the parameter is nil.
+type Factory func(config io.Reader) (Interface, error)
+
+type Plugins struct {
+	lock     sync.Mutex
+	registry map[string]Factory
+}
+
+func NewPlugins() *Plugins {
+	return &Plugins{}
+}
+
+// All registered admission options.
+var (
+	// PluginEnabledFn checks whether a plugin is enabled.  By default, if you ask about it, it's enabled.
+	PluginEnabledFn = func(name string, config io.Reader) bool {
+		return true
+	}
+)
+
+// PluginEnabledFunc is a function type that can provide an external check on whether an admission plugin may be enabled
+type PluginEnabledFunc func(name string, config io.Reader) bool
+
+// Registered enumerates the names of all registered plugins.
+func (ps *Plugins) Registered() []string {
+	ps.lock.Lock()
+	defer ps.lock.Unlock()
+	keys := []string{}
+	for k := range ps.registry {
+		keys = append(keys, k)
+	}
+	sort.Strings(keys)
+	return keys
+}
+
+// Register registers a plugin Factory by name. This
+// is expected to happen during app startup.
+func (ps *Plugins) Register(name string, plugin Factory) {
+	ps.lock.Lock()
+	defer ps.lock.Unlock()
+	if ps.registry != nil {
+		_, found := ps.registry[name]
+		if found {
+			glog.Fatalf("Admission plugin %q was registered twice", name)
+		}
+	} else {
+		ps.registry = map[string]Factory{}
+	}
+
+	glog.V(1).Infof("Registered admission plugin %q", name)
+	ps.registry[name] = plugin
+}
+
+// getPlugin creates an instance of the named plugin.  It returns `false` if the
+// the name is not known. The error is returned only when the named provider was
+// known but failed to initialize.  The config parameter specifies the io.Reader
+// handler of the configuration file for the cloud provider, or nil for no configuration.
+func (ps *Plugins) getPlugin(name string, config io.Reader) (Interface, bool, error) {
+	ps.lock.Lock()
+	defer ps.lock.Unlock()
+	f, found := ps.registry[name]
+	if !found {
+		return nil, false, nil
+	}
+
+	config1, config2, err := splitStream(config)
+	if err != nil {
+		return nil, true, err
+	}
+	if !PluginEnabledFn(name, config1) {
+		return nil, true, nil
+	}
+
+	ret, err := f(config2)
+	return ret, true, err
+}
+
+// splitStream reads the stream bytes and constructs two copies of it.
+func splitStream(config io.Reader) (io.Reader, io.Reader, error) {
+	if config == nil || reflect.ValueOf(config).IsNil() {
+		return nil, nil, nil
+	}
+
+	configBytes, err := ioutil.ReadAll(config)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	return bytes.NewBuffer(configBytes), bytes.NewBuffer(configBytes), nil
+}
+
+// NewFromPlugins returns an admission.Interface that will enforce admission control decisions of all
+// the given plugins.
+func (ps *Plugins) NewFromPlugins(pluginNames []string, configProvider ConfigProvider, pluginInitializer PluginInitializer, decorator Decorator) (Interface, error) {
+	handlers := []Interface{}
+	mutationPlugins := []string{}
+	validationPlugins := []string{}
+	for _, pluginName := range pluginNames {
+		pluginConfig, err := configProvider.ConfigFor(pluginName)
+		if err != nil {
+			return nil, err
+		}
+
+		plugin, err := ps.InitPlugin(pluginName, pluginConfig, pluginInitializer)
+		if err != nil {
+			return nil, err
+		}
+		if plugin != nil {
+			if decorator != nil {
+				handlers = append(handlers, decorator.Decorate(plugin, pluginName))
+			} else {
+				handlers = append(handlers, plugin)
+			}
+
+			if _, ok := plugin.(MutationInterface); ok {
+				mutationPlugins = append(mutationPlugins, pluginName)
+			}
+			if _, ok := plugin.(ValidationInterface); ok {
+				validationPlugins = append(validationPlugins, pluginName)
+			}
+		}
+	}
+	if len(mutationPlugins) != 0 {
+		glog.Infof("Loaded %d mutating admission controller(s) successfully in the following order: %s.", len(mutationPlugins), strings.Join(mutationPlugins, ","))
+	}
+	if len(validationPlugins) != 0 {
+		glog.Infof("Loaded %d validating admission controller(s) successfully in the following order: %s.", len(validationPlugins), strings.Join(validationPlugins, ","))
+	}
+	return chainAdmissionHandler(handlers), nil
+}
+
+// InitPlugin creates an instance of the named interface.
+func (ps *Plugins) InitPlugin(name string, config io.Reader, pluginInitializer PluginInitializer) (Interface, error) {
+	if name == "" {
+		glog.Info("No admission plugin specified.")
+		return nil, nil
+	}
+
+	plugin, found, err := ps.getPlugin(name, config)
+	if err != nil {
+		return nil, fmt.Errorf("couldn't init admission plugin %q: %v", name, err)
+	}
+	if !found {
+		return nil, fmt.Errorf("unknown admission plugin: %s", name)
+	}
+
+	pluginInitializer.Initialize(plugin)
+	// ensure that plugins have been properly initialized
+	if err := ValidateInitialization(plugin); err != nil {
+		return nil, fmt.Errorf("failed to initialize admission plugin %q: %v", name, err)
+	}
+
+	return plugin, nil
+}
+
+// ValidateInitialization will call the InitializationValidate function in each plugin if they implement
+// the InitializationValidator interface.
+func ValidateInitialization(plugin Interface) error {
+	if validater, ok := plugin.(InitializationValidator); ok {
+		err := validater.ValidateInitialization()
+		if err != nil {
+			return err
+		}
+	}
+	return nil
+}
+
+type PluginInitializers []PluginInitializer
+
+func (pp PluginInitializers) Initialize(plugin Interface) {
+	for _, p := range pp {
+		p.Initialize(plugin)
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/apiserver/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/apiserver/doc.go
new file mode 100644
index 0000000..a89863a
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/apiserver/doc.go
@@ -0,0 +1,21 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+// +k8s:deepcopy-gen=package
+
+// Package apiserver is the internal version of the API.
+// +groupName=apiserver.k8s.io
+package apiserver // import "k8s.io/apiserver/pkg/apis/apiserver"
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/apiserver/install/install.go b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/apiserver/install/install.go
new file mode 100644
index 0000000..4b58a97
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/apiserver/install/install.go
@@ -0,0 +1,31 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package install
+
+import (
+	"k8s.io/apimachinery/pkg/runtime"
+	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
+	"k8s.io/apiserver/pkg/apis/apiserver"
+	"k8s.io/apiserver/pkg/apis/apiserver/v1alpha1"
+)
+
+// Install registers the API group and adds types to a scheme
+func Install(scheme *runtime.Scheme) {
+	utilruntime.Must(apiserver.AddToScheme(scheme))
+	utilruntime.Must(v1alpha1.AddToScheme(scheme))
+	utilruntime.Must(scheme.SetVersionPriority(v1alpha1.SchemeGroupVersion))
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/apiserver/register.go b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/apiserver/register.go
new file mode 100644
index 0000000..ffe9942
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/apiserver/register.go
@@ -0,0 +1,50 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package apiserver
+
+import (
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+)
+
+const GroupName = "apiserver.k8s.io"
+
+// SchemeGroupVersion is group version used to register these objects
+var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: runtime.APIVersionInternal}
+
+// Kind takes an unqualified kind and returns back a Group qualified GroupKind
+func Kind(kind string) schema.GroupKind {
+	return SchemeGroupVersion.WithKind(kind).GroupKind()
+}
+
+// Resource takes an unqualified resource and returns back a Group qualified GroupResource
+func Resource(resource string) schema.GroupResource {
+	return SchemeGroupVersion.WithResource(resource).GroupResource()
+}
+
+var (
+	SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)
+	AddToScheme   = SchemeBuilder.AddToScheme
+)
+
+// Adds the list of known types to the given scheme.
+func addKnownTypes(scheme *runtime.Scheme) error {
+	scheme.AddKnownTypes(SchemeGroupVersion,
+		&AdmissionConfiguration{},
+	)
+	return nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/apiserver/types.go b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/apiserver/types.go
new file mode 100644
index 0000000..e55da95
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/apiserver/types.go
@@ -0,0 +1,50 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package apiserver
+
+import (
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+)
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// AdmissionConfiguration provides versioned configuration for admission controllers.
+type AdmissionConfiguration struct {
+	metav1.TypeMeta
+
+	// Plugins allows specifying a configuration per admission control plugin.
+	// +optional
+	Plugins []AdmissionPluginConfiguration
+}
+
+// AdmissionPluginConfiguration provides the configuration for a single plug-in.
+type AdmissionPluginConfiguration struct {
+	// Name is the name of the admission controller.
+	// It must match the registered admission plugin name.
+	Name string
+
+	// Path is the path to a configuration file that contains the plugin's
+	// configuration
+	// +optional
+	Path string
+
+	// Configuration is an embedded configuration object to be used as the plugin's
+	// configuration. If present, it will be used instead of the path to the configuration file.
+	// +optional
+	Configuration *runtime.Unknown
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1/doc.go
new file mode 100644
index 0000000..7dd031a
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1/doc.go
@@ -0,0 +1,23 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+// +k8s:deepcopy-gen=package
+// +k8s:conversion-gen=k8s.io/apiserver/pkg/apis/apiserver
+// +k8s:defaulter-gen=TypeMeta
+
+// Package v1alpha1 is the v1alpha1 version of the API.
+// +groupName=apiserver.k8s.io
+package v1alpha1 // import "k8s.io/apiserver/pkg/apis/apiserver/v1alpha1"
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1/register.go b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1/register.go
new file mode 100644
index 0000000..466b19a
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1/register.go
@@ -0,0 +1,52 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package v1alpha1
+
+import (
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+)
+
+const GroupName = "apiserver.k8s.io"
+
+// SchemeGroupVersion is group version used to register these objects
+var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1alpha1"}
+
+var (
+	// TODO: move SchemeBuilder with zz_generated.deepcopy.go to k8s.io/api.
+	// localSchemeBuilder and AddToScheme will stay in k8s.io/kubernetes.
+	SchemeBuilder      runtime.SchemeBuilder
+	localSchemeBuilder = &SchemeBuilder
+	AddToScheme        = localSchemeBuilder.AddToScheme
+)
+
+func init() {
+	// We only register manually written functions here. The registration of the
+	// generated functions takes place in the generated files. The separation
+	// makes the code compile even when the generated files are missing.
+	localSchemeBuilder.Register(addKnownTypes)
+}
+
+// Adds the list of known types to the given scheme.
+func addKnownTypes(scheme *runtime.Scheme) error {
+	scheme.AddKnownTypes(SchemeGroupVersion,
+		&AdmissionConfiguration{},
+	)
+	metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
+	return nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1/types.go b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1/types.go
new file mode 100644
index 0000000..239b8e2
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1/types.go
@@ -0,0 +1,50 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package v1alpha1
+
+import (
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+)
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// AdmissionConfiguration provides versioned configuration for admission controllers.
+type AdmissionConfiguration struct {
+	metav1.TypeMeta `json:",inline"`
+
+	// Plugins allows specifying a configuration per admission control plugin.
+	// +optional
+	Plugins []AdmissionPluginConfiguration `json:"plugins"`
+}
+
+// AdmissionPluginConfiguration provides the configuration for a single plug-in.
+type AdmissionPluginConfiguration struct {
+	// Name is the name of the admission controller.
+	// It must match the registered admission plugin name.
+	Name string `json:"name"`
+
+	// Path is the path to a configuration file that contains the plugin's
+	// configuration
+	// +optional
+	Path string `json:"path"`
+
+	// Configuration is an embedded configuration object to be used as the plugin's
+	// configuration. If present, it will be used instead of the path to the configuration file.
+	// +optional
+	Configuration *runtime.Unknown `json:"configuration"`
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1/zz_generated.conversion.go b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1/zz_generated.conversion.go
new file mode 100644
index 0000000..4647753
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1/zz_generated.conversion.go
@@ -0,0 +1,88 @@
+// +build !ignore_autogenerated
+
+/*
+Copyright The Kubernetes Authors.
+
+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.
+*/
+
+// Code generated by conversion-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	unsafe "unsafe"
+
+	conversion "k8s.io/apimachinery/pkg/conversion"
+	runtime "k8s.io/apimachinery/pkg/runtime"
+	apiserver "k8s.io/apiserver/pkg/apis/apiserver"
+)
+
+func init() {
+	localSchemeBuilder.Register(RegisterConversions)
+}
+
+// RegisterConversions adds conversion functions to the given scheme.
+// Public to allow building arbitrary schemes.
+func RegisterConversions(scheme *runtime.Scheme) error {
+	return scheme.AddGeneratedConversionFuncs(
+		Convert_v1alpha1_AdmissionConfiguration_To_apiserver_AdmissionConfiguration,
+		Convert_apiserver_AdmissionConfiguration_To_v1alpha1_AdmissionConfiguration,
+		Convert_v1alpha1_AdmissionPluginConfiguration_To_apiserver_AdmissionPluginConfiguration,
+		Convert_apiserver_AdmissionPluginConfiguration_To_v1alpha1_AdmissionPluginConfiguration,
+	)
+}
+
+func autoConvert_v1alpha1_AdmissionConfiguration_To_apiserver_AdmissionConfiguration(in *AdmissionConfiguration, out *apiserver.AdmissionConfiguration, s conversion.Scope) error {
+	out.Plugins = *(*[]apiserver.AdmissionPluginConfiguration)(unsafe.Pointer(&in.Plugins))
+	return nil
+}
+
+// Convert_v1alpha1_AdmissionConfiguration_To_apiserver_AdmissionConfiguration is an autogenerated conversion function.
+func Convert_v1alpha1_AdmissionConfiguration_To_apiserver_AdmissionConfiguration(in *AdmissionConfiguration, out *apiserver.AdmissionConfiguration, s conversion.Scope) error {
+	return autoConvert_v1alpha1_AdmissionConfiguration_To_apiserver_AdmissionConfiguration(in, out, s)
+}
+
+func autoConvert_apiserver_AdmissionConfiguration_To_v1alpha1_AdmissionConfiguration(in *apiserver.AdmissionConfiguration, out *AdmissionConfiguration, s conversion.Scope) error {
+	out.Plugins = *(*[]AdmissionPluginConfiguration)(unsafe.Pointer(&in.Plugins))
+	return nil
+}
+
+// Convert_apiserver_AdmissionConfiguration_To_v1alpha1_AdmissionConfiguration is an autogenerated conversion function.
+func Convert_apiserver_AdmissionConfiguration_To_v1alpha1_AdmissionConfiguration(in *apiserver.AdmissionConfiguration, out *AdmissionConfiguration, s conversion.Scope) error {
+	return autoConvert_apiserver_AdmissionConfiguration_To_v1alpha1_AdmissionConfiguration(in, out, s)
+}
+
+func autoConvert_v1alpha1_AdmissionPluginConfiguration_To_apiserver_AdmissionPluginConfiguration(in *AdmissionPluginConfiguration, out *apiserver.AdmissionPluginConfiguration, s conversion.Scope) error {
+	out.Name = in.Name
+	out.Path = in.Path
+	out.Configuration = (*runtime.Unknown)(unsafe.Pointer(in.Configuration))
+	return nil
+}
+
+// Convert_v1alpha1_AdmissionPluginConfiguration_To_apiserver_AdmissionPluginConfiguration is an autogenerated conversion function.
+func Convert_v1alpha1_AdmissionPluginConfiguration_To_apiserver_AdmissionPluginConfiguration(in *AdmissionPluginConfiguration, out *apiserver.AdmissionPluginConfiguration, s conversion.Scope) error {
+	return autoConvert_v1alpha1_AdmissionPluginConfiguration_To_apiserver_AdmissionPluginConfiguration(in, out, s)
+}
+
+func autoConvert_apiserver_AdmissionPluginConfiguration_To_v1alpha1_AdmissionPluginConfiguration(in *apiserver.AdmissionPluginConfiguration, out *AdmissionPluginConfiguration, s conversion.Scope) error {
+	out.Name = in.Name
+	out.Path = in.Path
+	out.Configuration = (*runtime.Unknown)(unsafe.Pointer(in.Configuration))
+	return nil
+}
+
+// Convert_apiserver_AdmissionPluginConfiguration_To_v1alpha1_AdmissionPluginConfiguration is an autogenerated conversion function.
+func Convert_apiserver_AdmissionPluginConfiguration_To_v1alpha1_AdmissionPluginConfiguration(in *apiserver.AdmissionPluginConfiguration, out *AdmissionPluginConfiguration, s conversion.Scope) error {
+	return autoConvert_apiserver_AdmissionPluginConfiguration_To_v1alpha1_AdmissionPluginConfiguration(in, out, s)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1/zz_generated.deepcopy.go b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1/zz_generated.deepcopy.go
new file mode 100644
index 0000000..d7ff897
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1/zz_generated.deepcopy.go
@@ -0,0 +1,82 @@
+// +build !ignore_autogenerated
+
+/*
+Copyright The Kubernetes Authors.
+
+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.
+*/
+
+// Code generated by deepcopy-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	runtime "k8s.io/apimachinery/pkg/runtime"
+)
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *AdmissionConfiguration) DeepCopyInto(out *AdmissionConfiguration) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	if in.Plugins != nil {
+		in, out := &in.Plugins, &out.Plugins
+		*out = make([]AdmissionPluginConfiguration, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AdmissionConfiguration.
+func (in *AdmissionConfiguration) DeepCopy() *AdmissionConfiguration {
+	if in == nil {
+		return nil
+	}
+	out := new(AdmissionConfiguration)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *AdmissionConfiguration) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *AdmissionPluginConfiguration) DeepCopyInto(out *AdmissionPluginConfiguration) {
+	*out = *in
+	if in.Configuration != nil {
+		in, out := &in.Configuration, &out.Configuration
+		if *in == nil {
+			*out = nil
+		} else {
+			*out = new(runtime.Unknown)
+			(*in).DeepCopyInto(*out)
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AdmissionPluginConfiguration.
+func (in *AdmissionPluginConfiguration) DeepCopy() *AdmissionPluginConfiguration {
+	if in == nil {
+		return nil
+	}
+	out := new(AdmissionPluginConfiguration)
+	in.DeepCopyInto(out)
+	return out
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1/zz_generated.defaults.go b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1/zz_generated.defaults.go
new file mode 100644
index 0000000..dd621a3
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/apiserver/v1alpha1/zz_generated.defaults.go
@@ -0,0 +1,32 @@
+// +build !ignore_autogenerated
+
+/*
+Copyright The Kubernetes Authors.
+
+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.
+*/
+
+// Code generated by defaulter-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	runtime "k8s.io/apimachinery/pkg/runtime"
+)
+
+// RegisterDefaults adds defaulters functions to the given scheme.
+// Public to allow building arbitrary schemes.
+// All generated defaulters are covering - they call all nested defaulters.
+func RegisterDefaults(scheme *runtime.Scheme) error {
+	return nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/apiserver/zz_generated.deepcopy.go b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/apiserver/zz_generated.deepcopy.go
new file mode 100644
index 0000000..475eb28
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/apiserver/zz_generated.deepcopy.go
@@ -0,0 +1,82 @@
+// +build !ignore_autogenerated
+
+/*
+Copyright The Kubernetes Authors.
+
+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.
+*/
+
+// Code generated by deepcopy-gen. DO NOT EDIT.
+
+package apiserver
+
+import (
+	runtime "k8s.io/apimachinery/pkg/runtime"
+)
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *AdmissionConfiguration) DeepCopyInto(out *AdmissionConfiguration) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	if in.Plugins != nil {
+		in, out := &in.Plugins, &out.Plugins
+		*out = make([]AdmissionPluginConfiguration, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AdmissionConfiguration.
+func (in *AdmissionConfiguration) DeepCopy() *AdmissionConfiguration {
+	if in == nil {
+		return nil
+	}
+	out := new(AdmissionConfiguration)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *AdmissionConfiguration) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *AdmissionPluginConfiguration) DeepCopyInto(out *AdmissionPluginConfiguration) {
+	*out = *in
+	if in.Configuration != nil {
+		in, out := &in.Configuration, &out.Configuration
+		if *in == nil {
+			*out = nil
+		} else {
+			*out = new(runtime.Unknown)
+			(*in).DeepCopyInto(*out)
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AdmissionPluginConfiguration.
+func (in *AdmissionPluginConfiguration) DeepCopy() *AdmissionPluginConfiguration {
+	if in == nil {
+		return nil
+	}
+	out := new(AdmissionPluginConfiguration)
+	in.DeepCopyInto(out)
+	return out
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/doc.go
new file mode 100644
index 0000000..34bc671
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/doc.go
@@ -0,0 +1,19 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+// +k8s:deepcopy-gen=package
+// +groupName=audit.k8s.io
+package audit // import "k8s.io/apiserver/pkg/apis/audit"
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/helpers.go b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/helpers.go
new file mode 100644
index 0000000..05fe72c
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/helpers.go
@@ -0,0 +1,38 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package audit
+
+func ordLevel(l Level) int {
+	switch l {
+	case LevelMetadata:
+		return 1
+	case LevelRequest:
+		return 2
+	case LevelRequestResponse:
+		return 3
+	default:
+		return 0
+	}
+}
+
+func (a Level) Less(b Level) bool {
+	return ordLevel(a) < ordLevel(b)
+}
+
+func (a Level) GreaterOrEqual(b Level) bool {
+	return ordLevel(a) >= ordLevel(b)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/install/install.go b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/install/install.go
new file mode 100644
index 0000000..026f822
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/install/install.go
@@ -0,0 +1,35 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+// Package install installs the experimental API group, making it available as
+// an option to all of the API encoding/decoding machinery.
+package install
+
+import (
+	"k8s.io/apimachinery/pkg/runtime"
+	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
+	"k8s.io/apiserver/pkg/apis/audit"
+	"k8s.io/apiserver/pkg/apis/audit/v1alpha1"
+	"k8s.io/apiserver/pkg/apis/audit/v1beta1"
+)
+
+// Install registers the API group and adds types to a scheme
+func Install(scheme *runtime.Scheme) {
+	utilruntime.Must(audit.AddToScheme(scheme))
+	utilruntime.Must(v1beta1.AddToScheme(scheme))
+	utilruntime.Must(v1alpha1.AddToScheme(scheme))
+	utilruntime.Must(scheme.SetVersionPriority(v1beta1.SchemeGroupVersion, v1alpha1.SchemeGroupVersion))
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/register.go b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/register.go
new file mode 100644
index 0000000..9abf739
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/register.go
@@ -0,0 +1,53 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package audit
+
+import (
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+)
+
+// GroupName is the group name use in this package
+const GroupName = "audit.k8s.io"
+
+// SchemeGroupVersion is group version used to register these objects
+var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: runtime.APIVersionInternal}
+
+// Kind takes an unqualified kind and returns a Group qualified GroupKind
+func Kind(kind string) schema.GroupKind {
+	return SchemeGroupVersion.WithKind(kind).GroupKind()
+}
+
+// Resource takes an unqualified resource and returns a Group qualified GroupResource
+func Resource(resource string) schema.GroupResource {
+	return SchemeGroupVersion.WithResource(resource).GroupResource()
+}
+
+var (
+	SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)
+	AddToScheme   = SchemeBuilder.AddToScheme
+)
+
+func addKnownTypes(scheme *runtime.Scheme) error {
+	scheme.AddKnownTypes(SchemeGroupVersion,
+		&Event{},
+		&EventList{},
+		&Policy{},
+		&PolicyList{},
+	)
+	return nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/types.go b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/types.go
new file mode 100644
index 0000000..d72505d
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/types.go
@@ -0,0 +1,298 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package audit
+
+import (
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/types"
+)
+
+// Header keys used by the audit system.
+const (
+	// Header to hold the audit ID as the request is propagated through the serving hierarchy. The
+	// Audit-ID header should be set by the first server to receive the request (e.g. the federation
+	// server or kube-aggregator).
+	//
+	// Audit ID is also returned to client by http response header.
+	// It's not guaranteed Audit-Id http header is sent for all requests. When kube-apiserver didn't
+	// audit the events according to the audit policy, no Audit-ID is returned. Also, for request to
+	// pods/exec, pods/attach, pods/proxy, kube-apiserver works like a proxy and redirect the request
+	// to kubelet node, users will only get http headers sent from kubelet node, so no Audit-ID is
+	// sent when users run command like "kubectl exec" or "kubectl attach".
+	HeaderAuditID = "Audit-ID"
+)
+
+// Level defines the amount of information logged during auditing
+type Level string
+
+// Valid audit levels
+const (
+	// LevelNone disables auditing
+	LevelNone Level = "None"
+	// LevelMetadata provides the basic level of auditing.
+	LevelMetadata Level = "Metadata"
+	// LevelRequest provides Metadata level of auditing, and additionally
+	// logs the request object (does not apply for non-resource requests).
+	LevelRequest Level = "Request"
+	// LevelRequestResponse provides Request level of auditing, and additionally
+	// logs the response object (does not apply for non-resource requests).
+	LevelRequestResponse Level = "RequestResponse"
+)
+
+// Stage defines the stages in request handling that audit events may be generated.
+type Stage string
+
+// Valid audit stages.
+const (
+	// The stage for events generated as soon as the audit handler receives the request, and before it
+	// is delegated down the handler chain.
+	StageRequestReceived = "RequestReceived"
+	// The stage for events generated once the response headers are sent, but before the response body
+	// is sent. This stage is only generated for long-running requests (e.g. watch).
+	StageResponseStarted = "ResponseStarted"
+	// The stage for events generated once the response body has been completed, and no more bytes
+	// will be sent.
+	StageResponseComplete = "ResponseComplete"
+	// The stage for events generated when a panic occurred.
+	StagePanic = "Panic"
+)
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// Event captures all the information that can be included in an API audit log.
+type Event struct {
+	metav1.TypeMeta
+
+	// AuditLevel at which event was generated
+	Level Level
+
+	// Unique audit ID, generated for each request.
+	AuditID types.UID
+	// Stage of the request handling when this event instance was generated.
+	Stage Stage
+
+	// RequestURI is the request URI as sent by the client to a server.
+	RequestURI string
+	// Verb is the kubernetes verb associated with the request.
+	// For non-resource requests, this is the lower-cased HTTP method.
+	Verb string
+	// Authenticated user information.
+	User UserInfo
+	// Impersonated user information.
+	// +optional
+	ImpersonatedUser *UserInfo
+	// Source IPs, from where the request originated and intermediate proxies.
+	// +optional
+	SourceIPs []string
+	// Object reference this request is targeted at.
+	// Does not apply for List-type requests, or non-resource requests.
+	// +optional
+	ObjectRef *ObjectReference
+	// The response status, populated even when the ResponseObject is not a Status type.
+	// For successful responses, this will only include the Code. For non-status type
+	// error responses, this will be auto-populated with the error Message.
+	// +optional
+	ResponseStatus *metav1.Status
+
+	// API object from the request, in JSON format. The RequestObject is recorded as-is in the request
+	// (possibly re-encoded as JSON), prior to version conversion, defaulting, admission or
+	// merging. It is an external versioned object type, and may not be a valid object on its own.
+	// Omitted for non-resource requests.  Only logged at Request Level and higher.
+	// +optional
+	RequestObject *runtime.Unknown
+	// API object returned in the response, in JSON. The ResponseObject is recorded after conversion
+	// to the external type, and serialized as JSON. Omitted for non-resource requests.  Only logged
+	// at Response Level.
+	// +optional
+	ResponseObject *runtime.Unknown
+
+	// Time the request reached the apiserver.
+	RequestReceivedTimestamp metav1.MicroTime
+	// Time the request reached current audit stage.
+	StageTimestamp metav1.MicroTime
+
+	// Annotations is an unstructured key value map stored with an audit event that may be set by
+	// plugins invoked in the request serving chain, including authentication, authorization and
+	// admission plugins. Keys should uniquely identify the informing component to avoid name
+	// collisions (e.g. podsecuritypolicy.admission.k8s.io/policy). Values should be short. Annotations
+	// are included in the Metadata level.
+	// +optional
+	Annotations map[string]string
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// EventList is a list of audit Events.
+type EventList struct {
+	metav1.TypeMeta
+	// +optional
+	metav1.ListMeta
+
+	Items []Event
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// Policy defines the configuration of audit logging, and the rules for how different request
+// categories are logged.
+type Policy struct {
+	metav1.TypeMeta
+	// ObjectMeta is included for interoperability with API infrastructure.
+	// +optional
+	metav1.ObjectMeta
+
+	// Rules specify the audit Level a request should be recorded at.
+	// A request may match multiple rules, in which case the FIRST matching rule is used.
+	// The default audit level is None, but can be overridden by a catch-all rule at the end of the list.
+	// PolicyRules are strictly ordered.
+	Rules []PolicyRule
+
+	// OmitStages is a list of stages for which no events are created. Note that this can also
+	// be specified per rule in which case the union of both are omitted.
+	// +optional
+	OmitStages []Stage
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// PolicyList is a list of audit Policies.
+type PolicyList struct {
+	metav1.TypeMeta
+	// +optional
+	metav1.ListMeta
+
+	Items []Policy
+}
+
+// PolicyRule maps requests based off metadata to an audit Level.
+// Requests must match the rules of every field (an intersection of rules).
+type PolicyRule struct {
+	// The Level that requests matching this rule are recorded at.
+	Level Level
+
+	// The users (by authenticated user name) this rule applies to.
+	// An empty list implies every user.
+	// +optional
+	Users []string
+	// The user groups this rule applies to. A user is considered matching
+	// if it is a member of any of the UserGroups.
+	// An empty list implies every user group.
+	// +optional
+	UserGroups []string
+
+	// The verbs that match this rule.
+	// An empty list implies every verb.
+	// +optional
+	Verbs []string
+
+	// Rules can apply to API resources (such as "pods" or "secrets"),
+	// non-resource URL paths (such as "/api"), or neither, but not both.
+	// If neither is specified, the rule is treated as a default for all URLs.
+
+	// Resources that this rule matches. An empty list implies all kinds in all API groups.
+	// +optional
+	Resources []GroupResources
+	// Namespaces that this rule matches.
+	// The empty string "" matches non-namespaced resources.
+	// An empty list implies every namespace.
+	// +optional
+	Namespaces []string
+
+	// NonResourceURLs is a set of URL paths that should be audited.
+	// *s are allowed, but only as the full, final step in the path.
+	// Examples:
+	//  "/metrics" - Log requests for apiserver metrics
+	//  "/healthz*" - Log all health checks
+	// +optional
+	NonResourceURLs []string
+
+	// OmitStages is a list of stages for which no events are created. Note that this can also
+	// be specified policy wide in which case the union of both are omitted.
+	// An empty list means no restrictions will apply.
+	// +optional
+	OmitStages []Stage
+}
+
+// GroupResources represents resource kinds in an API group.
+type GroupResources struct {
+	// Group is the name of the API group that contains the resources.
+	// The empty string represents the core API group.
+	// +optional
+	Group string
+	// Resources is a list of resources this rule applies to.
+	//
+	// For example:
+	// 'pods' matches pods.
+	// 'pods/log' matches the log subresource of pods.
+	// '*' matches all resources and their subresources.
+	// 'pods/*' matches all subresources of pods.
+	// '*/scale' matches all scale subresources.
+	//
+	// If wildcard is present, the validation rule will ensure resources do not
+	// overlap with each other.
+	//
+	// An empty list implies all resources and subresources in this API groups apply.
+	// +optional
+	Resources []string
+	// ResourceNames is a list of resource instance names that the policy matches.
+	// Using this field requires Resources to be specified.
+	// An empty list implies that every instance of the resource is matched.
+	// +optional
+	ResourceNames []string
+}
+
+// ObjectReference contains enough information to let you inspect or modify the referred object.
+type ObjectReference struct {
+	// +optional
+	Resource string
+	// +optional
+	Namespace string
+	// +optional
+	Name string
+	// +optional
+	UID types.UID
+	// APIGroup is the name of the API group that contains the referred object.
+	// The empty string represents the core API group.
+	// +optional
+	APIGroup string
+	// APIVersion is the version of the API group that contains the referred object.
+	// +optional
+	APIVersion string
+	// +optional
+	ResourceVersion string
+	// +optional
+	Subresource string
+}
+
+// UserInfo holds the information about the user needed to implement the
+// user.Info interface.
+type UserInfo struct {
+	// The name that uniquely identifies this user among all active users.
+	Username string
+	// A unique value that identifies this user across time. If this user is
+	// deleted and another user by the same name is added, they will have
+	// different UIDs.
+	UID string
+	// The names of groups this user is a part of.
+	Groups []string
+	// Any additional information provided by the authenticator.
+	Extra map[string]ExtraValue
+}
+
+// ExtraValue masks the value so protobuf can generate
+type ExtraValue []string
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/conversion.go b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/conversion.go
new file mode 100644
index 0000000..78e5eab
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/conversion.go
@@ -0,0 +1,78 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package v1alpha1
+
+import (
+	"strings"
+
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/conversion"
+	"k8s.io/apiserver/pkg/apis/audit"
+)
+
+func Convert_audit_ObjectReference_To_v1alpha1_ObjectReference(in *audit.ObjectReference, out *ObjectReference, s conversion.Scope) error {
+	// Begin by copying all fields
+	if err := autoConvert_audit_ObjectReference_To_v1alpha1_ObjectReference(in, out, s); err != nil {
+		return err
+	}
+	// empty string means the core api group
+	if in.APIGroup == "" {
+		out.APIVersion = in.APIVersion
+	} else {
+		out.APIVersion = in.APIGroup + "/" + in.APIVersion
+	}
+	return nil
+}
+
+func Convert_v1alpha1_ObjectReference_To_audit_ObjectReference(in *ObjectReference, out *audit.ObjectReference, s conversion.Scope) error {
+	// Begin by copying all fields
+	if err := autoConvert_v1alpha1_ObjectReference_To_audit_ObjectReference(in, out, s); err != nil {
+		return err
+	}
+	i := strings.LastIndex(in.APIVersion, "/")
+	if i == -1 {
+		// In fact it should always contain a "/"
+		out.APIVersion = in.APIVersion
+	} else {
+		out.APIGroup = in.APIVersion[:i]
+		out.APIVersion = in.APIVersion[i+1:]
+	}
+	return nil
+}
+
+func Convert_v1alpha1_Event_To_audit_Event(in *Event, out *audit.Event, s conversion.Scope) error {
+	if err := autoConvert_v1alpha1_Event_To_audit_Event(in, out, s); err != nil {
+		return err
+	}
+	if out.StageTimestamp.IsZero() {
+		out.StageTimestamp = metav1.NewMicroTime(in.CreationTimestamp.Time)
+	}
+	if out.RequestReceivedTimestamp.IsZero() {
+		out.RequestReceivedTimestamp = metav1.NewMicroTime(in.Timestamp.Time)
+	}
+	return nil
+}
+
+func Convert_audit_Event_To_v1alpha1_Event(in *audit.Event, out *Event, s conversion.Scope) error {
+	if err := autoConvert_audit_Event_To_v1alpha1_Event(in, out, s); err != nil {
+		return err
+	}
+	out.CreationTimestamp = metav1.NewTime(in.StageTimestamp.Time)
+	out.Timestamp = metav1.NewTime(in.RequestReceivedTimestamp.Time)
+	return nil
+
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/doc.go
new file mode 100644
index 0000000..27cc4c5
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/doc.go
@@ -0,0 +1,23 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+// +k8s:deepcopy-gen=package
+// +k8s:conversion-gen=k8s.io/apiserver/pkg/apis/audit
+// +k8s:openapi-gen=true
+// +k8s:defaulter-gen=TypeMeta
+
+// +groupName=audit.k8s.io
+package v1alpha1 // import "k8s.io/apiserver/pkg/apis/audit/v1alpha1"
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/generated.pb.go b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/generated.pb.go
new file mode 100644
index 0000000..d5494d3
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/generated.pb.go
@@ -0,0 +1,2865 @@
+/*
+Copyright The Kubernetes Authors.
+
+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.
+*/
+
+// Code generated by protoc-gen-gogo.
+// source: k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/generated.proto
+// DO NOT EDIT!
+
+/*
+	Package v1alpha1 is a generated protocol buffer package.
+
+	It is generated from these files:
+		k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/generated.proto
+
+	It has these top-level messages:
+		Event
+		EventList
+		GroupResources
+		ObjectReference
+		Policy
+		PolicyList
+		PolicyRule
+*/
+package v1alpha1
+
+import proto "github.com/gogo/protobuf/proto"
+import fmt "fmt"
+import math "math"
+
+import k8s_io_api_authentication_v1 "k8s.io/api/authentication/v1"
+import k8s_io_apimachinery_pkg_apis_meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+import k8s_io_apimachinery_pkg_runtime "k8s.io/apimachinery/pkg/runtime"
+
+import k8s_io_apimachinery_pkg_types "k8s.io/apimachinery/pkg/types"
+
+import github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys"
+
+import strings "strings"
+import reflect "reflect"
+
+import io "io"
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package
+
+func (m *Event) Reset()                    { *m = Event{} }
+func (*Event) ProtoMessage()               {}
+func (*Event) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{0} }
+
+func (m *EventList) Reset()                    { *m = EventList{} }
+func (*EventList) ProtoMessage()               {}
+func (*EventList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{1} }
+
+func (m *GroupResources) Reset()                    { *m = GroupResources{} }
+func (*GroupResources) ProtoMessage()               {}
+func (*GroupResources) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{2} }
+
+func (m *ObjectReference) Reset()                    { *m = ObjectReference{} }
+func (*ObjectReference) ProtoMessage()               {}
+func (*ObjectReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{3} }
+
+func (m *Policy) Reset()                    { *m = Policy{} }
+func (*Policy) ProtoMessage()               {}
+func (*Policy) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{4} }
+
+func (m *PolicyList) Reset()                    { *m = PolicyList{} }
+func (*PolicyList) ProtoMessage()               {}
+func (*PolicyList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{5} }
+
+func (m *PolicyRule) Reset()                    { *m = PolicyRule{} }
+func (*PolicyRule) ProtoMessage()               {}
+func (*PolicyRule) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{6} }
+
+func init() {
+	proto.RegisterType((*Event)(nil), "k8s.io.apiserver.pkg.apis.audit.v1alpha1.Event")
+	proto.RegisterType((*EventList)(nil), "k8s.io.apiserver.pkg.apis.audit.v1alpha1.EventList")
+	proto.RegisterType((*GroupResources)(nil), "k8s.io.apiserver.pkg.apis.audit.v1alpha1.GroupResources")
+	proto.RegisterType((*ObjectReference)(nil), "k8s.io.apiserver.pkg.apis.audit.v1alpha1.ObjectReference")
+	proto.RegisterType((*Policy)(nil), "k8s.io.apiserver.pkg.apis.audit.v1alpha1.Policy")
+	proto.RegisterType((*PolicyList)(nil), "k8s.io.apiserver.pkg.apis.audit.v1alpha1.PolicyList")
+	proto.RegisterType((*PolicyRule)(nil), "k8s.io.apiserver.pkg.apis.audit.v1alpha1.PolicyRule")
+}
+func (m *Event) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalTo(dAtA)
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *Event) MarshalTo(dAtA []byte) (int, error) {
+	var i int
+	_ = i
+	var l int
+	_ = l
+	dAtA[i] = 0xa
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size()))
+	n1, err := m.ObjectMeta.MarshalTo(dAtA[i:])
+	if err != nil {
+		return 0, err
+	}
+	i += n1
+	dAtA[i] = 0x12
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Level)))
+	i += copy(dAtA[i:], m.Level)
+	dAtA[i] = 0x1a
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(m.Timestamp.Size()))
+	n2, err := m.Timestamp.MarshalTo(dAtA[i:])
+	if err != nil {
+		return 0, err
+	}
+	i += n2
+	dAtA[i] = 0x22
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.AuditID)))
+	i += copy(dAtA[i:], m.AuditID)
+	dAtA[i] = 0x2a
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Stage)))
+	i += copy(dAtA[i:], m.Stage)
+	dAtA[i] = 0x32
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.RequestURI)))
+	i += copy(dAtA[i:], m.RequestURI)
+	dAtA[i] = 0x3a
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Verb)))
+	i += copy(dAtA[i:], m.Verb)
+	dAtA[i] = 0x42
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(m.User.Size()))
+	n3, err := m.User.MarshalTo(dAtA[i:])
+	if err != nil {
+		return 0, err
+	}
+	i += n3
+	if m.ImpersonatedUser != nil {
+		dAtA[i] = 0x4a
+		i++
+		i = encodeVarintGenerated(dAtA, i, uint64(m.ImpersonatedUser.Size()))
+		n4, err := m.ImpersonatedUser.MarshalTo(dAtA[i:])
+		if err != nil {
+			return 0, err
+		}
+		i += n4
+	}
+	if len(m.SourceIPs) > 0 {
+		for _, s := range m.SourceIPs {
+			dAtA[i] = 0x52
+			i++
+			l = len(s)
+			for l >= 1<<7 {
+				dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
+				l >>= 7
+				i++
+			}
+			dAtA[i] = uint8(l)
+			i++
+			i += copy(dAtA[i:], s)
+		}
+	}
+	if m.ObjectRef != nil {
+		dAtA[i] = 0x5a
+		i++
+		i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectRef.Size()))
+		n5, err := m.ObjectRef.MarshalTo(dAtA[i:])
+		if err != nil {
+			return 0, err
+		}
+		i += n5
+	}
+	if m.ResponseStatus != nil {
+		dAtA[i] = 0x62
+		i++
+		i = encodeVarintGenerated(dAtA, i, uint64(m.ResponseStatus.Size()))
+		n6, err := m.ResponseStatus.MarshalTo(dAtA[i:])
+		if err != nil {
+			return 0, err
+		}
+		i += n6
+	}
+	if m.RequestObject != nil {
+		dAtA[i] = 0x6a
+		i++
+		i = encodeVarintGenerated(dAtA, i, uint64(m.RequestObject.Size()))
+		n7, err := m.RequestObject.MarshalTo(dAtA[i:])
+		if err != nil {
+			return 0, err
+		}
+		i += n7
+	}
+	if m.ResponseObject != nil {
+		dAtA[i] = 0x72
+		i++
+		i = encodeVarintGenerated(dAtA, i, uint64(m.ResponseObject.Size()))
+		n8, err := m.ResponseObject.MarshalTo(dAtA[i:])
+		if err != nil {
+			return 0, err
+		}
+		i += n8
+	}
+	dAtA[i] = 0x7a
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(m.RequestReceivedTimestamp.Size()))
+	n9, err := m.RequestReceivedTimestamp.MarshalTo(dAtA[i:])
+	if err != nil {
+		return 0, err
+	}
+	i += n9
+	dAtA[i] = 0x82
+	i++
+	dAtA[i] = 0x1
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(m.StageTimestamp.Size()))
+	n10, err := m.StageTimestamp.MarshalTo(dAtA[i:])
+	if err != nil {
+		return 0, err
+	}
+	i += n10
+	if len(m.Annotations) > 0 {
+		keysForAnnotations := make([]string, 0, len(m.Annotations))
+		for k := range m.Annotations {
+			keysForAnnotations = append(keysForAnnotations, string(k))
+		}
+		github_com_gogo_protobuf_sortkeys.Strings(keysForAnnotations)
+		for _, k := range keysForAnnotations {
+			dAtA[i] = 0x8a
+			i++
+			dAtA[i] = 0x1
+			i++
+			v := m.Annotations[string(k)]
+			mapSize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + len(v) + sovGenerated(uint64(len(v)))
+			i = encodeVarintGenerated(dAtA, i, uint64(mapSize))
+			dAtA[i] = 0xa
+			i++
+			i = encodeVarintGenerated(dAtA, i, uint64(len(k)))
+			i += copy(dAtA[i:], k)
+			dAtA[i] = 0x12
+			i++
+			i = encodeVarintGenerated(dAtA, i, uint64(len(v)))
+			i += copy(dAtA[i:], v)
+		}
+	}
+	return i, nil
+}
+
+func (m *EventList) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalTo(dAtA)
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *EventList) MarshalTo(dAtA []byte) (int, error) {
+	var i int
+	_ = i
+	var l int
+	_ = l
+	dAtA[i] = 0xa
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size()))
+	n11, err := m.ListMeta.MarshalTo(dAtA[i:])
+	if err != nil {
+		return 0, err
+	}
+	i += n11
+	if len(m.Items) > 0 {
+		for _, msg := range m.Items {
+			dAtA[i] = 0x12
+			i++
+			i = encodeVarintGenerated(dAtA, i, uint64(msg.Size()))
+			n, err := msg.MarshalTo(dAtA[i:])
+			if err != nil {
+				return 0, err
+			}
+			i += n
+		}
+	}
+	return i, nil
+}
+
+func (m *GroupResources) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalTo(dAtA)
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *GroupResources) MarshalTo(dAtA []byte) (int, error) {
+	var i int
+	_ = i
+	var l int
+	_ = l
+	dAtA[i] = 0xa
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Group)))
+	i += copy(dAtA[i:], m.Group)
+	if len(m.Resources) > 0 {
+		for _, s := range m.Resources {
+			dAtA[i] = 0x12
+			i++
+			l = len(s)
+			for l >= 1<<7 {
+				dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
+				l >>= 7
+				i++
+			}
+			dAtA[i] = uint8(l)
+			i++
+			i += copy(dAtA[i:], s)
+		}
+	}
+	if len(m.ResourceNames) > 0 {
+		for _, s := range m.ResourceNames {
+			dAtA[i] = 0x1a
+			i++
+			l = len(s)
+			for l >= 1<<7 {
+				dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
+				l >>= 7
+				i++
+			}
+			dAtA[i] = uint8(l)
+			i++
+			i += copy(dAtA[i:], s)
+		}
+	}
+	return i, nil
+}
+
+func (m *ObjectReference) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalTo(dAtA)
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *ObjectReference) MarshalTo(dAtA []byte) (int, error) {
+	var i int
+	_ = i
+	var l int
+	_ = l
+	dAtA[i] = 0xa
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Resource)))
+	i += copy(dAtA[i:], m.Resource)
+	dAtA[i] = 0x12
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Namespace)))
+	i += copy(dAtA[i:], m.Namespace)
+	dAtA[i] = 0x1a
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name)))
+	i += copy(dAtA[i:], m.Name)
+	dAtA[i] = 0x22
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.UID)))
+	i += copy(dAtA[i:], m.UID)
+	dAtA[i] = 0x2a
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.APIVersion)))
+	i += copy(dAtA[i:], m.APIVersion)
+	dAtA[i] = 0x32
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.ResourceVersion)))
+	i += copy(dAtA[i:], m.ResourceVersion)
+	dAtA[i] = 0x3a
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Subresource)))
+	i += copy(dAtA[i:], m.Subresource)
+	return i, nil
+}
+
+func (m *Policy) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalTo(dAtA)
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *Policy) MarshalTo(dAtA []byte) (int, error) {
+	var i int
+	_ = i
+	var l int
+	_ = l
+	dAtA[i] = 0xa
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size()))
+	n12, err := m.ObjectMeta.MarshalTo(dAtA[i:])
+	if err != nil {
+		return 0, err
+	}
+	i += n12
+	if len(m.Rules) > 0 {
+		for _, msg := range m.Rules {
+			dAtA[i] = 0x12
+			i++
+			i = encodeVarintGenerated(dAtA, i, uint64(msg.Size()))
+			n, err := msg.MarshalTo(dAtA[i:])
+			if err != nil {
+				return 0, err
+			}
+			i += n
+		}
+	}
+	if len(m.OmitStages) > 0 {
+		for _, s := range m.OmitStages {
+			dAtA[i] = 0x1a
+			i++
+			l = len(s)
+			for l >= 1<<7 {
+				dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
+				l >>= 7
+				i++
+			}
+			dAtA[i] = uint8(l)
+			i++
+			i += copy(dAtA[i:], s)
+		}
+	}
+	return i, nil
+}
+
+func (m *PolicyList) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalTo(dAtA)
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *PolicyList) MarshalTo(dAtA []byte) (int, error) {
+	var i int
+	_ = i
+	var l int
+	_ = l
+	dAtA[i] = 0xa
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size()))
+	n13, err := m.ListMeta.MarshalTo(dAtA[i:])
+	if err != nil {
+		return 0, err
+	}
+	i += n13
+	if len(m.Items) > 0 {
+		for _, msg := range m.Items {
+			dAtA[i] = 0x12
+			i++
+			i = encodeVarintGenerated(dAtA, i, uint64(msg.Size()))
+			n, err := msg.MarshalTo(dAtA[i:])
+			if err != nil {
+				return 0, err
+			}
+			i += n
+		}
+	}
+	return i, nil
+}
+
+func (m *PolicyRule) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalTo(dAtA)
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *PolicyRule) MarshalTo(dAtA []byte) (int, error) {
+	var i int
+	_ = i
+	var l int
+	_ = l
+	dAtA[i] = 0xa
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Level)))
+	i += copy(dAtA[i:], m.Level)
+	if len(m.Users) > 0 {
+		for _, s := range m.Users {
+			dAtA[i] = 0x12
+			i++
+			l = len(s)
+			for l >= 1<<7 {
+				dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
+				l >>= 7
+				i++
+			}
+			dAtA[i] = uint8(l)
+			i++
+			i += copy(dAtA[i:], s)
+		}
+	}
+	if len(m.UserGroups) > 0 {
+		for _, s := range m.UserGroups {
+			dAtA[i] = 0x1a
+			i++
+			l = len(s)
+			for l >= 1<<7 {
+				dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
+				l >>= 7
+				i++
+			}
+			dAtA[i] = uint8(l)
+			i++
+			i += copy(dAtA[i:], s)
+		}
+	}
+	if len(m.Verbs) > 0 {
+		for _, s := range m.Verbs {
+			dAtA[i] = 0x22
+			i++
+			l = len(s)
+			for l >= 1<<7 {
+				dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
+				l >>= 7
+				i++
+			}
+			dAtA[i] = uint8(l)
+			i++
+			i += copy(dAtA[i:], s)
+		}
+	}
+	if len(m.Resources) > 0 {
+		for _, msg := range m.Resources {
+			dAtA[i] = 0x2a
+			i++
+			i = encodeVarintGenerated(dAtA, i, uint64(msg.Size()))
+			n, err := msg.MarshalTo(dAtA[i:])
+			if err != nil {
+				return 0, err
+			}
+			i += n
+		}
+	}
+	if len(m.Namespaces) > 0 {
+		for _, s := range m.Namespaces {
+			dAtA[i] = 0x32
+			i++
+			l = len(s)
+			for l >= 1<<7 {
+				dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
+				l >>= 7
+				i++
+			}
+			dAtA[i] = uint8(l)
+			i++
+			i += copy(dAtA[i:], s)
+		}
+	}
+	if len(m.NonResourceURLs) > 0 {
+		for _, s := range m.NonResourceURLs {
+			dAtA[i] = 0x3a
+			i++
+			l = len(s)
+			for l >= 1<<7 {
+				dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
+				l >>= 7
+				i++
+			}
+			dAtA[i] = uint8(l)
+			i++
+			i += copy(dAtA[i:], s)
+		}
+	}
+	if len(m.OmitStages) > 0 {
+		for _, s := range m.OmitStages {
+			dAtA[i] = 0x42
+			i++
+			l = len(s)
+			for l >= 1<<7 {
+				dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
+				l >>= 7
+				i++
+			}
+			dAtA[i] = uint8(l)
+			i++
+			i += copy(dAtA[i:], s)
+		}
+	}
+	return i, nil
+}
+
+func encodeFixed64Generated(dAtA []byte, offset int, v uint64) int {
+	dAtA[offset] = uint8(v)
+	dAtA[offset+1] = uint8(v >> 8)
+	dAtA[offset+2] = uint8(v >> 16)
+	dAtA[offset+3] = uint8(v >> 24)
+	dAtA[offset+4] = uint8(v >> 32)
+	dAtA[offset+5] = uint8(v >> 40)
+	dAtA[offset+6] = uint8(v >> 48)
+	dAtA[offset+7] = uint8(v >> 56)
+	return offset + 8
+}
+func encodeFixed32Generated(dAtA []byte, offset int, v uint32) int {
+	dAtA[offset] = uint8(v)
+	dAtA[offset+1] = uint8(v >> 8)
+	dAtA[offset+2] = uint8(v >> 16)
+	dAtA[offset+3] = uint8(v >> 24)
+	return offset + 4
+}
+func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int {
+	for v >= 1<<7 {
+		dAtA[offset] = uint8(v&0x7f | 0x80)
+		v >>= 7
+		offset++
+	}
+	dAtA[offset] = uint8(v)
+	return offset + 1
+}
+func (m *Event) Size() (n int) {
+	var l int
+	_ = l
+	l = m.ObjectMeta.Size()
+	n += 1 + l + sovGenerated(uint64(l))
+	l = len(m.Level)
+	n += 1 + l + sovGenerated(uint64(l))
+	l = m.Timestamp.Size()
+	n += 1 + l + sovGenerated(uint64(l))
+	l = len(m.AuditID)
+	n += 1 + l + sovGenerated(uint64(l))
+	l = len(m.Stage)
+	n += 1 + l + sovGenerated(uint64(l))
+	l = len(m.RequestURI)
+	n += 1 + l + sovGenerated(uint64(l))
+	l = len(m.Verb)
+	n += 1 + l + sovGenerated(uint64(l))
+	l = m.User.Size()
+	n += 1 + l + sovGenerated(uint64(l))
+	if m.ImpersonatedUser != nil {
+		l = m.ImpersonatedUser.Size()
+		n += 1 + l + sovGenerated(uint64(l))
+	}
+	if len(m.SourceIPs) > 0 {
+		for _, s := range m.SourceIPs {
+			l = len(s)
+			n += 1 + l + sovGenerated(uint64(l))
+		}
+	}
+	if m.ObjectRef != nil {
+		l = m.ObjectRef.Size()
+		n += 1 + l + sovGenerated(uint64(l))
+	}
+	if m.ResponseStatus != nil {
+		l = m.ResponseStatus.Size()
+		n += 1 + l + sovGenerated(uint64(l))
+	}
+	if m.RequestObject != nil {
+		l = m.RequestObject.Size()
+		n += 1 + l + sovGenerated(uint64(l))
+	}
+	if m.ResponseObject != nil {
+		l = m.ResponseObject.Size()
+		n += 1 + l + sovGenerated(uint64(l))
+	}
+	l = m.RequestReceivedTimestamp.Size()
+	n += 1 + l + sovGenerated(uint64(l))
+	l = m.StageTimestamp.Size()
+	n += 2 + l + sovGenerated(uint64(l))
+	if len(m.Annotations) > 0 {
+		for k, v := range m.Annotations {
+			_ = k
+			_ = v
+			mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + len(v) + sovGenerated(uint64(len(v)))
+			n += mapEntrySize + 2 + sovGenerated(uint64(mapEntrySize))
+		}
+	}
+	return n
+}
+
+func (m *EventList) Size() (n int) {
+	var l int
+	_ = l
+	l = m.ListMeta.Size()
+	n += 1 + l + sovGenerated(uint64(l))
+	if len(m.Items) > 0 {
+		for _, e := range m.Items {
+			l = e.Size()
+			n += 1 + l + sovGenerated(uint64(l))
+		}
+	}
+	return n
+}
+
+func (m *GroupResources) Size() (n int) {
+	var l int
+	_ = l
+	l = len(m.Group)
+	n += 1 + l + sovGenerated(uint64(l))
+	if len(m.Resources) > 0 {
+		for _, s := range m.Resources {
+			l = len(s)
+			n += 1 + l + sovGenerated(uint64(l))
+		}
+	}
+	if len(m.ResourceNames) > 0 {
+		for _, s := range m.ResourceNames {
+			l = len(s)
+			n += 1 + l + sovGenerated(uint64(l))
+		}
+	}
+	return n
+}
+
+func (m *ObjectReference) Size() (n int) {
+	var l int
+	_ = l
+	l = len(m.Resource)
+	n += 1 + l + sovGenerated(uint64(l))
+	l = len(m.Namespace)
+	n += 1 + l + sovGenerated(uint64(l))
+	l = len(m.Name)
+	n += 1 + l + sovGenerated(uint64(l))
+	l = len(m.UID)
+	n += 1 + l + sovGenerated(uint64(l))
+	l = len(m.APIVersion)
+	n += 1 + l + sovGenerated(uint64(l))
+	l = len(m.ResourceVersion)
+	n += 1 + l + sovGenerated(uint64(l))
+	l = len(m.Subresource)
+	n += 1 + l + sovGenerated(uint64(l))
+	return n
+}
+
+func (m *Policy) Size() (n int) {
+	var l int
+	_ = l
+	l = m.ObjectMeta.Size()
+	n += 1 + l + sovGenerated(uint64(l))
+	if len(m.Rules) > 0 {
+		for _, e := range m.Rules {
+			l = e.Size()
+			n += 1 + l + sovGenerated(uint64(l))
+		}
+	}
+	if len(m.OmitStages) > 0 {
+		for _, s := range m.OmitStages {
+			l = len(s)
+			n += 1 + l + sovGenerated(uint64(l))
+		}
+	}
+	return n
+}
+
+func (m *PolicyList) Size() (n int) {
+	var l int
+	_ = l
+	l = m.ListMeta.Size()
+	n += 1 + l + sovGenerated(uint64(l))
+	if len(m.Items) > 0 {
+		for _, e := range m.Items {
+			l = e.Size()
+			n += 1 + l + sovGenerated(uint64(l))
+		}
+	}
+	return n
+}
+
+func (m *PolicyRule) Size() (n int) {
+	var l int
+	_ = l
+	l = len(m.Level)
+	n += 1 + l + sovGenerated(uint64(l))
+	if len(m.Users) > 0 {
+		for _, s := range m.Users {
+			l = len(s)
+			n += 1 + l + sovGenerated(uint64(l))
+		}
+	}
+	if len(m.UserGroups) > 0 {
+		for _, s := range m.UserGroups {
+			l = len(s)
+			n += 1 + l + sovGenerated(uint64(l))
+		}
+	}
+	if len(m.Verbs) > 0 {
+		for _, s := range m.Verbs {
+			l = len(s)
+			n += 1 + l + sovGenerated(uint64(l))
+		}
+	}
+	if len(m.Resources) > 0 {
+		for _, e := range m.Resources {
+			l = e.Size()
+			n += 1 + l + sovGenerated(uint64(l))
+		}
+	}
+	if len(m.Namespaces) > 0 {
+		for _, s := range m.Namespaces {
+			l = len(s)
+			n += 1 + l + sovGenerated(uint64(l))
+		}
+	}
+	if len(m.NonResourceURLs) > 0 {
+		for _, s := range m.NonResourceURLs {
+			l = len(s)
+			n += 1 + l + sovGenerated(uint64(l))
+		}
+	}
+	if len(m.OmitStages) > 0 {
+		for _, s := range m.OmitStages {
+			l = len(s)
+			n += 1 + l + sovGenerated(uint64(l))
+		}
+	}
+	return n
+}
+
+func sovGenerated(x uint64) (n int) {
+	for {
+		n++
+		x >>= 7
+		if x == 0 {
+			break
+		}
+	}
+	return n
+}
+func sozGenerated(x uint64) (n int) {
+	return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63))))
+}
+func (this *Event) String() string {
+	if this == nil {
+		return "nil"
+	}
+	keysForAnnotations := make([]string, 0, len(this.Annotations))
+	for k := range this.Annotations {
+		keysForAnnotations = append(keysForAnnotations, k)
+	}
+	github_com_gogo_protobuf_sortkeys.Strings(keysForAnnotations)
+	mapStringForAnnotations := "map[string]string{"
+	for _, k := range keysForAnnotations {
+		mapStringForAnnotations += fmt.Sprintf("%v: %v,", k, this.Annotations[k])
+	}
+	mapStringForAnnotations += "}"
+	s := strings.Join([]string{`&Event{`,
+		`ObjectMeta:` + strings.Replace(strings.Replace(this.ObjectMeta.String(), "ObjectMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ObjectMeta", 1), `&`, ``, 1) + `,`,
+		`Level:` + fmt.Sprintf("%v", this.Level) + `,`,
+		`Timestamp:` + strings.Replace(strings.Replace(this.Timestamp.String(), "Time", "k8s_io_apimachinery_pkg_apis_meta_v1.Time", 1), `&`, ``, 1) + `,`,
+		`AuditID:` + fmt.Sprintf("%v", this.AuditID) + `,`,
+		`Stage:` + fmt.Sprintf("%v", this.Stage) + `,`,
+		`RequestURI:` + fmt.Sprintf("%v", this.RequestURI) + `,`,
+		`Verb:` + fmt.Sprintf("%v", this.Verb) + `,`,
+		`User:` + strings.Replace(strings.Replace(this.User.String(), "UserInfo", "k8s_io_api_authentication_v1.UserInfo", 1), `&`, ``, 1) + `,`,
+		`ImpersonatedUser:` + strings.Replace(fmt.Sprintf("%v", this.ImpersonatedUser), "UserInfo", "k8s_io_api_authentication_v1.UserInfo", 1) + `,`,
+		`SourceIPs:` + fmt.Sprintf("%v", this.SourceIPs) + `,`,
+		`ObjectRef:` + strings.Replace(fmt.Sprintf("%v", this.ObjectRef), "ObjectReference", "ObjectReference", 1) + `,`,
+		`ResponseStatus:` + strings.Replace(fmt.Sprintf("%v", this.ResponseStatus), "Status", "k8s_io_apimachinery_pkg_apis_meta_v1.Status", 1) + `,`,
+		`RequestObject:` + strings.Replace(fmt.Sprintf("%v", this.RequestObject), "Unknown", "k8s_io_apimachinery_pkg_runtime.Unknown", 1) + `,`,
+		`ResponseObject:` + strings.Replace(fmt.Sprintf("%v", this.ResponseObject), "Unknown", "k8s_io_apimachinery_pkg_runtime.Unknown", 1) + `,`,
+		`RequestReceivedTimestamp:` + strings.Replace(strings.Replace(this.RequestReceivedTimestamp.String(), "MicroTime", "k8s_io_apimachinery_pkg_apis_meta_v1.MicroTime", 1), `&`, ``, 1) + `,`,
+		`StageTimestamp:` + strings.Replace(strings.Replace(this.StageTimestamp.String(), "MicroTime", "k8s_io_apimachinery_pkg_apis_meta_v1.MicroTime", 1), `&`, ``, 1) + `,`,
+		`Annotations:` + mapStringForAnnotations + `,`,
+		`}`,
+	}, "")
+	return s
+}
+func (this *EventList) String() string {
+	if this == nil {
+		return "nil"
+	}
+	s := strings.Join([]string{`&EventList{`,
+		`ListMeta:` + strings.Replace(strings.Replace(this.ListMeta.String(), "ListMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ListMeta", 1), `&`, ``, 1) + `,`,
+		`Items:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Items), "Event", "Event", 1), `&`, ``, 1) + `,`,
+		`}`,
+	}, "")
+	return s
+}
+func (this *GroupResources) String() string {
+	if this == nil {
+		return "nil"
+	}
+	s := strings.Join([]string{`&GroupResources{`,
+		`Group:` + fmt.Sprintf("%v", this.Group) + `,`,
+		`Resources:` + fmt.Sprintf("%v", this.Resources) + `,`,
+		`ResourceNames:` + fmt.Sprintf("%v", this.ResourceNames) + `,`,
+		`}`,
+	}, "")
+	return s
+}
+func (this *ObjectReference) String() string {
+	if this == nil {
+		return "nil"
+	}
+	s := strings.Join([]string{`&ObjectReference{`,
+		`Resource:` + fmt.Sprintf("%v", this.Resource) + `,`,
+		`Namespace:` + fmt.Sprintf("%v", this.Namespace) + `,`,
+		`Name:` + fmt.Sprintf("%v", this.Name) + `,`,
+		`UID:` + fmt.Sprintf("%v", this.UID) + `,`,
+		`APIVersion:` + fmt.Sprintf("%v", this.APIVersion) + `,`,
+		`ResourceVersion:` + fmt.Sprintf("%v", this.ResourceVersion) + `,`,
+		`Subresource:` + fmt.Sprintf("%v", this.Subresource) + `,`,
+		`}`,
+	}, "")
+	return s
+}
+func (this *Policy) String() string {
+	if this == nil {
+		return "nil"
+	}
+	s := strings.Join([]string{`&Policy{`,
+		`ObjectMeta:` + strings.Replace(strings.Replace(this.ObjectMeta.String(), "ObjectMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ObjectMeta", 1), `&`, ``, 1) + `,`,
+		`Rules:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Rules), "PolicyRule", "PolicyRule", 1), `&`, ``, 1) + `,`,
+		`OmitStages:` + fmt.Sprintf("%v", this.OmitStages) + `,`,
+		`}`,
+	}, "")
+	return s
+}
+func (this *PolicyList) String() string {
+	if this == nil {
+		return "nil"
+	}
+	s := strings.Join([]string{`&PolicyList{`,
+		`ListMeta:` + strings.Replace(strings.Replace(this.ListMeta.String(), "ListMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ListMeta", 1), `&`, ``, 1) + `,`,
+		`Items:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Items), "Policy", "Policy", 1), `&`, ``, 1) + `,`,
+		`}`,
+	}, "")
+	return s
+}
+func (this *PolicyRule) String() string {
+	if this == nil {
+		return "nil"
+	}
+	s := strings.Join([]string{`&PolicyRule{`,
+		`Level:` + fmt.Sprintf("%v", this.Level) + `,`,
+		`Users:` + fmt.Sprintf("%v", this.Users) + `,`,
+		`UserGroups:` + fmt.Sprintf("%v", this.UserGroups) + `,`,
+		`Verbs:` + fmt.Sprintf("%v", this.Verbs) + `,`,
+		`Resources:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Resources), "GroupResources", "GroupResources", 1), `&`, ``, 1) + `,`,
+		`Namespaces:` + fmt.Sprintf("%v", this.Namespaces) + `,`,
+		`NonResourceURLs:` + fmt.Sprintf("%v", this.NonResourceURLs) + `,`,
+		`OmitStages:` + fmt.Sprintf("%v", this.OmitStages) + `,`,
+		`}`,
+	}, "")
+	return s
+}
+func valueToStringGenerated(v interface{}) string {
+	rv := reflect.ValueOf(v)
+	if rv.IsNil() {
+		return "nil"
+	}
+	pv := reflect.Indirect(rv).Interface()
+	return fmt.Sprintf("*%v", pv)
+}
+func (m *Event) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowGenerated
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= (uint64(b) & 0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: Event: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: Event: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 2:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Level", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Level = Level(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 3:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if err := m.Timestamp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 4:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field AuditID", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.AuditID = k8s_io_apimachinery_pkg_types.UID(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 5:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Stage", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Stage = Stage(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 6:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field RequestURI", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.RequestURI = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 7:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Verb", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Verb = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 8:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field User", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if err := m.User.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 9:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field ImpersonatedUser", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if m.ImpersonatedUser == nil {
+				m.ImpersonatedUser = &k8s_io_api_authentication_v1.UserInfo{}
+			}
+			if err := m.ImpersonatedUser.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 10:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field SourceIPs", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.SourceIPs = append(m.SourceIPs, string(dAtA[iNdEx:postIndex]))
+			iNdEx = postIndex
+		case 11:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field ObjectRef", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if m.ObjectRef == nil {
+				m.ObjectRef = &ObjectReference{}
+			}
+			if err := m.ObjectRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 12:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field ResponseStatus", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if m.ResponseStatus == nil {
+				m.ResponseStatus = &k8s_io_apimachinery_pkg_apis_meta_v1.Status{}
+			}
+			if err := m.ResponseStatus.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 13:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field RequestObject", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if m.RequestObject == nil {
+				m.RequestObject = &k8s_io_apimachinery_pkg_runtime.Unknown{}
+			}
+			if err := m.RequestObject.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 14:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field ResponseObject", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if m.ResponseObject == nil {
+				m.ResponseObject = &k8s_io_apimachinery_pkg_runtime.Unknown{}
+			}
+			if err := m.ResponseObject.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 15:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field RequestReceivedTimestamp", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if err := m.RequestReceivedTimestamp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 16:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field StageTimestamp", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if err := m.StageTimestamp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 17:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Annotations", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			var keykey uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				keykey |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			var stringLenmapkey uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLenmapkey |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLenmapkey := int(stringLenmapkey)
+			if intStringLenmapkey < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postStringIndexmapkey := iNdEx + intStringLenmapkey
+			if postStringIndexmapkey > l {
+				return io.ErrUnexpectedEOF
+			}
+			mapkey := string(dAtA[iNdEx:postStringIndexmapkey])
+			iNdEx = postStringIndexmapkey
+			if m.Annotations == nil {
+				m.Annotations = make(map[string]string)
+			}
+			if iNdEx < postIndex {
+				var valuekey uint64
+				for shift := uint(0); ; shift += 7 {
+					if shift >= 64 {
+						return ErrIntOverflowGenerated
+					}
+					if iNdEx >= l {
+						return io.ErrUnexpectedEOF
+					}
+					b := dAtA[iNdEx]
+					iNdEx++
+					valuekey |= (uint64(b) & 0x7F) << shift
+					if b < 0x80 {
+						break
+					}
+				}
+				var stringLenmapvalue uint64
+				for shift := uint(0); ; shift += 7 {
+					if shift >= 64 {
+						return ErrIntOverflowGenerated
+					}
+					if iNdEx >= l {
+						return io.ErrUnexpectedEOF
+					}
+					b := dAtA[iNdEx]
+					iNdEx++
+					stringLenmapvalue |= (uint64(b) & 0x7F) << shift
+					if b < 0x80 {
+						break
+					}
+				}
+				intStringLenmapvalue := int(stringLenmapvalue)
+				if intStringLenmapvalue < 0 {
+					return ErrInvalidLengthGenerated
+				}
+				postStringIndexmapvalue := iNdEx + intStringLenmapvalue
+				if postStringIndexmapvalue > l {
+					return io.ErrUnexpectedEOF
+				}
+				mapvalue := string(dAtA[iNdEx:postStringIndexmapvalue])
+				iNdEx = postStringIndexmapvalue
+				m.Annotations[mapkey] = mapvalue
+			} else {
+				var mapvalue string
+				m.Annotations[mapkey] = mapvalue
+			}
+			iNdEx = postIndex
+		default:
+			iNdEx = preIndex
+			skippy, err := skipGenerated(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
+func (m *EventList) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowGenerated
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= (uint64(b) & 0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: EventList: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: EventList: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 2:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Items = append(m.Items, Event{})
+			if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		default:
+			iNdEx = preIndex
+			skippy, err := skipGenerated(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
+func (m *GroupResources) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowGenerated
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= (uint64(b) & 0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: GroupResources: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: GroupResources: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Group", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Group = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 2:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Resources", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Resources = append(m.Resources, string(dAtA[iNdEx:postIndex]))
+			iNdEx = postIndex
+		case 3:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field ResourceNames", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.ResourceNames = append(m.ResourceNames, string(dAtA[iNdEx:postIndex]))
+			iNdEx = postIndex
+		default:
+			iNdEx = preIndex
+			skippy, err := skipGenerated(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
+func (m *ObjectReference) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowGenerated
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= (uint64(b) & 0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: ObjectReference: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: ObjectReference: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Resource", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Resource = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 2:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Namespace = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 3:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Name = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 4:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field UID", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.UID = k8s_io_apimachinery_pkg_types.UID(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 5:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field APIVersion", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.APIVersion = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 6:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field ResourceVersion", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.ResourceVersion = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 7:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Subresource", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Subresource = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		default:
+			iNdEx = preIndex
+			skippy, err := skipGenerated(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
+func (m *Policy) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowGenerated
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= (uint64(b) & 0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: Policy: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: Policy: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 2:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Rules", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Rules = append(m.Rules, PolicyRule{})
+			if err := m.Rules[len(m.Rules)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 3:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field OmitStages", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.OmitStages = append(m.OmitStages, Stage(dAtA[iNdEx:postIndex]))
+			iNdEx = postIndex
+		default:
+			iNdEx = preIndex
+			skippy, err := skipGenerated(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
+func (m *PolicyList) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowGenerated
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= (uint64(b) & 0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: PolicyList: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: PolicyList: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 2:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Items = append(m.Items, Policy{})
+			if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		default:
+			iNdEx = preIndex
+			skippy, err := skipGenerated(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
+func (m *PolicyRule) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowGenerated
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= (uint64(b) & 0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: PolicyRule: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: PolicyRule: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Level", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Level = Level(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 2:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Users", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Users = append(m.Users, string(dAtA[iNdEx:postIndex]))
+			iNdEx = postIndex
+		case 3:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field UserGroups", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.UserGroups = append(m.UserGroups, string(dAtA[iNdEx:postIndex]))
+			iNdEx = postIndex
+		case 4:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Verbs", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Verbs = append(m.Verbs, string(dAtA[iNdEx:postIndex]))
+			iNdEx = postIndex
+		case 5:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Resources", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Resources = append(m.Resources, GroupResources{})
+			if err := m.Resources[len(m.Resources)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 6:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Namespaces", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Namespaces = append(m.Namespaces, string(dAtA[iNdEx:postIndex]))
+			iNdEx = postIndex
+		case 7:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field NonResourceURLs", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.NonResourceURLs = append(m.NonResourceURLs, string(dAtA[iNdEx:postIndex]))
+			iNdEx = postIndex
+		case 8:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field OmitStages", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.OmitStages = append(m.OmitStages, Stage(dAtA[iNdEx:postIndex]))
+			iNdEx = postIndex
+		default:
+			iNdEx = preIndex
+			skippy, err := skipGenerated(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
+func skipGenerated(dAtA []byte) (n int, err error) {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return 0, ErrIntOverflowGenerated
+			}
+			if iNdEx >= l {
+				return 0, io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= (uint64(b) & 0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		wireType := int(wire & 0x7)
+		switch wireType {
+		case 0:
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return 0, ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return 0, io.ErrUnexpectedEOF
+				}
+				iNdEx++
+				if dAtA[iNdEx-1] < 0x80 {
+					break
+				}
+			}
+			return iNdEx, nil
+		case 1:
+			iNdEx += 8
+			return iNdEx, nil
+		case 2:
+			var length int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return 0, ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return 0, io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				length |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			iNdEx += length
+			if length < 0 {
+				return 0, ErrInvalidLengthGenerated
+			}
+			return iNdEx, nil
+		case 3:
+			for {
+				var innerWire uint64
+				var start int = iNdEx
+				for shift := uint(0); ; shift += 7 {
+					if shift >= 64 {
+						return 0, ErrIntOverflowGenerated
+					}
+					if iNdEx >= l {
+						return 0, io.ErrUnexpectedEOF
+					}
+					b := dAtA[iNdEx]
+					iNdEx++
+					innerWire |= (uint64(b) & 0x7F) << shift
+					if b < 0x80 {
+						break
+					}
+				}
+				innerWireType := int(innerWire & 0x7)
+				if innerWireType == 4 {
+					break
+				}
+				next, err := skipGenerated(dAtA[start:])
+				if err != nil {
+					return 0, err
+				}
+				iNdEx = start + next
+			}
+			return iNdEx, nil
+		case 4:
+			return iNdEx, nil
+		case 5:
+			iNdEx += 4
+			return iNdEx, nil
+		default:
+			return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
+		}
+	}
+	panic("unreachable")
+}
+
+var (
+	ErrInvalidLengthGenerated = fmt.Errorf("proto: negative length found during unmarshaling")
+	ErrIntOverflowGenerated   = fmt.Errorf("proto: integer overflow")
+)
+
+func init() {
+	proto.RegisterFile("k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/generated.proto", fileDescriptorGenerated)
+}
+
+var fileDescriptorGenerated = []byte{
+	// 1258 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0xcf, 0x6f, 0x1b, 0xc5,
+	0x17, 0xcf, 0xd6, 0x71, 0x63, 0x8f, 0x1b, 0xc7, 0x99, 0x56, 0xdf, 0xae, 0x72, 0xb0, 0xfd, 0x35,
+	0x12, 0xb2, 0x20, 0xec, 0x26, 0x21, 0xd0, 0x80, 0x04, 0x22, 0x56, 0x2b, 0xb0, 0x94, 0x86, 0x30,
+	0x89, 0x2b, 0xf1, 0xe3, 0xc0, 0xda, 0x7e, 0xb1, 0x17, 0xdb, 0xbb, 0xcb, 0xcc, 0xac, 0xab, 0xdc,
+	0x38, 0x70, 0x45, 0xe2, 0xce, 0x1f, 0x53, 0x71, 0xcb, 0xb1, 0xc7, 0x9e, 0x2c, 0x62, 0xfe, 0x8b,
+	0x1c, 0x2a, 0x34, 0xb3, 0xb3, 0x3b, 0x6b, 0xa7, 0x16, 0x0e, 0x87, 0xde, 0x76, 0xde, 0xfb, 0xbc,
+	0xcf, 0x7b, 0xf3, 0xf6, 0xfd, 0x18, 0xf4, 0xcd, 0xe0, 0x80, 0x59, 0xae, 0x6f, 0x0f, 0xc2, 0x36,
+	0x50, 0x0f, 0x38, 0x30, 0x7b, 0x0c, 0x5e, 0xd7, 0xa7, 0xb6, 0x52, 0x38, 0x81, 0xcb, 0x80, 0x8e,
+	0x81, 0xda, 0xc1, 0xa0, 0x27, 0x4f, 0xb6, 0x13, 0x76, 0x5d, 0x6e, 0x8f, 0x77, 0x9d, 0x61, 0xd0,
+	0x77, 0x76, 0xed, 0x1e, 0x78, 0x40, 0x1d, 0x0e, 0x5d, 0x2b, 0xa0, 0x3e, 0xf7, 0x71, 0x3d, 0xb2,
+	0xb4, 0x12, 0x4b, 0x2b, 0x18, 0xf4, 0xe4, 0xc9, 0x92, 0x96, 0x56, 0x6c, 0xb9, 0xf5, 0x41, 0xcf,
+	0xe5, 0xfd, 0xb0, 0x6d, 0x75, 0xfc, 0x91, 0xdd, 0xf3, 0x7b, 0xbe, 0x2d, 0x09, 0xda, 0xe1, 0xb9,
+	0x3c, 0xc9, 0x83, 0xfc, 0x8a, 0x88, 0xb7, 0xb6, 0x75, 0x48, 0xb6, 0x13, 0xf2, 0x3e, 0x78, 0xdc,
+	0xed, 0x38, 0xdc, 0xf5, 0x3d, 0x7b, 0x7c, 0x23, 0x8c, 0xad, 0x7d, 0x8d, 0x1e, 0x39, 0x9d, 0xbe,
+	0xeb, 0x01, 0xbd, 0xd0, 0x77, 0x18, 0x01, 0x77, 0xde, 0x64, 0x65, 0x2f, 0xb2, 0xa2, 0xa1, 0xc7,
+	0xdd, 0x11, 0xdc, 0x30, 0xf8, 0xf8, 0xdf, 0x0c, 0x58, 0xa7, 0x0f, 0x23, 0xe7, 0x86, 0xdd, 0x87,
+	0x8b, 0xec, 0x42, 0xee, 0x0e, 0x6d, 0xd7, 0xe3, 0x8c, 0xd3, 0x79, 0xa3, 0xda, 0xeb, 0x02, 0xca,
+	0x3e, 0x19, 0x83, 0xc7, 0xf1, 0x8f, 0x28, 0x27, 0xae, 0xd0, 0x75, 0xb8, 0x63, 0x1a, 0x55, 0xa3,
+	0x5e, 0xd8, 0xdb, 0xb1, 0x74, 0xde, 0x13, 0x46, 0x9d, 0x7a, 0x81, 0xb6, 0xc6, 0xbb, 0xd6, 0xd7,
+	0xed, 0x9f, 0xa0, 0xc3, 0x9f, 0x02, 0x77, 0x1a, 0xf8, 0x72, 0x52, 0x59, 0x99, 0x4e, 0x2a, 0x48,
+	0xcb, 0x48, 0xc2, 0x8a, 0xb7, 0x51, 0x76, 0x08, 0x63, 0x18, 0x9a, 0x77, 0xaa, 0x46, 0x3d, 0xdf,
+	0xf8, 0x9f, 0x02, 0x67, 0x8f, 0x84, 0xf0, 0x3a, 0xfe, 0x20, 0x11, 0x08, 0x7f, 0x8f, 0xf2, 0xe2,
+	0xb6, 0x8c, 0x3b, 0xa3, 0xc0, 0xcc, 0xc8, 0x80, 0xde, 0x5b, 0x2e, 0xa0, 0x33, 0x77, 0x04, 0x8d,
+	0x4d, 0xc5, 0x9e, 0x3f, 0x8b, 0x49, 0x88, 0xe6, 0xc3, 0xc7, 0x68, 0x4d, 0x56, 0x4e, 0xf3, 0xb1,
+	0xb9, 0x2a, 0x83, 0xd9, 0x57, 0xf0, 0xb5, 0xc3, 0x48, 0x7c, 0x3d, 0xa9, 0xfc, 0x7f, 0x51, 0x3e,
+	0xf9, 0x45, 0x00, 0xcc, 0x6a, 0x35, 0x1f, 0x93, 0x98, 0x44, 0x5c, 0x8d, 0x71, 0xa7, 0x07, 0x66,
+	0x76, 0xf6, 0x6a, 0xa7, 0x42, 0x78, 0x1d, 0x7f, 0x90, 0x08, 0x84, 0xf7, 0x10, 0xa2, 0xf0, 0x73,
+	0x08, 0x8c, 0xb7, 0x48, 0xd3, 0xbc, 0x2b, 0x4d, 0x92, 0xd4, 0x91, 0x44, 0x43, 0x52, 0x28, 0x5c,
+	0x45, 0xab, 0x63, 0xa0, 0x6d, 0x73, 0x4d, 0xa2, 0xef, 0x29, 0xf4, 0xea, 0x33, 0xa0, 0x6d, 0x22,
+	0x35, 0xf8, 0x2b, 0xb4, 0x1a, 0x32, 0xa0, 0x66, 0x4e, 0xe6, 0xea, 0xdd, 0x54, 0xae, 0xac, 0xd9,
+	0xda, 0x16, 0x39, 0x6a, 0x31, 0xa0, 0x4d, 0xef, 0xdc, 0xd7, 0x4c, 0x42, 0x42, 0x24, 0x03, 0xee,
+	0xa3, 0x92, 0x3b, 0x0a, 0x80, 0x32, 0xdf, 0x13, 0xa5, 0x22, 0x34, 0x66, 0xfe, 0x56, 0xac, 0x0f,
+	0xa6, 0x93, 0x4a, 0xa9, 0x39, 0xc7, 0x41, 0x6e, 0xb0, 0xe2, 0xf7, 0x51, 0x9e, 0xf9, 0x21, 0xed,
+	0x40, 0xf3, 0x84, 0x99, 0xa8, 0x9a, 0xa9, 0xe7, 0x1b, 0xeb, 0xe2, 0xa7, 0x9d, 0xc6, 0x42, 0xa2,
+	0xf5, 0xf8, 0x1c, 0xe5, 0x7d, 0x59, 0x57, 0x04, 0xce, 0xcd, 0x82, 0x8c, 0xe7, 0x13, 0x6b, 0xd9,
+	0xd1, 0xa0, 0xca, 0x94, 0xc0, 0x39, 0x50, 0xf0, 0x3a, 0x10, 0xf9, 0x49, 0x84, 0x44, 0x53, 0xe3,
+	0x3e, 0x2a, 0x52, 0x60, 0x81, 0xef, 0x31, 0x38, 0xe5, 0x0e, 0x0f, 0x99, 0x79, 0x4f, 0x3a, 0xdb,
+	0x5e, 0xae, 0xfc, 0x22, 0x9b, 0x06, 0x9e, 0x4e, 0x2a, 0x45, 0x32, 0xc3, 0x43, 0xe6, 0x78, 0xb1,
+	0x83, 0xd6, 0xd5, 0x2f, 0x8e, 0x02, 0x31, 0xd7, 0xa5, 0xa3, 0xfa, 0x42, 0x47, 0x6a, 0x04, 0x58,
+	0x2d, 0x6f, 0xe0, 0xf9, 0xcf, 0xbd, 0xc6, 0xe6, 0x74, 0x52, 0x59, 0x27, 0x69, 0x0a, 0x32, 0xcb,
+	0x88, 0xbb, 0xfa, 0x32, 0xca, 0x47, 0xf1, 0x96, 0x3e, 0x66, 0x2e, 0xa2, 0x9c, 0xcc, 0x71, 0xe2,
+	0xdf, 0x0c, 0x64, 0x2a, 0xbf, 0x04, 0x3a, 0xe0, 0x8e, 0xa1, 0x9b, 0xf4, 0x9d, 0xb9, 0x21, 0x1d,
+	0xda, 0xcb, 0x65, 0xef, 0xa9, 0xdb, 0xa1, 0xbe, 0xec, 0xe0, 0xaa, 0xaa, 0x4c, 0x93, 0x2c, 0x20,
+	0x26, 0x0b, 0x5d, 0x62, 0x1f, 0x15, 0x65, 0xab, 0xe9, 0x20, 0x4a, 0xff, 0x2d, 0x88, 0xb8, 0x93,
+	0x8b, 0xa7, 0x33, 0x74, 0x64, 0x8e, 0x1e, 0x3f, 0x47, 0x05, 0xc7, 0xf3, 0x7c, 0x2e, 0x5b, 0x81,
+	0x99, 0x9b, 0xd5, 0x4c, 0xbd, 0xb0, 0xf7, 0xc5, 0xf2, 0xd5, 0x29, 0x67, 0xb0, 0x75, 0xa8, 0x29,
+	0x9e, 0x78, 0x9c, 0x5e, 0x34, 0xee, 0x2b, 0xf7, 0x85, 0x94, 0x86, 0xa4, 0x3d, 0x6d, 0x7d, 0x8e,
+	0x4a, 0xf3, 0x56, 0xb8, 0x84, 0x32, 0x03, 0xb8, 0x90, 0x53, 0x3c, 0x4f, 0xc4, 0x27, 0x7e, 0x80,
+	0xb2, 0x63, 0x67, 0x18, 0x42, 0x34, 0x7a, 0x49, 0x74, 0xf8, 0xf4, 0xce, 0x81, 0x51, 0x7b, 0x61,
+	0xa0, 0xbc, 0x74, 0x7e, 0xe4, 0x32, 0x8e, 0x7f, 0xb8, 0xb1, 0x04, 0xac, 0xe5, 0x32, 0x26, 0xac,
+	0xe5, 0x0a, 0x28, 0xa9, 0x88, 0x73, 0xb1, 0x24, 0xb5, 0x00, 0xce, 0x50, 0xd6, 0xe5, 0x30, 0x62,
+	0xe6, 0x1d, 0x99, 0x1e, 0xfb, 0x96, 0xe9, 0x69, 0xac, 0xc7, 0x63, 0xb5, 0x29, 0x58, 0x48, 0x44,
+	0x56, 0xfb, 0xc3, 0x40, 0xc5, 0x2f, 0xa9, 0x1f, 0x06, 0x04, 0xa2, 0x59, 0xc1, 0xf0, 0x3b, 0x28,
+	0xdb, 0x13, 0x92, 0x28, 0x05, 0xda, 0x2e, 0x82, 0x45, 0x3a, 0x31, 0x7b, 0x68, 0x6c, 0x21, 0x23,
+	0x52, 0xb3, 0x27, 0xa1, 0x21, 0x5a, 0x8f, 0x1f, 0x89, 0x4e, 0x8d, 0x0e, 0xc7, 0xce, 0x08, 0x98,
+	0x99, 0x91, 0x06, 0xaa, 0xff, 0x52, 0x0a, 0x32, 0x8b, 0xab, 0xfd, 0x9a, 0x41, 0x1b, 0x73, 0xa3,
+	0x07, 0x6f, 0xa3, 0x5c, 0x0c, 0x52, 0x11, 0x26, 0x59, 0x8b, 0xb9, 0x48, 0x82, 0xc0, 0x36, 0xca,
+	0x7b, 0x82, 0x2a, 0x70, 0x3a, 0xea, 0xff, 0xe9, 0xe5, 0x76, 0x1c, 0x2b, 0x88, 0xc6, 0x88, 0x55,
+	0x21, 0x0e, 0x72, 0x69, 0xa6, 0x56, 0x85, 0xc0, 0x12, 0xa9, 0xc1, 0x0d, 0x94, 0x09, 0xdd, 0xae,
+	0x5a, 0x7d, 0x3b, 0x0a, 0x90, 0x69, 0x2d, 0xbb, 0xf6, 0x84, 0xb1, 0x58, 0x62, 0x4e, 0xe0, 0x3e,
+	0x03, 0xca, 0x5c, 0xdf, 0x53, 0x7b, 0x2f, 0x59, 0x62, 0x87, 0x27, 0x4d, 0xa5, 0x21, 0x29, 0x14,
+	0x3e, 0x44, 0x1b, 0xf1, 0xb5, 0x62, 0xc3, 0x68, 0xfb, 0x3d, 0x54, 0x86, 0x1b, 0x64, 0x56, 0x4d,
+	0xe6, 0xf1, 0xf8, 0x23, 0x54, 0x60, 0x61, 0x3b, 0x49, 0x5f, 0xb4, 0x0e, 0x93, 0x36, 0x39, 0xd5,
+	0x2a, 0x92, 0xc6, 0xd5, 0x5e, 0x1b, 0xe8, 0xee, 0x89, 0x3f, 0x74, 0x3b, 0x17, 0x6f, 0xe1, 0xa1,
+	0xf3, 0x2d, 0xca, 0xd2, 0x70, 0x08, 0x71, 0x9d, 0xef, 0x2f, 0x5f, 0xe7, 0x51, 0x88, 0x24, 0x1c,
+	0x82, 0x2e, 0x5a, 0x71, 0x62, 0x24, 0x62, 0xc4, 0x8f, 0x10, 0xf2, 0x47, 0x2e, 0x97, 0xd3, 0x28,
+	0x2e, 0xc2, 0x87, 0x32, 0x90, 0x44, 0xaa, 0x9f, 0x1b, 0x29, 0x68, 0xed, 0x4f, 0x03, 0xa1, 0x88,
+	0xfd, 0x2d, 0x34, 0x7a, 0x6b, 0xb6, 0xd1, 0x77, 0x6e, 0x9b, 0x80, 0x05, 0x9d, 0xfe, 0x22, 0x13,
+	0xdf, 0x41, 0xe4, 0x44, 0xbf, 0x27, 0x8d, 0x65, 0xde, 0x93, 0x15, 0x94, 0x15, 0x8f, 0x9b, 0xb8,
+	0xd5, 0xf3, 0x02, 0x29, 0xde, 0x20, 0x8c, 0x44, 0x72, 0x6c, 0x21, 0x24, 0x3e, 0xe4, 0x8c, 0x88,
+	0x53, 0x5b, 0x14, 0xa9, 0x6d, 0x25, 0x52, 0x92, 0x42, 0x08, 0x42, 0xf1, 0xee, 0x62, 0xe6, 0xaa,
+	0x26, 0x14, 0xcf, 0x31, 0x46, 0x22, 0x39, 0x76, 0xd3, 0x03, 0x26, 0x2b, 0x33, 0x71, 0xb0, 0x7c,
+	0x26, 0x66, 0x47, 0x9a, 0x6e, 0xf9, 0x37, 0x8e, 0x27, 0x0b, 0xa1, 0xa4, 0xff, 0x99, 0x79, 0x57,
+	0xc7, 0x9e, 0x0c, 0x08, 0x46, 0x52, 0x08, 0xfc, 0x19, 0xda, 0xf0, 0x7c, 0x2f, 0xa6, 0x6a, 0x91,
+	0x23, 0x66, 0xae, 0x49, 0xa3, 0xfb, 0xa2, 0x09, 0x8f, 0x67, 0x55, 0x64, 0x1e, 0x3b, 0x57, 0x85,
+	0xb9, 0xa5, 0xab, 0xb0, 0x61, 0x5d, 0x5e, 0x95, 0x57, 0x5e, 0x5e, 0x95, 0x57, 0x5e, 0x5d, 0x95,
+	0x57, 0x7e, 0x99, 0x96, 0x8d, 0xcb, 0x69, 0xd9, 0x78, 0x39, 0x2d, 0x1b, 0xaf, 0xa6, 0x65, 0xe3,
+	0xaf, 0x69, 0xd9, 0xf8, 0xfd, 0xef, 0xf2, 0xca, 0x77, 0xb9, 0x38, 0x09, 0xff, 0x04, 0x00, 0x00,
+	0xff, 0xff, 0x3e, 0x3d, 0x28, 0x0e, 0x4d, 0x0e, 0x00, 0x00,
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/generated.proto b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/generated.proto
new file mode 100644
index 0000000..279c5c8
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/generated.proto
@@ -0,0 +1,245 @@
+/*
+Copyright The Kubernetes Authors.
+
+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.
+*/
+
+
+// This file was autogenerated by go-to-protobuf. Do not edit it manually!
+
+syntax = 'proto2';
+
+package k8s.io.apiserver.pkg.apis.audit.v1alpha1;
+
+import "k8s.io/api/authentication/v1/generated.proto";
+import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto";
+import "k8s.io/apimachinery/pkg/runtime/generated.proto";
+import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto";
+import "k8s.io/apimachinery/pkg/util/intstr/generated.proto";
+
+// Package-wide variables from generator "generated".
+option go_package = "v1alpha1";
+
+// Event captures all the information that can be included in an API audit log.
+message Event {
+  // ObjectMeta is included for interoperability with API infrastructure.
+  // +optional
+  optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1;
+
+  // AuditLevel at which event was generated
+  optional string level = 2;
+
+  // Time the request reached the apiserver.
+  optional k8s.io.apimachinery.pkg.apis.meta.v1.Time timestamp = 3;
+
+  // Unique audit ID, generated for each request.
+  optional string auditID = 4;
+
+  // Stage of the request handling when this event instance was generated.
+  optional string stage = 5;
+
+  // RequestURI is the request URI as sent by the client to a server.
+  optional string requestURI = 6;
+
+  // Verb is the kubernetes verb associated with the request.
+  // For non-resource requests, this is the lower-cased HTTP method.
+  optional string verb = 7;
+
+  // Authenticated user information.
+  optional k8s.io.api.authentication.v1.UserInfo user = 8;
+
+  // Impersonated user information.
+  // +optional
+  optional k8s.io.api.authentication.v1.UserInfo impersonatedUser = 9;
+
+  // Source IPs, from where the request originated and intermediate proxies.
+  // +optional
+  repeated string sourceIPs = 10;
+
+  // Object reference this request is targeted at.
+  // Does not apply for List-type requests, or non-resource requests.
+  // +optional
+  optional ObjectReference objectRef = 11;
+
+  // The response status, populated even when the ResponseObject is not a Status type.
+  // For successful responses, this will only include the Code and StatusSuccess.
+  // For non-status type error responses, this will be auto-populated with the error Message.
+  // +optional
+  optional k8s.io.apimachinery.pkg.apis.meta.v1.Status responseStatus = 12;
+
+  // API object from the request, in JSON format. The RequestObject is recorded as-is in the request
+  // (possibly re-encoded as JSON), prior to version conversion, defaulting, admission or
+  // merging. It is an external versioned object type, and may not be a valid object on its own.
+  // Omitted for non-resource requests.  Only logged at Request Level and higher.
+  // +optional
+  optional k8s.io.apimachinery.pkg.runtime.Unknown requestObject = 13;
+
+  // API object returned in the response, in JSON. The ResponseObject is recorded after conversion
+  // to the external type, and serialized as JSON.  Omitted for non-resource requests.  Only logged
+  // at Response Level.
+  // +optional
+  optional k8s.io.apimachinery.pkg.runtime.Unknown responseObject = 14;
+
+  // Time the request reached the apiserver.
+  // +optional
+  optional k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime requestReceivedTimestamp = 15;
+
+  // Time the request reached current audit stage.
+  // +optional
+  optional k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime stageTimestamp = 16;
+
+  // Annotations is an unstructured key value map stored with an audit event that may be set by
+  // plugins invoked in the request serving chain, including authentication, authorization and
+  // admission plugins. Keys should uniquely identify the informing component to avoid name
+  // collisions (e.g. podsecuritypolicy.admission.k8s.io/policy). Values should be short. Annotations
+  // are included in the Metadata level.
+  // +optional
+  map<string, string> annotations = 17;
+}
+
+// EventList is a list of audit Events.
+message EventList {
+  // +optional
+  optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1;
+
+  repeated Event items = 2;
+}
+
+// GroupResources represents resource kinds in an API group.
+message GroupResources {
+  // Group is the name of the API group that contains the resources.
+  // The empty string represents the core API group.
+  // +optional
+  optional string group = 1;
+
+  // Resources is a list of resources this rule applies to.
+  // 
+  // For example:
+  // 'pods' matches pods.
+  // 'pods/log' matches the log subresource of pods.
+  // '*' matches all resources and their subresources.
+  // 'pods/*' matches all subresources of pods.
+  // '*/scale' matches all scale subresources.
+  // 
+  // If wildcard is present, the validation rule will ensure resources do not
+  // overlap with each other.
+  // 
+  // An empty list implies all resources and subresources in this API groups apply.
+  // +optional
+  repeated string resources = 2;
+
+  // ResourceNames is a list of resource instance names that the policy matches.
+  // Using this field requires Resources to be specified.
+  // An empty list implies that every instance of the resource is matched.
+  // +optional
+  repeated string resourceNames = 3;
+}
+
+// ObjectReference contains enough information to let you inspect or modify the referred object.
+message ObjectReference {
+  // +optional
+  optional string resource = 1;
+
+  // +optional
+  optional string namespace = 2;
+
+  // +optional
+  optional string name = 3;
+
+  // +optional
+  optional string uid = 4;
+
+  // +optional
+  optional string apiVersion = 5;
+
+  // +optional
+  optional string resourceVersion = 6;
+
+  // +optional
+  optional string subresource = 7;
+}
+
+// Policy defines the configuration of audit logging, and the rules for how different request
+// categories are logged.
+message Policy {
+  // ObjectMeta is included for interoperability with API infrastructure.
+  // +optional
+  optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1;
+
+  // Rules specify the audit Level a request should be recorded at.
+  // A request may match multiple rules, in which case the FIRST matching rule is used.
+  // The default audit level is None, but can be overridden by a catch-all rule at the end of the list.
+  // PolicyRules are strictly ordered.
+  repeated PolicyRule rules = 2;
+
+  // OmitStages is a list of stages for which no events are created. Note that this can also
+  // be specified per rule in which case the union of both are omitted.
+  // +optional
+  repeated string omitStages = 3;
+}
+
+// PolicyList is a list of audit Policies.
+message PolicyList {
+  // +optional
+  optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1;
+
+  repeated Policy items = 2;
+}
+
+// PolicyRule maps requests based off metadata to an audit Level.
+// Requests must match the rules of every field (an intersection of rules).
+message PolicyRule {
+  // The Level that requests matching this rule are recorded at.
+  optional string level = 1;
+
+  // The users (by authenticated user name) this rule applies to.
+  // An empty list implies every user.
+  // +optional
+  repeated string users = 2;
+
+  // The user groups this rule applies to. A user is considered matching
+  // if it is a member of any of the UserGroups.
+  // An empty list implies every user group.
+  // +optional
+  repeated string userGroups = 3;
+
+  // The verbs that match this rule.
+  // An empty list implies every verb.
+  // +optional
+  repeated string verbs = 4;
+
+  // Resources that this rule matches. An empty list implies all kinds in all API groups.
+  // +optional
+  repeated GroupResources resources = 5;
+
+  // Namespaces that this rule matches.
+  // The empty string "" matches non-namespaced resources.
+  // An empty list implies every namespace.
+  // +optional
+  repeated string namespaces = 6;
+
+  // NonResourceURLs is a set of URL paths that should be audited.
+  // *s are allowed, but only as the full, final step in the path.
+  // Examples:
+  //  "/metrics" - Log requests for apiserver metrics
+  //  "/healthz*" - Log all health checks
+  // +optional
+  repeated string nonResourceURLs = 7;
+
+  // OmitStages is a list of stages for which no events are created. Note that this can also
+  // be specified policy wide in which case the union of both are omitted.
+  // An empty list means no restrictions will apply.
+  // +optional
+  repeated string omitStages = 8;
+}
+
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/register.go b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/register.go
new file mode 100644
index 0000000..903e6a4
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/register.go
@@ -0,0 +1,58 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package v1alpha1
+
+import (
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+)
+
+// GroupName is the group name use in this package
+const GroupName = "audit.k8s.io"
+
+// SchemeGroupVersion is group version used to register these objects
+var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1alpha1"}
+
+// Resource takes an unqualified resource and returns a Group qualified GroupResource
+func Resource(resource string) schema.GroupResource {
+	return SchemeGroupVersion.WithResource(resource).GroupResource()
+}
+
+var (
+	SchemeBuilder      runtime.SchemeBuilder
+	localSchemeBuilder = &SchemeBuilder
+	AddToScheme        = localSchemeBuilder.AddToScheme
+)
+
+func init() {
+	// We only register manually written functions here. The registration of the
+	// generated functions takes place in the generated files. The separation
+	// makes the code compile even when the generated files are missing.
+	localSchemeBuilder.Register(addKnownTypes)
+}
+
+func addKnownTypes(scheme *runtime.Scheme) error {
+	scheme.AddKnownTypes(SchemeGroupVersion,
+		&Event{},
+		&EventList{},
+		&Policy{},
+		&PolicyList{},
+	)
+	metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
+	return nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/types.go b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/types.go
new file mode 100644
index 0000000..7e8af12
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/types.go
@@ -0,0 +1,282 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package v1alpha1
+
+import (
+	authnv1 "k8s.io/api/authentication/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/types"
+)
+
+// Header keys used by the audit system.
+const (
+	// Header to hold the audit ID as the request is propagated through the serving hierarchy. The
+	// Audit-ID header should be set by the first server to receive the request (e.g. the federation
+	// server or kube-aggregator).
+	//
+	// Audit ID is also returned to client by http response header.
+	// It's not guaranteed Audit-Id http header is sent for all requests. When kube-apiserver didn't
+	// audit the events according to the audit policy, no Audit-ID is returned. Also, for request to
+	// pods/exec, pods/attach, pods/proxy, kube-apiserver works like a proxy and redirect the request
+	// to kubelet node, users will only get http headers sent from kubelet node, so no Audit-ID is
+	// sent when users run command like "kubectl exec" or "kubectl attach".
+	HeaderAuditID = "Audit-ID"
+)
+
+// Level defines the amount of information logged during auditing
+type Level string
+
+// Valid audit levels
+const (
+	// LevelNone disables auditing
+	LevelNone Level = "None"
+	// LevelMetadata provides the basic level of auditing.
+	LevelMetadata Level = "Metadata"
+	// LevelRequest provides Metadata level of auditing, and additionally
+	// logs the request object (does not apply for non-resource requests).
+	LevelRequest Level = "Request"
+	// LevelRequestResponse provides Request level of auditing, and additionally
+	// logs the response object (does not apply for non-resource requests).
+	LevelRequestResponse Level = "RequestResponse"
+)
+
+// Stage defines the stages in request handling that audit events may be generated.
+type Stage string
+
+// Valid audit stages.
+const (
+	// The stage for events generated as soon as the audit handler receives the request, and before it
+	// is delegated down the handler chain.
+	StageRequestReceived = "RequestReceived"
+	// The stage for events generated once the response headers are sent, but before the response body
+	// is sent. This stage is only generated for long-running requests (e.g. watch).
+	StageResponseStarted = "ResponseStarted"
+	// The stage for events generated once the response body has been completed, and no more bytes
+	// will be sent.
+	StageResponseComplete = "ResponseComplete"
+	// The stage for events generated when a panic occurred.
+	StagePanic = "Panic"
+)
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// Event captures all the information that can be included in an API audit log.
+type Event struct {
+	metav1.TypeMeta `json:",inline"`
+	// ObjectMeta is included for interoperability with API infrastructure.
+	// +optional
+	metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
+
+	// AuditLevel at which event was generated
+	Level Level `json:"level" protobuf:"bytes,2,opt,name=level,casttype=Level"`
+
+	// Time the request reached the apiserver.
+	Timestamp metav1.Time `json:"timestamp" protobuf:"bytes,3,opt,name=timestamp"`
+	// Unique audit ID, generated for each request.
+	AuditID types.UID `json:"auditID" protobuf:"bytes,4,opt,name=auditID,casttype=k8s.io/apimachinery/pkg/types.UID"`
+	// Stage of the request handling when this event instance was generated.
+	Stage Stage `json:"stage" protobuf:"bytes,5,opt,name=stage,casttype=Stage"`
+
+	// RequestURI is the request URI as sent by the client to a server.
+	RequestURI string `json:"requestURI" protobuf:"bytes,6,opt,name=requestURI"`
+	// Verb is the kubernetes verb associated with the request.
+	// For non-resource requests, this is the lower-cased HTTP method.
+	Verb string `json:"verb" protobuf:"bytes,7,opt,name=verb"`
+	// Authenticated user information.
+	User authnv1.UserInfo `json:"user" protobuf:"bytes,8,opt,name=user"`
+	// Impersonated user information.
+	// +optional
+	ImpersonatedUser *authnv1.UserInfo `json:"impersonatedUser,omitempty" protobuf:"bytes,9,opt,name=impersonatedUser"`
+	// Source IPs, from where the request originated and intermediate proxies.
+	// +optional
+	SourceIPs []string `json:"sourceIPs,omitempty" protobuf:"bytes,10,rep,name=sourceIPs"`
+	// Object reference this request is targeted at.
+	// Does not apply for List-type requests, or non-resource requests.
+	// +optional
+	ObjectRef *ObjectReference `json:"objectRef,omitempty" protobuf:"bytes,11,opt,name=objectRef"`
+	// The response status, populated even when the ResponseObject is not a Status type.
+	// For successful responses, this will only include the Code and StatusSuccess.
+	// For non-status type error responses, this will be auto-populated with the error Message.
+	// +optional
+	ResponseStatus *metav1.Status `json:"responseStatus,omitempty" protobuf:"bytes,12,opt,name=responseStatus"`
+
+	// API object from the request, in JSON format. The RequestObject is recorded as-is in the request
+	// (possibly re-encoded as JSON), prior to version conversion, defaulting, admission or
+	// merging. It is an external versioned object type, and may not be a valid object on its own.
+	// Omitted for non-resource requests.  Only logged at Request Level and higher.
+	// +optional
+	RequestObject *runtime.Unknown `json:"requestObject,omitempty" protobuf:"bytes,13,opt,name=requestObject"`
+	// API object returned in the response, in JSON. The ResponseObject is recorded after conversion
+	// to the external type, and serialized as JSON.  Omitted for non-resource requests.  Only logged
+	// at Response Level.
+	// +optional
+	ResponseObject *runtime.Unknown `json:"responseObject,omitempty" protobuf:"bytes,14,opt,name=responseObject"`
+	// Time the request reached the apiserver.
+	// +optional
+	RequestReceivedTimestamp metav1.MicroTime `json:"requestReceivedTimestamp" protobuf:"bytes,15,opt,name=requestReceivedTimestamp"`
+	// Time the request reached current audit stage.
+	// +optional
+	StageTimestamp metav1.MicroTime `json:"stageTimestamp" protobuf:"bytes,16,opt,name=stageTimestamp"`
+
+	// Annotations is an unstructured key value map stored with an audit event that may be set by
+	// plugins invoked in the request serving chain, including authentication, authorization and
+	// admission plugins. Keys should uniquely identify the informing component to avoid name
+	// collisions (e.g. podsecuritypolicy.admission.k8s.io/policy). Values should be short. Annotations
+	// are included in the Metadata level.
+	// +optional
+	Annotations map[string]string `json:"annotations,omitempty" protobuf:"bytes,17,rep,name=annotations"`
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// EventList is a list of audit Events.
+type EventList struct {
+	metav1.TypeMeta `json:",inline"`
+	// +optional
+	metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
+
+	Items []Event `json:"items" protobuf:"bytes,2,rep,name=items"`
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// Policy defines the configuration of audit logging, and the rules for how different request
+// categories are logged.
+type Policy struct {
+	metav1.TypeMeta `json:",inline"`
+	// ObjectMeta is included for interoperability with API infrastructure.
+	// +optional
+	metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
+
+	// Rules specify the audit Level a request should be recorded at.
+	// A request may match multiple rules, in which case the FIRST matching rule is used.
+	// The default audit level is None, but can be overridden by a catch-all rule at the end of the list.
+	// PolicyRules are strictly ordered.
+	Rules []PolicyRule `json:"rules" protobuf:"bytes,2,rep,name=rules"`
+
+	// OmitStages is a list of stages for which no events are created. Note that this can also
+	// be specified per rule in which case the union of both are omitted.
+	// +optional
+	OmitStages []Stage `json:"omitStages,omitempty" protobuf:"bytes,3,rep,name=omitStages"`
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// PolicyList is a list of audit Policies.
+type PolicyList struct {
+	metav1.TypeMeta `json:",inline"`
+	// +optional
+	metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
+
+	Items []Policy `json:"items" protobuf:"bytes,2,rep,name=items"`
+}
+
+// PolicyRule maps requests based off metadata to an audit Level.
+// Requests must match the rules of every field (an intersection of rules).
+type PolicyRule struct {
+	// The Level that requests matching this rule are recorded at.
+	Level Level `json:"level" protobuf:"bytes,1,opt,name=level,casttype=Level"`
+
+	// The users (by authenticated user name) this rule applies to.
+	// An empty list implies every user.
+	// +optional
+	Users []string `json:"users,omitempty" protobuf:"bytes,2,rep,name=users"`
+	// The user groups this rule applies to. A user is considered matching
+	// if it is a member of any of the UserGroups.
+	// An empty list implies every user group.
+	// +optional
+	UserGroups []string `json:"userGroups,omitempty" protobuf:"bytes,3,rep,name=userGroups"`
+
+	// The verbs that match this rule.
+	// An empty list implies every verb.
+	// +optional
+	Verbs []string `json:"verbs,omitempty" protobuf:"bytes,4,rep,name=verbs"`
+
+	// Rules can apply to API resources (such as "pods" or "secrets"),
+	// non-resource URL paths (such as "/api"), or neither, but not both.
+	// If neither is specified, the rule is treated as a default for all URLs.
+
+	// Resources that this rule matches. An empty list implies all kinds in all API groups.
+	// +optional
+	Resources []GroupResources `json:"resources,omitempty" protobuf:"bytes,5,rep,name=resources"`
+	// Namespaces that this rule matches.
+	// The empty string "" matches non-namespaced resources.
+	// An empty list implies every namespace.
+	// +optional
+	Namespaces []string `json:"namespaces,omitempty" protobuf:"bytes,6,rep,name=namespaces"`
+
+	// NonResourceURLs is a set of URL paths that should be audited.
+	// *s are allowed, but only as the full, final step in the path.
+	// Examples:
+	//  "/metrics" - Log requests for apiserver metrics
+	//  "/healthz*" - Log all health checks
+	// +optional
+	NonResourceURLs []string `json:"nonResourceURLs,omitempty" protobuf:"bytes,7,rep,name=nonResourceURLs"`
+
+	// OmitStages is a list of stages for which no events are created. Note that this can also
+	// be specified policy wide in which case the union of both are omitted.
+	// An empty list means no restrictions will apply.
+	// +optional
+	OmitStages []Stage `json:"omitStages,omitempty" protobuf:"bytes,8,rep,name=omitStages"`
+}
+
+// GroupResources represents resource kinds in an API group.
+type GroupResources struct {
+	// Group is the name of the API group that contains the resources.
+	// The empty string represents the core API group.
+	// +optional
+	Group string `json:"group,omitempty" protobuf:"bytes,1,opt,name=group"`
+	// Resources is a list of resources this rule applies to.
+	//
+	// For example:
+	// 'pods' matches pods.
+	// 'pods/log' matches the log subresource of pods.
+	// '*' matches all resources and their subresources.
+	// 'pods/*' matches all subresources of pods.
+	// '*/scale' matches all scale subresources.
+	//
+	// If wildcard is present, the validation rule will ensure resources do not
+	// overlap with each other.
+	//
+	// An empty list implies all resources and subresources in this API groups apply.
+	// +optional
+	Resources []string `json:"resources,omitempty" protobuf:"bytes,2,rep,name=resources"`
+	// ResourceNames is a list of resource instance names that the policy matches.
+	// Using this field requires Resources to be specified.
+	// An empty list implies that every instance of the resource is matched.
+	// +optional
+	ResourceNames []string `json:"resourceNames,omitempty" protobuf:"bytes,3,rep,name=resourceNames"`
+}
+
+// ObjectReference contains enough information to let you inspect or modify the referred object.
+type ObjectReference struct {
+	// +optional
+	Resource string `json:"resource,omitempty" protobuf:"bytes,1,opt,name=resource"`
+	// +optional
+	Namespace string `json:"namespace,omitempty" protobuf:"bytes,2,opt,name=namespace"`
+	// +optional
+	Name string `json:"name,omitempty" protobuf:"bytes,3,opt,name=name"`
+	// +optional
+	UID types.UID `json:"uid,omitempty" protobuf:"bytes,4,opt,name=uid,casttype=k8s.io/apimachinery/pkg/types.UID"`
+	// +optional
+	APIVersion string `json:"apiVersion,omitempty" protobuf:"bytes,5,opt,name=apiVersion"`
+	// +optional
+	ResourceVersion string `json:"resourceVersion,omitempty" protobuf:"bytes,6,opt,name=resourceVersion"`
+	// +optional
+	Subresource string `json:"subresource,omitempty" protobuf:"bytes,7,opt,name=subresource"`
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/zz_generated.conversion.go b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/zz_generated.conversion.go
new file mode 100644
index 0000000..4421bb6
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/zz_generated.conversion.go
@@ -0,0 +1,288 @@
+// +build !ignore_autogenerated
+
+/*
+Copyright The Kubernetes Authors.
+
+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.
+*/
+
+// Code generated by conversion-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	unsafe "unsafe"
+
+	authentication_v1 "k8s.io/api/authentication/v1"
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	conversion "k8s.io/apimachinery/pkg/conversion"
+	runtime "k8s.io/apimachinery/pkg/runtime"
+	types "k8s.io/apimachinery/pkg/types"
+	audit "k8s.io/apiserver/pkg/apis/audit"
+)
+
+func init() {
+	localSchemeBuilder.Register(RegisterConversions)
+}
+
+// RegisterConversions adds conversion functions to the given scheme.
+// Public to allow building arbitrary schemes.
+func RegisterConversions(scheme *runtime.Scheme) error {
+	return scheme.AddGeneratedConversionFuncs(
+		Convert_v1alpha1_Event_To_audit_Event,
+		Convert_audit_Event_To_v1alpha1_Event,
+		Convert_v1alpha1_EventList_To_audit_EventList,
+		Convert_audit_EventList_To_v1alpha1_EventList,
+		Convert_v1alpha1_GroupResources_To_audit_GroupResources,
+		Convert_audit_GroupResources_To_v1alpha1_GroupResources,
+		Convert_v1alpha1_ObjectReference_To_audit_ObjectReference,
+		Convert_audit_ObjectReference_To_v1alpha1_ObjectReference,
+		Convert_v1alpha1_Policy_To_audit_Policy,
+		Convert_audit_Policy_To_v1alpha1_Policy,
+		Convert_v1alpha1_PolicyList_To_audit_PolicyList,
+		Convert_audit_PolicyList_To_v1alpha1_PolicyList,
+		Convert_v1alpha1_PolicyRule_To_audit_PolicyRule,
+		Convert_audit_PolicyRule_To_v1alpha1_PolicyRule,
+	)
+}
+
+func autoConvert_v1alpha1_Event_To_audit_Event(in *Event, out *audit.Event, s conversion.Scope) error {
+	// WARNING: in.ObjectMeta requires manual conversion: does not exist in peer-type
+	out.Level = audit.Level(in.Level)
+	// WARNING: in.Timestamp requires manual conversion: does not exist in peer-type
+	out.AuditID = types.UID(in.AuditID)
+	out.Stage = audit.Stage(in.Stage)
+	out.RequestURI = in.RequestURI
+	out.Verb = in.Verb
+	// TODO: Inefficient conversion - can we improve it?
+	if err := s.Convert(&in.User, &out.User, 0); err != nil {
+		return err
+	}
+	out.ImpersonatedUser = (*audit.UserInfo)(unsafe.Pointer(in.ImpersonatedUser))
+	out.SourceIPs = *(*[]string)(unsafe.Pointer(&in.SourceIPs))
+	if in.ObjectRef != nil {
+		in, out := &in.ObjectRef, &out.ObjectRef
+		*out = new(audit.ObjectReference)
+		if err := Convert_v1alpha1_ObjectReference_To_audit_ObjectReference(*in, *out, s); err != nil {
+			return err
+		}
+	} else {
+		out.ObjectRef = nil
+	}
+	out.ResponseStatus = (*v1.Status)(unsafe.Pointer(in.ResponseStatus))
+	out.RequestObject = (*runtime.Unknown)(unsafe.Pointer(in.RequestObject))
+	out.ResponseObject = (*runtime.Unknown)(unsafe.Pointer(in.ResponseObject))
+	out.RequestReceivedTimestamp = in.RequestReceivedTimestamp
+	out.StageTimestamp = in.StageTimestamp
+	out.Annotations = *(*map[string]string)(unsafe.Pointer(&in.Annotations))
+	return nil
+}
+
+func autoConvert_audit_Event_To_v1alpha1_Event(in *audit.Event, out *Event, s conversion.Scope) error {
+	out.Level = Level(in.Level)
+	out.AuditID = types.UID(in.AuditID)
+	out.Stage = Stage(in.Stage)
+	out.RequestURI = in.RequestURI
+	out.Verb = in.Verb
+	// TODO: Inefficient conversion - can we improve it?
+	if err := s.Convert(&in.User, &out.User, 0); err != nil {
+		return err
+	}
+	out.ImpersonatedUser = (*authentication_v1.UserInfo)(unsafe.Pointer(in.ImpersonatedUser))
+	out.SourceIPs = *(*[]string)(unsafe.Pointer(&in.SourceIPs))
+	if in.ObjectRef != nil {
+		in, out := &in.ObjectRef, &out.ObjectRef
+		*out = new(ObjectReference)
+		if err := Convert_audit_ObjectReference_To_v1alpha1_ObjectReference(*in, *out, s); err != nil {
+			return err
+		}
+	} else {
+		out.ObjectRef = nil
+	}
+	out.ResponseStatus = (*v1.Status)(unsafe.Pointer(in.ResponseStatus))
+	out.RequestObject = (*runtime.Unknown)(unsafe.Pointer(in.RequestObject))
+	out.ResponseObject = (*runtime.Unknown)(unsafe.Pointer(in.ResponseObject))
+	out.RequestReceivedTimestamp = in.RequestReceivedTimestamp
+	out.StageTimestamp = in.StageTimestamp
+	out.Annotations = *(*map[string]string)(unsafe.Pointer(&in.Annotations))
+	return nil
+}
+
+func autoConvert_v1alpha1_EventList_To_audit_EventList(in *EventList, out *audit.EventList, s conversion.Scope) error {
+	out.ListMeta = in.ListMeta
+	if in.Items != nil {
+		in, out := &in.Items, &out.Items
+		*out = make([]audit.Event, len(*in))
+		for i := range *in {
+			if err := Convert_v1alpha1_Event_To_audit_Event(&(*in)[i], &(*out)[i], s); err != nil {
+				return err
+			}
+		}
+	} else {
+		out.Items = nil
+	}
+	return nil
+}
+
+// Convert_v1alpha1_EventList_To_audit_EventList is an autogenerated conversion function.
+func Convert_v1alpha1_EventList_To_audit_EventList(in *EventList, out *audit.EventList, s conversion.Scope) error {
+	return autoConvert_v1alpha1_EventList_To_audit_EventList(in, out, s)
+}
+
+func autoConvert_audit_EventList_To_v1alpha1_EventList(in *audit.EventList, out *EventList, s conversion.Scope) error {
+	out.ListMeta = in.ListMeta
+	if in.Items != nil {
+		in, out := &in.Items, &out.Items
+		*out = make([]Event, len(*in))
+		for i := range *in {
+			if err := Convert_audit_Event_To_v1alpha1_Event(&(*in)[i], &(*out)[i], s); err != nil {
+				return err
+			}
+		}
+	} else {
+		out.Items = nil
+	}
+	return nil
+}
+
+// Convert_audit_EventList_To_v1alpha1_EventList is an autogenerated conversion function.
+func Convert_audit_EventList_To_v1alpha1_EventList(in *audit.EventList, out *EventList, s conversion.Scope) error {
+	return autoConvert_audit_EventList_To_v1alpha1_EventList(in, out, s)
+}
+
+func autoConvert_v1alpha1_GroupResources_To_audit_GroupResources(in *GroupResources, out *audit.GroupResources, s conversion.Scope) error {
+	out.Group = in.Group
+	out.Resources = *(*[]string)(unsafe.Pointer(&in.Resources))
+	out.ResourceNames = *(*[]string)(unsafe.Pointer(&in.ResourceNames))
+	return nil
+}
+
+// Convert_v1alpha1_GroupResources_To_audit_GroupResources is an autogenerated conversion function.
+func Convert_v1alpha1_GroupResources_To_audit_GroupResources(in *GroupResources, out *audit.GroupResources, s conversion.Scope) error {
+	return autoConvert_v1alpha1_GroupResources_To_audit_GroupResources(in, out, s)
+}
+
+func autoConvert_audit_GroupResources_To_v1alpha1_GroupResources(in *audit.GroupResources, out *GroupResources, s conversion.Scope) error {
+	out.Group = in.Group
+	out.Resources = *(*[]string)(unsafe.Pointer(&in.Resources))
+	out.ResourceNames = *(*[]string)(unsafe.Pointer(&in.ResourceNames))
+	return nil
+}
+
+// Convert_audit_GroupResources_To_v1alpha1_GroupResources is an autogenerated conversion function.
+func Convert_audit_GroupResources_To_v1alpha1_GroupResources(in *audit.GroupResources, out *GroupResources, s conversion.Scope) error {
+	return autoConvert_audit_GroupResources_To_v1alpha1_GroupResources(in, out, s)
+}
+
+func autoConvert_v1alpha1_ObjectReference_To_audit_ObjectReference(in *ObjectReference, out *audit.ObjectReference, s conversion.Scope) error {
+	out.Resource = in.Resource
+	out.Namespace = in.Namespace
+	out.Name = in.Name
+	out.UID = types.UID(in.UID)
+	out.APIVersion = in.APIVersion
+	out.ResourceVersion = in.ResourceVersion
+	out.Subresource = in.Subresource
+	return nil
+}
+
+func autoConvert_audit_ObjectReference_To_v1alpha1_ObjectReference(in *audit.ObjectReference, out *ObjectReference, s conversion.Scope) error {
+	out.Resource = in.Resource
+	out.Namespace = in.Namespace
+	out.Name = in.Name
+	out.UID = types.UID(in.UID)
+	// WARNING: in.APIGroup requires manual conversion: does not exist in peer-type
+	out.APIVersion = in.APIVersion
+	out.ResourceVersion = in.ResourceVersion
+	out.Subresource = in.Subresource
+	return nil
+}
+
+func autoConvert_v1alpha1_Policy_To_audit_Policy(in *Policy, out *audit.Policy, s conversion.Scope) error {
+	out.ObjectMeta = in.ObjectMeta
+	out.Rules = *(*[]audit.PolicyRule)(unsafe.Pointer(&in.Rules))
+	out.OmitStages = *(*[]audit.Stage)(unsafe.Pointer(&in.OmitStages))
+	return nil
+}
+
+// Convert_v1alpha1_Policy_To_audit_Policy is an autogenerated conversion function.
+func Convert_v1alpha1_Policy_To_audit_Policy(in *Policy, out *audit.Policy, s conversion.Scope) error {
+	return autoConvert_v1alpha1_Policy_To_audit_Policy(in, out, s)
+}
+
+func autoConvert_audit_Policy_To_v1alpha1_Policy(in *audit.Policy, out *Policy, s conversion.Scope) error {
+	out.ObjectMeta = in.ObjectMeta
+	out.Rules = *(*[]PolicyRule)(unsafe.Pointer(&in.Rules))
+	out.OmitStages = *(*[]Stage)(unsafe.Pointer(&in.OmitStages))
+	return nil
+}
+
+// Convert_audit_Policy_To_v1alpha1_Policy is an autogenerated conversion function.
+func Convert_audit_Policy_To_v1alpha1_Policy(in *audit.Policy, out *Policy, s conversion.Scope) error {
+	return autoConvert_audit_Policy_To_v1alpha1_Policy(in, out, s)
+}
+
+func autoConvert_v1alpha1_PolicyList_To_audit_PolicyList(in *PolicyList, out *audit.PolicyList, s conversion.Scope) error {
+	out.ListMeta = in.ListMeta
+	out.Items = *(*[]audit.Policy)(unsafe.Pointer(&in.Items))
+	return nil
+}
+
+// Convert_v1alpha1_PolicyList_To_audit_PolicyList is an autogenerated conversion function.
+func Convert_v1alpha1_PolicyList_To_audit_PolicyList(in *PolicyList, out *audit.PolicyList, s conversion.Scope) error {
+	return autoConvert_v1alpha1_PolicyList_To_audit_PolicyList(in, out, s)
+}
+
+func autoConvert_audit_PolicyList_To_v1alpha1_PolicyList(in *audit.PolicyList, out *PolicyList, s conversion.Scope) error {
+	out.ListMeta = in.ListMeta
+	out.Items = *(*[]Policy)(unsafe.Pointer(&in.Items))
+	return nil
+}
+
+// Convert_audit_PolicyList_To_v1alpha1_PolicyList is an autogenerated conversion function.
+func Convert_audit_PolicyList_To_v1alpha1_PolicyList(in *audit.PolicyList, out *PolicyList, s conversion.Scope) error {
+	return autoConvert_audit_PolicyList_To_v1alpha1_PolicyList(in, out, s)
+}
+
+func autoConvert_v1alpha1_PolicyRule_To_audit_PolicyRule(in *PolicyRule, out *audit.PolicyRule, s conversion.Scope) error {
+	out.Level = audit.Level(in.Level)
+	out.Users = *(*[]string)(unsafe.Pointer(&in.Users))
+	out.UserGroups = *(*[]string)(unsafe.Pointer(&in.UserGroups))
+	out.Verbs = *(*[]string)(unsafe.Pointer(&in.Verbs))
+	out.Resources = *(*[]audit.GroupResources)(unsafe.Pointer(&in.Resources))
+	out.Namespaces = *(*[]string)(unsafe.Pointer(&in.Namespaces))
+	out.NonResourceURLs = *(*[]string)(unsafe.Pointer(&in.NonResourceURLs))
+	out.OmitStages = *(*[]audit.Stage)(unsafe.Pointer(&in.OmitStages))
+	return nil
+}
+
+// Convert_v1alpha1_PolicyRule_To_audit_PolicyRule is an autogenerated conversion function.
+func Convert_v1alpha1_PolicyRule_To_audit_PolicyRule(in *PolicyRule, out *audit.PolicyRule, s conversion.Scope) error {
+	return autoConvert_v1alpha1_PolicyRule_To_audit_PolicyRule(in, out, s)
+}
+
+func autoConvert_audit_PolicyRule_To_v1alpha1_PolicyRule(in *audit.PolicyRule, out *PolicyRule, s conversion.Scope) error {
+	out.Level = Level(in.Level)
+	out.Users = *(*[]string)(unsafe.Pointer(&in.Users))
+	out.UserGroups = *(*[]string)(unsafe.Pointer(&in.UserGroups))
+	out.Verbs = *(*[]string)(unsafe.Pointer(&in.Verbs))
+	out.Resources = *(*[]GroupResources)(unsafe.Pointer(&in.Resources))
+	out.Namespaces = *(*[]string)(unsafe.Pointer(&in.Namespaces))
+	out.NonResourceURLs = *(*[]string)(unsafe.Pointer(&in.NonResourceURLs))
+	out.OmitStages = *(*[]Stage)(unsafe.Pointer(&in.OmitStages))
+	return nil
+}
+
+// Convert_audit_PolicyRule_To_v1alpha1_PolicyRule is an autogenerated conversion function.
+func Convert_audit_PolicyRule_To_v1alpha1_PolicyRule(in *audit.PolicyRule, out *PolicyRule, s conversion.Scope) error {
+	return autoConvert_audit_PolicyRule_To_v1alpha1_PolicyRule(in, out, s)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/zz_generated.deepcopy.go b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/zz_generated.deepcopy.go
new file mode 100644
index 0000000..b597172
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/zz_generated.deepcopy.go
@@ -0,0 +1,313 @@
+// +build !ignore_autogenerated
+
+/*
+Copyright The Kubernetes Authors.
+
+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.
+*/
+
+// Code generated by deepcopy-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	v1 "k8s.io/api/authentication/v1"
+	meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	runtime "k8s.io/apimachinery/pkg/runtime"
+)
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Event) DeepCopyInto(out *Event) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+	in.Timestamp.DeepCopyInto(&out.Timestamp)
+	in.User.DeepCopyInto(&out.User)
+	if in.ImpersonatedUser != nil {
+		in, out := &in.ImpersonatedUser, &out.ImpersonatedUser
+		if *in == nil {
+			*out = nil
+		} else {
+			*out = new(v1.UserInfo)
+			(*in).DeepCopyInto(*out)
+		}
+	}
+	if in.SourceIPs != nil {
+		in, out := &in.SourceIPs, &out.SourceIPs
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.ObjectRef != nil {
+		in, out := &in.ObjectRef, &out.ObjectRef
+		if *in == nil {
+			*out = nil
+		} else {
+			*out = new(ObjectReference)
+			**out = **in
+		}
+	}
+	if in.ResponseStatus != nil {
+		in, out := &in.ResponseStatus, &out.ResponseStatus
+		if *in == nil {
+			*out = nil
+		} else {
+			*out = new(meta_v1.Status)
+			(*in).DeepCopyInto(*out)
+		}
+	}
+	if in.RequestObject != nil {
+		in, out := &in.RequestObject, &out.RequestObject
+		if *in == nil {
+			*out = nil
+		} else {
+			*out = new(runtime.Unknown)
+			(*in).DeepCopyInto(*out)
+		}
+	}
+	if in.ResponseObject != nil {
+		in, out := &in.ResponseObject, &out.ResponseObject
+		if *in == nil {
+			*out = nil
+		} else {
+			*out = new(runtime.Unknown)
+			(*in).DeepCopyInto(*out)
+		}
+	}
+	in.RequestReceivedTimestamp.DeepCopyInto(&out.RequestReceivedTimestamp)
+	in.StageTimestamp.DeepCopyInto(&out.StageTimestamp)
+	if in.Annotations != nil {
+		in, out := &in.Annotations, &out.Annotations
+		*out = make(map[string]string, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Event.
+func (in *Event) DeepCopy() *Event {
+	if in == nil {
+		return nil
+	}
+	out := new(Event)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *Event) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *EventList) DeepCopyInto(out *EventList) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	out.ListMeta = in.ListMeta
+	if in.Items != nil {
+		in, out := &in.Items, &out.Items
+		*out = make([]Event, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EventList.
+func (in *EventList) DeepCopy() *EventList {
+	if in == nil {
+		return nil
+	}
+	out := new(EventList)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *EventList) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *GroupResources) DeepCopyInto(out *GroupResources) {
+	*out = *in
+	if in.Resources != nil {
+		in, out := &in.Resources, &out.Resources
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.ResourceNames != nil {
+		in, out := &in.ResourceNames, &out.ResourceNames
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GroupResources.
+func (in *GroupResources) DeepCopy() *GroupResources {
+	if in == nil {
+		return nil
+	}
+	out := new(GroupResources)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ObjectReference) DeepCopyInto(out *ObjectReference) {
+	*out = *in
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ObjectReference.
+func (in *ObjectReference) DeepCopy() *ObjectReference {
+	if in == nil {
+		return nil
+	}
+	out := new(ObjectReference)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Policy) DeepCopyInto(out *Policy) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+	if in.Rules != nil {
+		in, out := &in.Rules, &out.Rules
+		*out = make([]PolicyRule, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	if in.OmitStages != nil {
+		in, out := &in.OmitStages, &out.OmitStages
+		*out = make([]Stage, len(*in))
+		copy(*out, *in)
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Policy.
+func (in *Policy) DeepCopy() *Policy {
+	if in == nil {
+		return nil
+	}
+	out := new(Policy)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *Policy) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PolicyList) DeepCopyInto(out *PolicyList) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	out.ListMeta = in.ListMeta
+	if in.Items != nil {
+		in, out := &in.Items, &out.Items
+		*out = make([]Policy, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PolicyList.
+func (in *PolicyList) DeepCopy() *PolicyList {
+	if in == nil {
+		return nil
+	}
+	out := new(PolicyList)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *PolicyList) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PolicyRule) DeepCopyInto(out *PolicyRule) {
+	*out = *in
+	if in.Users != nil {
+		in, out := &in.Users, &out.Users
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.UserGroups != nil {
+		in, out := &in.UserGroups, &out.UserGroups
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.Verbs != nil {
+		in, out := &in.Verbs, &out.Verbs
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.Resources != nil {
+		in, out := &in.Resources, &out.Resources
+		*out = make([]GroupResources, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	if in.Namespaces != nil {
+		in, out := &in.Namespaces, &out.Namespaces
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.NonResourceURLs != nil {
+		in, out := &in.NonResourceURLs, &out.NonResourceURLs
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.OmitStages != nil {
+		in, out := &in.OmitStages, &out.OmitStages
+		*out = make([]Stage, len(*in))
+		copy(*out, *in)
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PolicyRule.
+func (in *PolicyRule) DeepCopy() *PolicyRule {
+	if in == nil {
+		return nil
+	}
+	out := new(PolicyRule)
+	in.DeepCopyInto(out)
+	return out
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/zz_generated.defaults.go b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/zz_generated.defaults.go
new file mode 100644
index 0000000..dd621a3
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1alpha1/zz_generated.defaults.go
@@ -0,0 +1,32 @@
+// +build !ignore_autogenerated
+
+/*
+Copyright The Kubernetes Authors.
+
+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.
+*/
+
+// Code generated by defaulter-gen. DO NOT EDIT.
+
+package v1alpha1
+
+import (
+	runtime "k8s.io/apimachinery/pkg/runtime"
+)
+
+// RegisterDefaults adds defaulters functions to the given scheme.
+// Public to allow building arbitrary schemes.
+// All generated defaulters are covering - they call all nested defaulters.
+func RegisterDefaults(scheme *runtime.Scheme) error {
+	return nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/conversion.go b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/conversion.go
new file mode 100644
index 0000000..bccdcb7
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/conversion.go
@@ -0,0 +1,45 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package v1beta1
+
+import (
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/conversion"
+	"k8s.io/apiserver/pkg/apis/audit"
+)
+
+func Convert_v1beta1_Event_To_audit_Event(in *Event, out *audit.Event, s conversion.Scope) error {
+	if err := autoConvert_v1beta1_Event_To_audit_Event(in, out, s); err != nil {
+		return err
+	}
+	if out.StageTimestamp.IsZero() {
+		out.StageTimestamp = metav1.NewMicroTime(in.CreationTimestamp.Time)
+	}
+	if out.RequestReceivedTimestamp.IsZero() {
+		out.RequestReceivedTimestamp = metav1.NewMicroTime(in.Timestamp.Time)
+	}
+	return nil
+}
+
+func Convert_audit_Event_To_v1beta1_Event(in *audit.Event, out *Event, s conversion.Scope) error {
+	if err := autoConvert_audit_Event_To_v1beta1_Event(in, out, s); err != nil {
+		return err
+	}
+	out.CreationTimestamp = metav1.NewTime(in.StageTimestamp.Time)
+	out.Timestamp = metav1.NewTime(in.RequestReceivedTimestamp.Time)
+	return nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/doc.go
new file mode 100644
index 0000000..3881472
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/doc.go
@@ -0,0 +1,23 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+// +k8s:deepcopy-gen=package
+// +k8s:conversion-gen=k8s.io/apiserver/pkg/apis/audit
+// +k8s:openapi-gen=true
+// +k8s:defaulter-gen=TypeMeta
+
+// +groupName=audit.k8s.io
+package v1beta1 // import "k8s.io/apiserver/pkg/apis/audit/v1beta1"
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/generated.pb.go b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/generated.pb.go
new file mode 100644
index 0000000..7ac6951
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/generated.pb.go
@@ -0,0 +1,2903 @@
+/*
+Copyright The Kubernetes Authors.
+
+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.
+*/
+
+// Code generated by protoc-gen-gogo.
+// source: k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/generated.proto
+// DO NOT EDIT!
+
+/*
+	Package v1beta1 is a generated protocol buffer package.
+
+	It is generated from these files:
+		k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/generated.proto
+
+	It has these top-level messages:
+		Event
+		EventList
+		GroupResources
+		ObjectReference
+		Policy
+		PolicyList
+		PolicyRule
+*/
+package v1beta1
+
+import proto "github.com/gogo/protobuf/proto"
+import fmt "fmt"
+import math "math"
+
+import k8s_io_api_authentication_v1 "k8s.io/api/authentication/v1"
+import k8s_io_apimachinery_pkg_apis_meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+import k8s_io_apimachinery_pkg_runtime "k8s.io/apimachinery/pkg/runtime"
+
+import k8s_io_apimachinery_pkg_types "k8s.io/apimachinery/pkg/types"
+
+import github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys"
+
+import strings "strings"
+import reflect "reflect"
+
+import io "io"
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package
+
+func (m *Event) Reset()                    { *m = Event{} }
+func (*Event) ProtoMessage()               {}
+func (*Event) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{0} }
+
+func (m *EventList) Reset()                    { *m = EventList{} }
+func (*EventList) ProtoMessage()               {}
+func (*EventList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{1} }
+
+func (m *GroupResources) Reset()                    { *m = GroupResources{} }
+func (*GroupResources) ProtoMessage()               {}
+func (*GroupResources) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{2} }
+
+func (m *ObjectReference) Reset()                    { *m = ObjectReference{} }
+func (*ObjectReference) ProtoMessage()               {}
+func (*ObjectReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{3} }
+
+func (m *Policy) Reset()                    { *m = Policy{} }
+func (*Policy) ProtoMessage()               {}
+func (*Policy) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{4} }
+
+func (m *PolicyList) Reset()                    { *m = PolicyList{} }
+func (*PolicyList) ProtoMessage()               {}
+func (*PolicyList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{5} }
+
+func (m *PolicyRule) Reset()                    { *m = PolicyRule{} }
+func (*PolicyRule) ProtoMessage()               {}
+func (*PolicyRule) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{6} }
+
+func init() {
+	proto.RegisterType((*Event)(nil), "k8s.io.apiserver.pkg.apis.audit.v1beta1.Event")
+	proto.RegisterType((*EventList)(nil), "k8s.io.apiserver.pkg.apis.audit.v1beta1.EventList")
+	proto.RegisterType((*GroupResources)(nil), "k8s.io.apiserver.pkg.apis.audit.v1beta1.GroupResources")
+	proto.RegisterType((*ObjectReference)(nil), "k8s.io.apiserver.pkg.apis.audit.v1beta1.ObjectReference")
+	proto.RegisterType((*Policy)(nil), "k8s.io.apiserver.pkg.apis.audit.v1beta1.Policy")
+	proto.RegisterType((*PolicyList)(nil), "k8s.io.apiserver.pkg.apis.audit.v1beta1.PolicyList")
+	proto.RegisterType((*PolicyRule)(nil), "k8s.io.apiserver.pkg.apis.audit.v1beta1.PolicyRule")
+}
+func (m *Event) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalTo(dAtA)
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *Event) MarshalTo(dAtA []byte) (int, error) {
+	var i int
+	_ = i
+	var l int
+	_ = l
+	dAtA[i] = 0xa
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size()))
+	n1, err := m.ObjectMeta.MarshalTo(dAtA[i:])
+	if err != nil {
+		return 0, err
+	}
+	i += n1
+	dAtA[i] = 0x12
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Level)))
+	i += copy(dAtA[i:], m.Level)
+	dAtA[i] = 0x1a
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(m.Timestamp.Size()))
+	n2, err := m.Timestamp.MarshalTo(dAtA[i:])
+	if err != nil {
+		return 0, err
+	}
+	i += n2
+	dAtA[i] = 0x22
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.AuditID)))
+	i += copy(dAtA[i:], m.AuditID)
+	dAtA[i] = 0x2a
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Stage)))
+	i += copy(dAtA[i:], m.Stage)
+	dAtA[i] = 0x32
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.RequestURI)))
+	i += copy(dAtA[i:], m.RequestURI)
+	dAtA[i] = 0x3a
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Verb)))
+	i += copy(dAtA[i:], m.Verb)
+	dAtA[i] = 0x42
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(m.User.Size()))
+	n3, err := m.User.MarshalTo(dAtA[i:])
+	if err != nil {
+		return 0, err
+	}
+	i += n3
+	if m.ImpersonatedUser != nil {
+		dAtA[i] = 0x4a
+		i++
+		i = encodeVarintGenerated(dAtA, i, uint64(m.ImpersonatedUser.Size()))
+		n4, err := m.ImpersonatedUser.MarshalTo(dAtA[i:])
+		if err != nil {
+			return 0, err
+		}
+		i += n4
+	}
+	if len(m.SourceIPs) > 0 {
+		for _, s := range m.SourceIPs {
+			dAtA[i] = 0x52
+			i++
+			l = len(s)
+			for l >= 1<<7 {
+				dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
+				l >>= 7
+				i++
+			}
+			dAtA[i] = uint8(l)
+			i++
+			i += copy(dAtA[i:], s)
+		}
+	}
+	if m.ObjectRef != nil {
+		dAtA[i] = 0x5a
+		i++
+		i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectRef.Size()))
+		n5, err := m.ObjectRef.MarshalTo(dAtA[i:])
+		if err != nil {
+			return 0, err
+		}
+		i += n5
+	}
+	if m.ResponseStatus != nil {
+		dAtA[i] = 0x62
+		i++
+		i = encodeVarintGenerated(dAtA, i, uint64(m.ResponseStatus.Size()))
+		n6, err := m.ResponseStatus.MarshalTo(dAtA[i:])
+		if err != nil {
+			return 0, err
+		}
+		i += n6
+	}
+	if m.RequestObject != nil {
+		dAtA[i] = 0x6a
+		i++
+		i = encodeVarintGenerated(dAtA, i, uint64(m.RequestObject.Size()))
+		n7, err := m.RequestObject.MarshalTo(dAtA[i:])
+		if err != nil {
+			return 0, err
+		}
+		i += n7
+	}
+	if m.ResponseObject != nil {
+		dAtA[i] = 0x72
+		i++
+		i = encodeVarintGenerated(dAtA, i, uint64(m.ResponseObject.Size()))
+		n8, err := m.ResponseObject.MarshalTo(dAtA[i:])
+		if err != nil {
+			return 0, err
+		}
+		i += n8
+	}
+	dAtA[i] = 0x7a
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(m.RequestReceivedTimestamp.Size()))
+	n9, err := m.RequestReceivedTimestamp.MarshalTo(dAtA[i:])
+	if err != nil {
+		return 0, err
+	}
+	i += n9
+	dAtA[i] = 0x82
+	i++
+	dAtA[i] = 0x1
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(m.StageTimestamp.Size()))
+	n10, err := m.StageTimestamp.MarshalTo(dAtA[i:])
+	if err != nil {
+		return 0, err
+	}
+	i += n10
+	if len(m.Annotations) > 0 {
+		keysForAnnotations := make([]string, 0, len(m.Annotations))
+		for k := range m.Annotations {
+			keysForAnnotations = append(keysForAnnotations, string(k))
+		}
+		github_com_gogo_protobuf_sortkeys.Strings(keysForAnnotations)
+		for _, k := range keysForAnnotations {
+			dAtA[i] = 0x8a
+			i++
+			dAtA[i] = 0x1
+			i++
+			v := m.Annotations[string(k)]
+			mapSize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + len(v) + sovGenerated(uint64(len(v)))
+			i = encodeVarintGenerated(dAtA, i, uint64(mapSize))
+			dAtA[i] = 0xa
+			i++
+			i = encodeVarintGenerated(dAtA, i, uint64(len(k)))
+			i += copy(dAtA[i:], k)
+			dAtA[i] = 0x12
+			i++
+			i = encodeVarintGenerated(dAtA, i, uint64(len(v)))
+			i += copy(dAtA[i:], v)
+		}
+	}
+	return i, nil
+}
+
+func (m *EventList) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalTo(dAtA)
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *EventList) MarshalTo(dAtA []byte) (int, error) {
+	var i int
+	_ = i
+	var l int
+	_ = l
+	dAtA[i] = 0xa
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size()))
+	n11, err := m.ListMeta.MarshalTo(dAtA[i:])
+	if err != nil {
+		return 0, err
+	}
+	i += n11
+	if len(m.Items) > 0 {
+		for _, msg := range m.Items {
+			dAtA[i] = 0x12
+			i++
+			i = encodeVarintGenerated(dAtA, i, uint64(msg.Size()))
+			n, err := msg.MarshalTo(dAtA[i:])
+			if err != nil {
+				return 0, err
+			}
+			i += n
+		}
+	}
+	return i, nil
+}
+
+func (m *GroupResources) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalTo(dAtA)
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *GroupResources) MarshalTo(dAtA []byte) (int, error) {
+	var i int
+	_ = i
+	var l int
+	_ = l
+	dAtA[i] = 0xa
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Group)))
+	i += copy(dAtA[i:], m.Group)
+	if len(m.Resources) > 0 {
+		for _, s := range m.Resources {
+			dAtA[i] = 0x12
+			i++
+			l = len(s)
+			for l >= 1<<7 {
+				dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
+				l >>= 7
+				i++
+			}
+			dAtA[i] = uint8(l)
+			i++
+			i += copy(dAtA[i:], s)
+		}
+	}
+	if len(m.ResourceNames) > 0 {
+		for _, s := range m.ResourceNames {
+			dAtA[i] = 0x1a
+			i++
+			l = len(s)
+			for l >= 1<<7 {
+				dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
+				l >>= 7
+				i++
+			}
+			dAtA[i] = uint8(l)
+			i++
+			i += copy(dAtA[i:], s)
+		}
+	}
+	return i, nil
+}
+
+func (m *ObjectReference) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalTo(dAtA)
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *ObjectReference) MarshalTo(dAtA []byte) (int, error) {
+	var i int
+	_ = i
+	var l int
+	_ = l
+	dAtA[i] = 0xa
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Resource)))
+	i += copy(dAtA[i:], m.Resource)
+	dAtA[i] = 0x12
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Namespace)))
+	i += copy(dAtA[i:], m.Namespace)
+	dAtA[i] = 0x1a
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name)))
+	i += copy(dAtA[i:], m.Name)
+	dAtA[i] = 0x22
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.UID)))
+	i += copy(dAtA[i:], m.UID)
+	dAtA[i] = 0x2a
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.APIGroup)))
+	i += copy(dAtA[i:], m.APIGroup)
+	dAtA[i] = 0x32
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.APIVersion)))
+	i += copy(dAtA[i:], m.APIVersion)
+	dAtA[i] = 0x3a
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.ResourceVersion)))
+	i += copy(dAtA[i:], m.ResourceVersion)
+	dAtA[i] = 0x42
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Subresource)))
+	i += copy(dAtA[i:], m.Subresource)
+	return i, nil
+}
+
+func (m *Policy) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalTo(dAtA)
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *Policy) MarshalTo(dAtA []byte) (int, error) {
+	var i int
+	_ = i
+	var l int
+	_ = l
+	dAtA[i] = 0xa
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size()))
+	n12, err := m.ObjectMeta.MarshalTo(dAtA[i:])
+	if err != nil {
+		return 0, err
+	}
+	i += n12
+	if len(m.Rules) > 0 {
+		for _, msg := range m.Rules {
+			dAtA[i] = 0x12
+			i++
+			i = encodeVarintGenerated(dAtA, i, uint64(msg.Size()))
+			n, err := msg.MarshalTo(dAtA[i:])
+			if err != nil {
+				return 0, err
+			}
+			i += n
+		}
+	}
+	if len(m.OmitStages) > 0 {
+		for _, s := range m.OmitStages {
+			dAtA[i] = 0x1a
+			i++
+			l = len(s)
+			for l >= 1<<7 {
+				dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
+				l >>= 7
+				i++
+			}
+			dAtA[i] = uint8(l)
+			i++
+			i += copy(dAtA[i:], s)
+		}
+	}
+	return i, nil
+}
+
+func (m *PolicyList) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalTo(dAtA)
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *PolicyList) MarshalTo(dAtA []byte) (int, error) {
+	var i int
+	_ = i
+	var l int
+	_ = l
+	dAtA[i] = 0xa
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size()))
+	n13, err := m.ListMeta.MarshalTo(dAtA[i:])
+	if err != nil {
+		return 0, err
+	}
+	i += n13
+	if len(m.Items) > 0 {
+		for _, msg := range m.Items {
+			dAtA[i] = 0x12
+			i++
+			i = encodeVarintGenerated(dAtA, i, uint64(msg.Size()))
+			n, err := msg.MarshalTo(dAtA[i:])
+			if err != nil {
+				return 0, err
+			}
+			i += n
+		}
+	}
+	return i, nil
+}
+
+func (m *PolicyRule) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalTo(dAtA)
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *PolicyRule) MarshalTo(dAtA []byte) (int, error) {
+	var i int
+	_ = i
+	var l int
+	_ = l
+	dAtA[i] = 0xa
+	i++
+	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Level)))
+	i += copy(dAtA[i:], m.Level)
+	if len(m.Users) > 0 {
+		for _, s := range m.Users {
+			dAtA[i] = 0x12
+			i++
+			l = len(s)
+			for l >= 1<<7 {
+				dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
+				l >>= 7
+				i++
+			}
+			dAtA[i] = uint8(l)
+			i++
+			i += copy(dAtA[i:], s)
+		}
+	}
+	if len(m.UserGroups) > 0 {
+		for _, s := range m.UserGroups {
+			dAtA[i] = 0x1a
+			i++
+			l = len(s)
+			for l >= 1<<7 {
+				dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
+				l >>= 7
+				i++
+			}
+			dAtA[i] = uint8(l)
+			i++
+			i += copy(dAtA[i:], s)
+		}
+	}
+	if len(m.Verbs) > 0 {
+		for _, s := range m.Verbs {
+			dAtA[i] = 0x22
+			i++
+			l = len(s)
+			for l >= 1<<7 {
+				dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
+				l >>= 7
+				i++
+			}
+			dAtA[i] = uint8(l)
+			i++
+			i += copy(dAtA[i:], s)
+		}
+	}
+	if len(m.Resources) > 0 {
+		for _, msg := range m.Resources {
+			dAtA[i] = 0x2a
+			i++
+			i = encodeVarintGenerated(dAtA, i, uint64(msg.Size()))
+			n, err := msg.MarshalTo(dAtA[i:])
+			if err != nil {
+				return 0, err
+			}
+			i += n
+		}
+	}
+	if len(m.Namespaces) > 0 {
+		for _, s := range m.Namespaces {
+			dAtA[i] = 0x32
+			i++
+			l = len(s)
+			for l >= 1<<7 {
+				dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
+				l >>= 7
+				i++
+			}
+			dAtA[i] = uint8(l)
+			i++
+			i += copy(dAtA[i:], s)
+		}
+	}
+	if len(m.NonResourceURLs) > 0 {
+		for _, s := range m.NonResourceURLs {
+			dAtA[i] = 0x3a
+			i++
+			l = len(s)
+			for l >= 1<<7 {
+				dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
+				l >>= 7
+				i++
+			}
+			dAtA[i] = uint8(l)
+			i++
+			i += copy(dAtA[i:], s)
+		}
+	}
+	if len(m.OmitStages) > 0 {
+		for _, s := range m.OmitStages {
+			dAtA[i] = 0x42
+			i++
+			l = len(s)
+			for l >= 1<<7 {
+				dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
+				l >>= 7
+				i++
+			}
+			dAtA[i] = uint8(l)
+			i++
+			i += copy(dAtA[i:], s)
+		}
+	}
+	return i, nil
+}
+
+func encodeFixed64Generated(dAtA []byte, offset int, v uint64) int {
+	dAtA[offset] = uint8(v)
+	dAtA[offset+1] = uint8(v >> 8)
+	dAtA[offset+2] = uint8(v >> 16)
+	dAtA[offset+3] = uint8(v >> 24)
+	dAtA[offset+4] = uint8(v >> 32)
+	dAtA[offset+5] = uint8(v >> 40)
+	dAtA[offset+6] = uint8(v >> 48)
+	dAtA[offset+7] = uint8(v >> 56)
+	return offset + 8
+}
+func encodeFixed32Generated(dAtA []byte, offset int, v uint32) int {
+	dAtA[offset] = uint8(v)
+	dAtA[offset+1] = uint8(v >> 8)
+	dAtA[offset+2] = uint8(v >> 16)
+	dAtA[offset+3] = uint8(v >> 24)
+	return offset + 4
+}
+func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int {
+	for v >= 1<<7 {
+		dAtA[offset] = uint8(v&0x7f | 0x80)
+		v >>= 7
+		offset++
+	}
+	dAtA[offset] = uint8(v)
+	return offset + 1
+}
+func (m *Event) Size() (n int) {
+	var l int
+	_ = l
+	l = m.ObjectMeta.Size()
+	n += 1 + l + sovGenerated(uint64(l))
+	l = len(m.Level)
+	n += 1 + l + sovGenerated(uint64(l))
+	l = m.Timestamp.Size()
+	n += 1 + l + sovGenerated(uint64(l))
+	l = len(m.AuditID)
+	n += 1 + l + sovGenerated(uint64(l))
+	l = len(m.Stage)
+	n += 1 + l + sovGenerated(uint64(l))
+	l = len(m.RequestURI)
+	n += 1 + l + sovGenerated(uint64(l))
+	l = len(m.Verb)
+	n += 1 + l + sovGenerated(uint64(l))
+	l = m.User.Size()
+	n += 1 + l + sovGenerated(uint64(l))
+	if m.ImpersonatedUser != nil {
+		l = m.ImpersonatedUser.Size()
+		n += 1 + l + sovGenerated(uint64(l))
+	}
+	if len(m.SourceIPs) > 0 {
+		for _, s := range m.SourceIPs {
+			l = len(s)
+			n += 1 + l + sovGenerated(uint64(l))
+		}
+	}
+	if m.ObjectRef != nil {
+		l = m.ObjectRef.Size()
+		n += 1 + l + sovGenerated(uint64(l))
+	}
+	if m.ResponseStatus != nil {
+		l = m.ResponseStatus.Size()
+		n += 1 + l + sovGenerated(uint64(l))
+	}
+	if m.RequestObject != nil {
+		l = m.RequestObject.Size()
+		n += 1 + l + sovGenerated(uint64(l))
+	}
+	if m.ResponseObject != nil {
+		l = m.ResponseObject.Size()
+		n += 1 + l + sovGenerated(uint64(l))
+	}
+	l = m.RequestReceivedTimestamp.Size()
+	n += 1 + l + sovGenerated(uint64(l))
+	l = m.StageTimestamp.Size()
+	n += 2 + l + sovGenerated(uint64(l))
+	if len(m.Annotations) > 0 {
+		for k, v := range m.Annotations {
+			_ = k
+			_ = v
+			mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + len(v) + sovGenerated(uint64(len(v)))
+			n += mapEntrySize + 2 + sovGenerated(uint64(mapEntrySize))
+		}
+	}
+	return n
+}
+
+func (m *EventList) Size() (n int) {
+	var l int
+	_ = l
+	l = m.ListMeta.Size()
+	n += 1 + l + sovGenerated(uint64(l))
+	if len(m.Items) > 0 {
+		for _, e := range m.Items {
+			l = e.Size()
+			n += 1 + l + sovGenerated(uint64(l))
+		}
+	}
+	return n
+}
+
+func (m *GroupResources) Size() (n int) {
+	var l int
+	_ = l
+	l = len(m.Group)
+	n += 1 + l + sovGenerated(uint64(l))
+	if len(m.Resources) > 0 {
+		for _, s := range m.Resources {
+			l = len(s)
+			n += 1 + l + sovGenerated(uint64(l))
+		}
+	}
+	if len(m.ResourceNames) > 0 {
+		for _, s := range m.ResourceNames {
+			l = len(s)
+			n += 1 + l + sovGenerated(uint64(l))
+		}
+	}
+	return n
+}
+
+func (m *ObjectReference) Size() (n int) {
+	var l int
+	_ = l
+	l = len(m.Resource)
+	n += 1 + l + sovGenerated(uint64(l))
+	l = len(m.Namespace)
+	n += 1 + l + sovGenerated(uint64(l))
+	l = len(m.Name)
+	n += 1 + l + sovGenerated(uint64(l))
+	l = len(m.UID)
+	n += 1 + l + sovGenerated(uint64(l))
+	l = len(m.APIGroup)
+	n += 1 + l + sovGenerated(uint64(l))
+	l = len(m.APIVersion)
+	n += 1 + l + sovGenerated(uint64(l))
+	l = len(m.ResourceVersion)
+	n += 1 + l + sovGenerated(uint64(l))
+	l = len(m.Subresource)
+	n += 1 + l + sovGenerated(uint64(l))
+	return n
+}
+
+func (m *Policy) Size() (n int) {
+	var l int
+	_ = l
+	l = m.ObjectMeta.Size()
+	n += 1 + l + sovGenerated(uint64(l))
+	if len(m.Rules) > 0 {
+		for _, e := range m.Rules {
+			l = e.Size()
+			n += 1 + l + sovGenerated(uint64(l))
+		}
+	}
+	if len(m.OmitStages) > 0 {
+		for _, s := range m.OmitStages {
+			l = len(s)
+			n += 1 + l + sovGenerated(uint64(l))
+		}
+	}
+	return n
+}
+
+func (m *PolicyList) Size() (n int) {
+	var l int
+	_ = l
+	l = m.ListMeta.Size()
+	n += 1 + l + sovGenerated(uint64(l))
+	if len(m.Items) > 0 {
+		for _, e := range m.Items {
+			l = e.Size()
+			n += 1 + l + sovGenerated(uint64(l))
+		}
+	}
+	return n
+}
+
+func (m *PolicyRule) Size() (n int) {
+	var l int
+	_ = l
+	l = len(m.Level)
+	n += 1 + l + sovGenerated(uint64(l))
+	if len(m.Users) > 0 {
+		for _, s := range m.Users {
+			l = len(s)
+			n += 1 + l + sovGenerated(uint64(l))
+		}
+	}
+	if len(m.UserGroups) > 0 {
+		for _, s := range m.UserGroups {
+			l = len(s)
+			n += 1 + l + sovGenerated(uint64(l))
+		}
+	}
+	if len(m.Verbs) > 0 {
+		for _, s := range m.Verbs {
+			l = len(s)
+			n += 1 + l + sovGenerated(uint64(l))
+		}
+	}
+	if len(m.Resources) > 0 {
+		for _, e := range m.Resources {
+			l = e.Size()
+			n += 1 + l + sovGenerated(uint64(l))
+		}
+	}
+	if len(m.Namespaces) > 0 {
+		for _, s := range m.Namespaces {
+			l = len(s)
+			n += 1 + l + sovGenerated(uint64(l))
+		}
+	}
+	if len(m.NonResourceURLs) > 0 {
+		for _, s := range m.NonResourceURLs {
+			l = len(s)
+			n += 1 + l + sovGenerated(uint64(l))
+		}
+	}
+	if len(m.OmitStages) > 0 {
+		for _, s := range m.OmitStages {
+			l = len(s)
+			n += 1 + l + sovGenerated(uint64(l))
+		}
+	}
+	return n
+}
+
+func sovGenerated(x uint64) (n int) {
+	for {
+		n++
+		x >>= 7
+		if x == 0 {
+			break
+		}
+	}
+	return n
+}
+func sozGenerated(x uint64) (n int) {
+	return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63))))
+}
+func (this *Event) String() string {
+	if this == nil {
+		return "nil"
+	}
+	keysForAnnotations := make([]string, 0, len(this.Annotations))
+	for k := range this.Annotations {
+		keysForAnnotations = append(keysForAnnotations, k)
+	}
+	github_com_gogo_protobuf_sortkeys.Strings(keysForAnnotations)
+	mapStringForAnnotations := "map[string]string{"
+	for _, k := range keysForAnnotations {
+		mapStringForAnnotations += fmt.Sprintf("%v: %v,", k, this.Annotations[k])
+	}
+	mapStringForAnnotations += "}"
+	s := strings.Join([]string{`&Event{`,
+		`ObjectMeta:` + strings.Replace(strings.Replace(this.ObjectMeta.String(), "ObjectMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ObjectMeta", 1), `&`, ``, 1) + `,`,
+		`Level:` + fmt.Sprintf("%v", this.Level) + `,`,
+		`Timestamp:` + strings.Replace(strings.Replace(this.Timestamp.String(), "Time", "k8s_io_apimachinery_pkg_apis_meta_v1.Time", 1), `&`, ``, 1) + `,`,
+		`AuditID:` + fmt.Sprintf("%v", this.AuditID) + `,`,
+		`Stage:` + fmt.Sprintf("%v", this.Stage) + `,`,
+		`RequestURI:` + fmt.Sprintf("%v", this.RequestURI) + `,`,
+		`Verb:` + fmt.Sprintf("%v", this.Verb) + `,`,
+		`User:` + strings.Replace(strings.Replace(this.User.String(), "UserInfo", "k8s_io_api_authentication_v1.UserInfo", 1), `&`, ``, 1) + `,`,
+		`ImpersonatedUser:` + strings.Replace(fmt.Sprintf("%v", this.ImpersonatedUser), "UserInfo", "k8s_io_api_authentication_v1.UserInfo", 1) + `,`,
+		`SourceIPs:` + fmt.Sprintf("%v", this.SourceIPs) + `,`,
+		`ObjectRef:` + strings.Replace(fmt.Sprintf("%v", this.ObjectRef), "ObjectReference", "ObjectReference", 1) + `,`,
+		`ResponseStatus:` + strings.Replace(fmt.Sprintf("%v", this.ResponseStatus), "Status", "k8s_io_apimachinery_pkg_apis_meta_v1.Status", 1) + `,`,
+		`RequestObject:` + strings.Replace(fmt.Sprintf("%v", this.RequestObject), "Unknown", "k8s_io_apimachinery_pkg_runtime.Unknown", 1) + `,`,
+		`ResponseObject:` + strings.Replace(fmt.Sprintf("%v", this.ResponseObject), "Unknown", "k8s_io_apimachinery_pkg_runtime.Unknown", 1) + `,`,
+		`RequestReceivedTimestamp:` + strings.Replace(strings.Replace(this.RequestReceivedTimestamp.String(), "MicroTime", "k8s_io_apimachinery_pkg_apis_meta_v1.MicroTime", 1), `&`, ``, 1) + `,`,
+		`StageTimestamp:` + strings.Replace(strings.Replace(this.StageTimestamp.String(), "MicroTime", "k8s_io_apimachinery_pkg_apis_meta_v1.MicroTime", 1), `&`, ``, 1) + `,`,
+		`Annotations:` + mapStringForAnnotations + `,`,
+		`}`,
+	}, "")
+	return s
+}
+func (this *EventList) String() string {
+	if this == nil {
+		return "nil"
+	}
+	s := strings.Join([]string{`&EventList{`,
+		`ListMeta:` + strings.Replace(strings.Replace(this.ListMeta.String(), "ListMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ListMeta", 1), `&`, ``, 1) + `,`,
+		`Items:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Items), "Event", "Event", 1), `&`, ``, 1) + `,`,
+		`}`,
+	}, "")
+	return s
+}
+func (this *GroupResources) String() string {
+	if this == nil {
+		return "nil"
+	}
+	s := strings.Join([]string{`&GroupResources{`,
+		`Group:` + fmt.Sprintf("%v", this.Group) + `,`,
+		`Resources:` + fmt.Sprintf("%v", this.Resources) + `,`,
+		`ResourceNames:` + fmt.Sprintf("%v", this.ResourceNames) + `,`,
+		`}`,
+	}, "")
+	return s
+}
+func (this *ObjectReference) String() string {
+	if this == nil {
+		return "nil"
+	}
+	s := strings.Join([]string{`&ObjectReference{`,
+		`Resource:` + fmt.Sprintf("%v", this.Resource) + `,`,
+		`Namespace:` + fmt.Sprintf("%v", this.Namespace) + `,`,
+		`Name:` + fmt.Sprintf("%v", this.Name) + `,`,
+		`UID:` + fmt.Sprintf("%v", this.UID) + `,`,
+		`APIGroup:` + fmt.Sprintf("%v", this.APIGroup) + `,`,
+		`APIVersion:` + fmt.Sprintf("%v", this.APIVersion) + `,`,
+		`ResourceVersion:` + fmt.Sprintf("%v", this.ResourceVersion) + `,`,
+		`Subresource:` + fmt.Sprintf("%v", this.Subresource) + `,`,
+		`}`,
+	}, "")
+	return s
+}
+func (this *Policy) String() string {
+	if this == nil {
+		return "nil"
+	}
+	s := strings.Join([]string{`&Policy{`,
+		`ObjectMeta:` + strings.Replace(strings.Replace(this.ObjectMeta.String(), "ObjectMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ObjectMeta", 1), `&`, ``, 1) + `,`,
+		`Rules:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Rules), "PolicyRule", "PolicyRule", 1), `&`, ``, 1) + `,`,
+		`OmitStages:` + fmt.Sprintf("%v", this.OmitStages) + `,`,
+		`}`,
+	}, "")
+	return s
+}
+func (this *PolicyList) String() string {
+	if this == nil {
+		return "nil"
+	}
+	s := strings.Join([]string{`&PolicyList{`,
+		`ListMeta:` + strings.Replace(strings.Replace(this.ListMeta.String(), "ListMeta", "k8s_io_apimachinery_pkg_apis_meta_v1.ListMeta", 1), `&`, ``, 1) + `,`,
+		`Items:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Items), "Policy", "Policy", 1), `&`, ``, 1) + `,`,
+		`}`,
+	}, "")
+	return s
+}
+func (this *PolicyRule) String() string {
+	if this == nil {
+		return "nil"
+	}
+	s := strings.Join([]string{`&PolicyRule{`,
+		`Level:` + fmt.Sprintf("%v", this.Level) + `,`,
+		`Users:` + fmt.Sprintf("%v", this.Users) + `,`,
+		`UserGroups:` + fmt.Sprintf("%v", this.UserGroups) + `,`,
+		`Verbs:` + fmt.Sprintf("%v", this.Verbs) + `,`,
+		`Resources:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Resources), "GroupResources", "GroupResources", 1), `&`, ``, 1) + `,`,
+		`Namespaces:` + fmt.Sprintf("%v", this.Namespaces) + `,`,
+		`NonResourceURLs:` + fmt.Sprintf("%v", this.NonResourceURLs) + `,`,
+		`OmitStages:` + fmt.Sprintf("%v", this.OmitStages) + `,`,
+		`}`,
+	}, "")
+	return s
+}
+func valueToStringGenerated(v interface{}) string {
+	rv := reflect.ValueOf(v)
+	if rv.IsNil() {
+		return "nil"
+	}
+	pv := reflect.Indirect(rv).Interface()
+	return fmt.Sprintf("*%v", pv)
+}
+func (m *Event) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowGenerated
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= (uint64(b) & 0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: Event: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: Event: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 2:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Level", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Level = Level(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 3:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if err := m.Timestamp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 4:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field AuditID", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.AuditID = k8s_io_apimachinery_pkg_types.UID(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 5:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Stage", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Stage = Stage(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 6:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field RequestURI", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.RequestURI = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 7:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Verb", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Verb = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 8:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field User", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if err := m.User.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 9:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field ImpersonatedUser", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if m.ImpersonatedUser == nil {
+				m.ImpersonatedUser = &k8s_io_api_authentication_v1.UserInfo{}
+			}
+			if err := m.ImpersonatedUser.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 10:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field SourceIPs", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.SourceIPs = append(m.SourceIPs, string(dAtA[iNdEx:postIndex]))
+			iNdEx = postIndex
+		case 11:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field ObjectRef", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if m.ObjectRef == nil {
+				m.ObjectRef = &ObjectReference{}
+			}
+			if err := m.ObjectRef.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 12:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field ResponseStatus", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if m.ResponseStatus == nil {
+				m.ResponseStatus = &k8s_io_apimachinery_pkg_apis_meta_v1.Status{}
+			}
+			if err := m.ResponseStatus.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 13:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field RequestObject", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if m.RequestObject == nil {
+				m.RequestObject = &k8s_io_apimachinery_pkg_runtime.Unknown{}
+			}
+			if err := m.RequestObject.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 14:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field ResponseObject", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if m.ResponseObject == nil {
+				m.ResponseObject = &k8s_io_apimachinery_pkg_runtime.Unknown{}
+			}
+			if err := m.ResponseObject.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 15:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field RequestReceivedTimestamp", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if err := m.RequestReceivedTimestamp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 16:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field StageTimestamp", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if err := m.StageTimestamp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 17:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Annotations", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			var keykey uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				keykey |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			var stringLenmapkey uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLenmapkey |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLenmapkey := int(stringLenmapkey)
+			if intStringLenmapkey < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postStringIndexmapkey := iNdEx + intStringLenmapkey
+			if postStringIndexmapkey > l {
+				return io.ErrUnexpectedEOF
+			}
+			mapkey := string(dAtA[iNdEx:postStringIndexmapkey])
+			iNdEx = postStringIndexmapkey
+			if m.Annotations == nil {
+				m.Annotations = make(map[string]string)
+			}
+			if iNdEx < postIndex {
+				var valuekey uint64
+				for shift := uint(0); ; shift += 7 {
+					if shift >= 64 {
+						return ErrIntOverflowGenerated
+					}
+					if iNdEx >= l {
+						return io.ErrUnexpectedEOF
+					}
+					b := dAtA[iNdEx]
+					iNdEx++
+					valuekey |= (uint64(b) & 0x7F) << shift
+					if b < 0x80 {
+						break
+					}
+				}
+				var stringLenmapvalue uint64
+				for shift := uint(0); ; shift += 7 {
+					if shift >= 64 {
+						return ErrIntOverflowGenerated
+					}
+					if iNdEx >= l {
+						return io.ErrUnexpectedEOF
+					}
+					b := dAtA[iNdEx]
+					iNdEx++
+					stringLenmapvalue |= (uint64(b) & 0x7F) << shift
+					if b < 0x80 {
+						break
+					}
+				}
+				intStringLenmapvalue := int(stringLenmapvalue)
+				if intStringLenmapvalue < 0 {
+					return ErrInvalidLengthGenerated
+				}
+				postStringIndexmapvalue := iNdEx + intStringLenmapvalue
+				if postStringIndexmapvalue > l {
+					return io.ErrUnexpectedEOF
+				}
+				mapvalue := string(dAtA[iNdEx:postStringIndexmapvalue])
+				iNdEx = postStringIndexmapvalue
+				m.Annotations[mapkey] = mapvalue
+			} else {
+				var mapvalue string
+				m.Annotations[mapkey] = mapvalue
+			}
+			iNdEx = postIndex
+		default:
+			iNdEx = preIndex
+			skippy, err := skipGenerated(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
+func (m *EventList) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowGenerated
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= (uint64(b) & 0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: EventList: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: EventList: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 2:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Items = append(m.Items, Event{})
+			if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		default:
+			iNdEx = preIndex
+			skippy, err := skipGenerated(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
+func (m *GroupResources) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowGenerated
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= (uint64(b) & 0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: GroupResources: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: GroupResources: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Group", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Group = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 2:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Resources", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Resources = append(m.Resources, string(dAtA[iNdEx:postIndex]))
+			iNdEx = postIndex
+		case 3:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field ResourceNames", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.ResourceNames = append(m.ResourceNames, string(dAtA[iNdEx:postIndex]))
+			iNdEx = postIndex
+		default:
+			iNdEx = preIndex
+			skippy, err := skipGenerated(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
+func (m *ObjectReference) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowGenerated
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= (uint64(b) & 0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: ObjectReference: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: ObjectReference: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Resource", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Resource = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 2:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Namespace = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 3:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Name = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 4:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field UID", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.UID = k8s_io_apimachinery_pkg_types.UID(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 5:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field APIGroup", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.APIGroup = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 6:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field APIVersion", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.APIVersion = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 7:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field ResourceVersion", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.ResourceVersion = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 8:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Subresource", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Subresource = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		default:
+			iNdEx = preIndex
+			skippy, err := skipGenerated(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
+func (m *Policy) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowGenerated
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= (uint64(b) & 0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: Policy: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: Policy: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 2:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Rules", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Rules = append(m.Rules, PolicyRule{})
+			if err := m.Rules[len(m.Rules)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 3:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field OmitStages", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.OmitStages = append(m.OmitStages, Stage(dAtA[iNdEx:postIndex]))
+			iNdEx = postIndex
+		default:
+			iNdEx = preIndex
+			skippy, err := skipGenerated(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
+func (m *PolicyList) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowGenerated
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= (uint64(b) & 0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: PolicyList: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: PolicyList: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 2:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Items = append(m.Items, Policy{})
+			if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		default:
+			iNdEx = preIndex
+			skippy, err := skipGenerated(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
+func (m *PolicyRule) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowGenerated
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= (uint64(b) & 0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: PolicyRule: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: PolicyRule: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Level", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Level = Level(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 2:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Users", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Users = append(m.Users, string(dAtA[iNdEx:postIndex]))
+			iNdEx = postIndex
+		case 3:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field UserGroups", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.UserGroups = append(m.UserGroups, string(dAtA[iNdEx:postIndex]))
+			iNdEx = postIndex
+		case 4:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Verbs", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Verbs = append(m.Verbs, string(dAtA[iNdEx:postIndex]))
+			iNdEx = postIndex
+		case 5:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Resources", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Resources = append(m.Resources, GroupResources{})
+			if err := m.Resources[len(m.Resources)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 6:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Namespaces", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Namespaces = append(m.Namespaces, string(dAtA[iNdEx:postIndex]))
+			iNdEx = postIndex
+		case 7:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field NonResourceURLs", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.NonResourceURLs = append(m.NonResourceURLs, string(dAtA[iNdEx:postIndex]))
+			iNdEx = postIndex
+		case 8:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field OmitStages", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= (uint64(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.OmitStages = append(m.OmitStages, Stage(dAtA[iNdEx:postIndex]))
+			iNdEx = postIndex
+		default:
+			iNdEx = preIndex
+			skippy, err := skipGenerated(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
+func skipGenerated(dAtA []byte) (n int, err error) {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return 0, ErrIntOverflowGenerated
+			}
+			if iNdEx >= l {
+				return 0, io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= (uint64(b) & 0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		wireType := int(wire & 0x7)
+		switch wireType {
+		case 0:
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return 0, ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return 0, io.ErrUnexpectedEOF
+				}
+				iNdEx++
+				if dAtA[iNdEx-1] < 0x80 {
+					break
+				}
+			}
+			return iNdEx, nil
+		case 1:
+			iNdEx += 8
+			return iNdEx, nil
+		case 2:
+			var length int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return 0, ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return 0, io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				length |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			iNdEx += length
+			if length < 0 {
+				return 0, ErrInvalidLengthGenerated
+			}
+			return iNdEx, nil
+		case 3:
+			for {
+				var innerWire uint64
+				var start int = iNdEx
+				for shift := uint(0); ; shift += 7 {
+					if shift >= 64 {
+						return 0, ErrIntOverflowGenerated
+					}
+					if iNdEx >= l {
+						return 0, io.ErrUnexpectedEOF
+					}
+					b := dAtA[iNdEx]
+					iNdEx++
+					innerWire |= (uint64(b) & 0x7F) << shift
+					if b < 0x80 {
+						break
+					}
+				}
+				innerWireType := int(innerWire & 0x7)
+				if innerWireType == 4 {
+					break
+				}
+				next, err := skipGenerated(dAtA[start:])
+				if err != nil {
+					return 0, err
+				}
+				iNdEx = start + next
+			}
+			return iNdEx, nil
+		case 4:
+			return iNdEx, nil
+		case 5:
+			iNdEx += 4
+			return iNdEx, nil
+		default:
+			return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
+		}
+	}
+	panic("unreachable")
+}
+
+var (
+	ErrInvalidLengthGenerated = fmt.Errorf("proto: negative length found during unmarshaling")
+	ErrIntOverflowGenerated   = fmt.Errorf("proto: integer overflow")
+)
+
+func init() {
+	proto.RegisterFile("k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/generated.proto", fileDescriptorGenerated)
+}
+
+var fileDescriptorGenerated = []byte{
+	// 1283 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0x41, 0x6f, 0x1b, 0x45,
+	0x14, 0xce, 0xd6, 0x71, 0x63, 0x8f, 0x1b, 0xc7, 0x9d, 0x56, 0x74, 0x95, 0x83, 0x6d, 0x8c, 0x04,
+	0x11, 0xa4, 0xbb, 0x6d, 0x5a, 0x48, 0x84, 0x04, 0x28, 0x56, 0x2b, 0xb0, 0x94, 0x86, 0x68, 0x1c,
+	0x57, 0x08, 0x38, 0xb0, 0xb6, 0x5f, 0xec, 0xc5, 0xf6, 0xee, 0x32, 0x33, 0x6b, 0x94, 0x1b, 0x7f,
+	0x00, 0x89, 0x3b, 0xff, 0x82, 0x1f, 0x50, 0x71, 0xcc, 0xb1, 0xc7, 0x9e, 0x2c, 0x62, 0xfe, 0x45,
+	0x04, 0x12, 0x9a, 0xd9, 0xd9, 0x9d, 0xb5, 0x5d, 0xab, 0x0e, 0x87, 0xde, 0x66, 0xde, 0xfb, 0xbe,
+	0xef, 0xbd, 0x79, 0x33, 0xf3, 0x66, 0xd0, 0xc9, 0xe0, 0x80, 0x59, 0xae, 0x6f, 0x0f, 0xc2, 0x36,
+	0x50, 0x0f, 0x38, 0x30, 0x7b, 0x0c, 0x5e, 0xd7, 0xa7, 0xb6, 0x72, 0x38, 0x81, 0xcb, 0x80, 0x8e,
+	0x81, 0xda, 0xc1, 0xa0, 0x27, 0x67, 0xb6, 0x13, 0x76, 0x5d, 0x6e, 0x8f, 0x1f, 0xb6, 0x81, 0x3b,
+	0x0f, 0xed, 0x1e, 0x78, 0x40, 0x1d, 0x0e, 0x5d, 0x2b, 0xa0, 0x3e, 0xf7, 0xf1, 0x07, 0x11, 0xd1,
+	0x4a, 0x88, 0x56, 0x30, 0xe8, 0xc9, 0x99, 0x25, 0x89, 0x96, 0x22, 0x6e, 0xdf, 0xef, 0xb9, 0xbc,
+	0x1f, 0xb6, 0xad, 0x8e, 0x3f, 0xb2, 0x7b, 0x7e, 0xcf, 0xb7, 0x25, 0xbf, 0x1d, 0x9e, 0xc9, 0x99,
+	0x9c, 0xc8, 0x51, 0xa4, 0xbb, 0xbd, 0xab, 0x13, 0xb2, 0x9d, 0x90, 0xf7, 0xc1, 0xe3, 0x6e, 0xc7,
+	0xe1, 0xae, 0xef, 0xd9, 0xe3, 0x85, 0x2c, 0xb6, 0x1f, 0x6b, 0xf4, 0xc8, 0xe9, 0xf4, 0x5d, 0x0f,
+	0xe8, 0xb9, 0x5e, 0xc1, 0x08, 0xb8, 0xf3, 0x3a, 0x96, 0xbd, 0x8c, 0x45, 0x43, 0x8f, 0xbb, 0x23,
+	0x58, 0x20, 0x7c, 0xf2, 0x26, 0x02, 0xeb, 0xf4, 0x61, 0xe4, 0x2c, 0xf0, 0x1e, 0x2d, 0xe3, 0x85,
+	0xdc, 0x1d, 0xda, 0xae, 0xc7, 0x19, 0xa7, 0x0b, 0xa4, 0x83, 0x37, 0x6f, 0x89, 0x33, 0x0c, 0xfa,
+	0x8b, 0x7b, 0x52, 0xfb, 0xa7, 0x80, 0xb2, 0x4f, 0xc7, 0xe0, 0x71, 0xfc, 0x03, 0xca, 0x89, 0xc5,
+	0x77, 0x1d, 0xee, 0x98, 0x46, 0xd5, 0xd8, 0x29, 0xec, 0x3d, 0xb0, 0xf4, 0x86, 0x25, 0xb9, 0xe8,
+	0x3d, 0x13, 0x68, 0x6b, 0xfc, 0xd0, 0xfa, 0xba, 0xfd, 0x23, 0x74, 0xf8, 0x33, 0xe0, 0x4e, 0x1d,
+	0x5f, 0x4c, 0x2a, 0x6b, 0xd3, 0x49, 0x05, 0x69, 0x1b, 0x49, 0x54, 0xf1, 0x2e, 0xca, 0x0e, 0x61,
+	0x0c, 0x43, 0xf3, 0x46, 0xd5, 0xd8, 0xc9, 0xd7, 0xdf, 0x51, 0xe0, 0xec, 0x91, 0x30, 0x5e, 0xc5,
+	0x03, 0x12, 0x81, 0xf0, 0x77, 0x28, 0x2f, 0xea, 0xc4, 0xb8, 0x33, 0x0a, 0xcc, 0x8c, 0x4c, 0xe8,
+	0xc3, 0xd5, 0x12, 0x3a, 0x75, 0x47, 0x50, 0xbf, 0xad, 0xd4, 0xf3, 0xa7, 0xb1, 0x08, 0xd1, 0x7a,
+	0xf8, 0x18, 0x6d, 0xc8, 0xc2, 0x34, 0x9e, 0x98, 0xeb, 0x32, 0x99, 0xc7, 0x0a, 0xbe, 0x71, 0x18,
+	0x99, 0xaf, 0x26, 0x95, 0x77, 0x97, 0xed, 0x04, 0x3f, 0x0f, 0x80, 0x59, 0xad, 0xc6, 0x13, 0x12,
+	0x8b, 0x88, 0xa5, 0x31, 0xee, 0xf4, 0xc0, 0xcc, 0xce, 0x2e, 0xad, 0x29, 0x8c, 0x57, 0xf1, 0x80,
+	0x44, 0x20, 0xbc, 0x87, 0x10, 0x85, 0x9f, 0x42, 0x60, 0xbc, 0x45, 0x1a, 0xe6, 0x4d, 0x49, 0x49,
+	0x4a, 0x47, 0x12, 0x0f, 0x49, 0xa1, 0x70, 0x15, 0xad, 0x8f, 0x81, 0xb6, 0xcd, 0x0d, 0x89, 0xbe,
+	0xa5, 0xd0, 0xeb, 0xcf, 0x81, 0xb6, 0x89, 0xf4, 0xe0, 0xaf, 0xd0, 0x7a, 0xc8, 0x80, 0x9a, 0x39,
+	0x59, 0xab, 0xf7, 0x53, 0xb5, 0xb2, 0x66, 0x6f, 0x85, 0xa8, 0x51, 0x8b, 0x01, 0x6d, 0x78, 0x67,
+	0xbe, 0x56, 0x12, 0x16, 0x22, 0x15, 0x70, 0x1f, 0x95, 0xdc, 0x51, 0x00, 0x94, 0xf9, 0x9e, 0x38,
+	0x2a, 0xc2, 0x63, 0xe6, 0xaf, 0xa5, 0x7a, 0x77, 0x3a, 0xa9, 0x94, 0x1a, 0x73, 0x1a, 0x64, 0x41,
+	0x15, 0x7f, 0x84, 0xf2, 0xcc, 0x0f, 0x69, 0x07, 0x1a, 0x27, 0xcc, 0x44, 0xd5, 0xcc, 0x4e, 0xbe,
+	0xbe, 0x29, 0x36, 0xad, 0x19, 0x1b, 0x89, 0xf6, 0x63, 0x40, 0x79, 0x5f, 0x9e, 0x2b, 0x02, 0x67,
+	0x66, 0x41, 0xe6, 0x73, 0x60, 0xad, 0xd8, 0x53, 0xd4, 0x29, 0x25, 0x70, 0x06, 0x14, 0xbc, 0x0e,
+	0x44, 0x61, 0x12, 0x23, 0xd1, 0xca, 0xb8, 0x8f, 0x8a, 0x14, 0x58, 0xe0, 0x7b, 0x0c, 0x9a, 0xdc,
+	0xe1, 0x21, 0x33, 0x6f, 0xc9, 0x58, 0xbb, 0xab, 0x9d, 0xbe, 0x88, 0x53, 0xc7, 0xd3, 0x49, 0xa5,
+	0x48, 0x66, 0x74, 0xc8, 0x9c, 0x2e, 0x76, 0xd0, 0xa6, 0xda, 0xe1, 0x28, 0x11, 0x73, 0x53, 0x06,
+	0xda, 0x59, 0x1a, 0x48, 0xf5, 0x0e, 0xab, 0xe5, 0x0d, 0x3c, 0xff, 0x67, 0xaf, 0x7e, 0x7b, 0x3a,
+	0xa9, 0x6c, 0x92, 0xb4, 0x04, 0x99, 0x55, 0xc4, 0x5d, 0xbd, 0x18, 0x15, 0xa3, 0x78, 0xcd, 0x18,
+	0x33, 0x0b, 0x51, 0x41, 0xe6, 0x34, 0xf1, 0xaf, 0x06, 0x32, 0x55, 0x5c, 0x02, 0x1d, 0x70, 0xc7,
+	0xd0, 0x4d, 0xae, 0x9d, 0xb9, 0x25, 0x03, 0xda, 0xab, 0x55, 0xef, 0x99, 0xdb, 0xa1, 0xbe, 0xbc,
+	0xc0, 0x55, 0x75, 0x30, 0x4d, 0xb2, 0x44, 0x98, 0x2c, 0x0d, 0x89, 0x7d, 0x54, 0x94, 0x37, 0x4d,
+	0x27, 0x51, 0xfa, 0x7f, 0x49, 0xc4, 0x17, 0xb9, 0xd8, 0x9c, 0x91, 0x23, 0x73, 0xf2, 0x78, 0x8c,
+	0x0a, 0x8e, 0xe7, 0xf9, 0x5c, 0xde, 0x04, 0x66, 0xde, 0xae, 0x66, 0x76, 0x0a, 0x7b, 0x5f, 0xac,
+	0x7c, 0x38, 0x65, 0x07, 0xb6, 0x0e, 0xb5, 0xc2, 0x53, 0x8f, 0xd3, 0xf3, 0xfa, 0x1d, 0x15, 0xbd,
+	0x90, 0xf2, 0x90, 0x74, 0xa0, 0xed, 0xcf, 0x51, 0x69, 0x9e, 0x85, 0x4b, 0x28, 0x33, 0x80, 0x73,
+	0xd9, 0xc3, 0xf3, 0x44, 0x0c, 0xf1, 0x5d, 0x94, 0x1d, 0x3b, 0xc3, 0x10, 0xa2, 0xc6, 0x4b, 0xa2,
+	0xc9, 0xa7, 0x37, 0x0e, 0x8c, 0xda, 0x0b, 0x03, 0xe5, 0x65, 0xf0, 0x23, 0x97, 0x71, 0xfc, 0xfd,
+	0xc2, 0x13, 0x60, 0xad, 0x56, 0x30, 0xc1, 0x96, 0x0f, 0x40, 0x49, 0x65, 0x9c, 0x8b, 0x2d, 0xa9,
+	0xf6, 0xdf, 0x44, 0x59, 0x97, 0xc3, 0x88, 0x99, 0x37, 0x64, 0x75, 0xac, 0xeb, 0x55, 0xa7, 0xbe,
+	0x19, 0xf7, 0xd4, 0x86, 0x10, 0x21, 0x91, 0x56, 0xed, 0x77, 0x03, 0x15, 0xbf, 0xa4, 0x7e, 0x18,
+	0x10, 0x88, 0x1a, 0x05, 0xc3, 0xef, 0xa1, 0x6c, 0x4f, 0x58, 0xa2, 0x0a, 0x68, 0x5e, 0x04, 0x8b,
+	0x7c, 0xa2, 0xf1, 0xd0, 0x98, 0x21, 0x13, 0x52, 0x8d, 0x27, 0x91, 0x21, 0xda, 0x8f, 0xf7, 0xc5,
+	0x3d, 0x8d, 0x26, 0xc7, 0xce, 0x08, 0x98, 0x99, 0x91, 0x04, 0x75, 0xfb, 0x52, 0x0e, 0x32, 0x8b,
+	0xab, 0xfd, 0x91, 0x41, 0x5b, 0x73, 0x8d, 0x07, 0xef, 0xa2, 0x5c, 0x0c, 0x52, 0x19, 0x26, 0x45,
+	0x8b, 0xb5, 0x48, 0x82, 0xc0, 0x36, 0xca, 0x7b, 0x42, 0x2a, 0x70, 0x3a, 0x6a, 0xfb, 0xf4, 0xcb,
+	0x76, 0x1c, 0x3b, 0x88, 0xc6, 0x88, 0x77, 0x42, 0x4c, 0xe4, 0x8b, 0x99, 0x7a, 0x27, 0x04, 0x96,
+	0x48, 0x0f, 0xae, 0xa3, 0x4c, 0xe8, 0x76, 0xd5, 0xbb, 0xf7, 0x40, 0x01, 0x32, 0xad, 0x55, 0xdf,
+	0x3c, 0x41, 0x16, 0x8b, 0x70, 0x02, 0x57, 0x56, 0x54, 0x3d, 0x79, 0xc9, 0x22, 0x0e, 0x4f, 0x1a,
+	0x51, 0xa5, 0x13, 0x84, 0x78, 0xef, 0x9c, 0xc0, 0x7d, 0x0e, 0x94, 0xb9, 0xbe, 0x37, 0xff, 0xde,
+	0x1d, 0x9e, 0x34, 0x94, 0x87, 0xa4, 0x50, 0xf8, 0x10, 0x6d, 0xc5, 0x45, 0x88, 0x89, 0xd1, 0xd3,
+	0x77, 0x4f, 0x11, 0xb7, 0xc8, 0xac, 0x9b, 0xcc, 0xe3, 0xf1, 0xc7, 0xa8, 0xc0, 0xc2, 0x76, 0x52,
+	0xec, 0x9c, 0xa4, 0x27, 0x77, 0xaa, 0xa9, 0x5d, 0x24, 0x8d, 0xab, 0xfd, 0x6b, 0xa0, 0x9b, 0x27,
+	0xfe, 0xd0, 0xed, 0x9c, 0xbf, 0x85, 0x3f, 0xd1, 0x37, 0x28, 0x4b, 0xc3, 0x21, 0xc4, 0x97, 0xe2,
+	0xd1, 0xca, 0x97, 0x22, 0xca, 0x90, 0x84, 0x43, 0xd0, 0x27, 0x5c, 0xcc, 0x18, 0x89, 0x04, 0xf1,
+	0x3e, 0x42, 0xfe, 0xc8, 0xe5, 0xb2, 0x71, 0xc5, 0x27, 0xf6, 0x9e, 0xcc, 0x23, 0xb1, 0xea, 0x8f,
+	0x49, 0x0a, 0x5a, 0xfb, 0xd3, 0x40, 0x28, 0x52, 0x7f, 0x0b, 0x4d, 0xe1, 0x74, 0xb6, 0x29, 0xd8,
+	0xd7, 0x5c, 0xff, 0x92, 0xae, 0xf0, 0x22, 0x13, 0x2f, 0x41, 0x94, 0x44, 0x7f, 0x3c, 0x8d, 0x55,
+	0x3e, 0x9e, 0x15, 0x94, 0x15, 0xbf, 0xa0, 0xb8, 0x2d, 0xe4, 0x05, 0x52, 0x7c, 0x56, 0x18, 0x89,
+	0xec, 0xd8, 0x42, 0x48, 0x0c, 0xe4, 0xd9, 0x8e, 0x2b, 0x5b, 0x14, 0x95, 0x6d, 0x25, 0x56, 0x92,
+	0x42, 0x08, 0x41, 0xf1, 0x41, 0x63, 0xe6, 0xba, 0x16, 0x14, 0xff, 0x36, 0x46, 0x22, 0x3b, 0xee,
+	0xa7, 0x9b, 0x51, 0x56, 0x16, 0x62, 0x7f, 0xe5, 0x42, 0xcc, 0x76, 0x3f, 0xdd, 0x1d, 0x5e, 0xdb,
+	0xc9, 0x2c, 0x84, 0x92, 0x56, 0xc1, 0xcc, 0x9b, 0x3a, 0xf5, 0xa4, 0x97, 0x30, 0x92, 0x42, 0xe0,
+	0xcf, 0xd0, 0x96, 0xe7, 0x7b, 0xb1, 0x54, 0x8b, 0x1c, 0x31, 0x73, 0x43, 0x92, 0xee, 0x88, 0x1b,
+	0x78, 0x3c, 0xeb, 0x22, 0xf3, 0xd8, 0xb9, 0x33, 0x98, 0x5b, 0xf9, 0x0c, 0xd6, 0xef, 0x5f, 0x5c,
+	0x96, 0xd7, 0x5e, 0x5e, 0x96, 0xd7, 0x5e, 0x5d, 0x96, 0xd7, 0x7e, 0x99, 0x96, 0x8d, 0x8b, 0x69,
+	0xd9, 0x78, 0x39, 0x2d, 0x1b, 0xaf, 0xa6, 0x65, 0xe3, 0xaf, 0x69, 0xd9, 0xf8, 0xed, 0xef, 0xf2,
+	0xda, 0xb7, 0x1b, 0xaa, 0x06, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x5e, 0xf6, 0x8d, 0xaa, 0xac,
+	0x0e, 0x00, 0x00,
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/generated.proto b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/generated.proto
new file mode 100644
index 0000000..40decea
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/generated.proto
@@ -0,0 +1,255 @@
+/*
+Copyright The Kubernetes Authors.
+
+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.
+*/
+
+
+// This file was autogenerated by go-to-protobuf. Do not edit it manually!
+
+syntax = 'proto2';
+
+package k8s.io.apiserver.pkg.apis.audit.v1beta1;
+
+import "k8s.io/api/authentication/v1/generated.proto";
+import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto";
+import "k8s.io/apimachinery/pkg/runtime/generated.proto";
+import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto";
+import "k8s.io/apimachinery/pkg/util/intstr/generated.proto";
+import "k8s.io/apiserver/pkg/apis/audit/v1alpha1/generated.proto";
+
+// Package-wide variables from generator "generated".
+option go_package = "v1beta1";
+
+// Event captures all the information that can be included in an API audit log.
+message Event {
+  // ObjectMeta is included for interoperability with API infrastructure.
+  // +optional
+  // DEPRECATED: Use StageTimestamp which supports micro second instead of ObjectMeta.CreateTimestamp
+  // and the rest of the object is not used
+  optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1;
+
+  // AuditLevel at which event was generated
+  optional string level = 2;
+
+  // Time the request reached the apiserver.
+  // DEPRECATED: Use RequestReceivedTimestamp which supports micro second instead.
+  optional k8s.io.apimachinery.pkg.apis.meta.v1.Time timestamp = 3;
+
+  // Unique audit ID, generated for each request.
+  optional string auditID = 4;
+
+  // Stage of the request handling when this event instance was generated.
+  optional string stage = 5;
+
+  // RequestURI is the request URI as sent by the client to a server.
+  optional string requestURI = 6;
+
+  // Verb is the kubernetes verb associated with the request.
+  // For non-resource requests, this is the lower-cased HTTP method.
+  optional string verb = 7;
+
+  // Authenticated user information.
+  optional k8s.io.api.authentication.v1.UserInfo user = 8;
+
+  // Impersonated user information.
+  // +optional
+  optional k8s.io.api.authentication.v1.UserInfo impersonatedUser = 9;
+
+  // Source IPs, from where the request originated and intermediate proxies.
+  // +optional
+  repeated string sourceIPs = 10;
+
+  // Object reference this request is targeted at.
+  // Does not apply for List-type requests, or non-resource requests.
+  // +optional
+  optional ObjectReference objectRef = 11;
+
+  // The response status, populated even when the ResponseObject is not a Status type.
+  // For successful responses, this will only include the Code and StatusSuccess.
+  // For non-status type error responses, this will be auto-populated with the error Message.
+  // +optional
+  optional k8s.io.apimachinery.pkg.apis.meta.v1.Status responseStatus = 12;
+
+  // API object from the request, in JSON format. The RequestObject is recorded as-is in the request
+  // (possibly re-encoded as JSON), prior to version conversion, defaulting, admission or
+  // merging. It is an external versioned object type, and may not be a valid object on its own.
+  // Omitted for non-resource requests.  Only logged at Request Level and higher.
+  // +optional
+  optional k8s.io.apimachinery.pkg.runtime.Unknown requestObject = 13;
+
+  // API object returned in the response, in JSON. The ResponseObject is recorded after conversion
+  // to the external type, and serialized as JSON.  Omitted for non-resource requests.  Only logged
+  // at Response Level.
+  // +optional
+  optional k8s.io.apimachinery.pkg.runtime.Unknown responseObject = 14;
+
+  // Time the request reached the apiserver.
+  // +optional
+  optional k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime requestReceivedTimestamp = 15;
+
+  // Time the request reached current audit stage.
+  // +optional
+  optional k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime stageTimestamp = 16;
+
+  // Annotations is an unstructured key value map stored with an audit event that may be set by
+  // plugins invoked in the request serving chain, including authentication, authorization and
+  // admission plugins. Keys should uniquely identify the informing component to avoid name
+  // collisions (e.g. podsecuritypolicy.admission.k8s.io/policy). Values should be short. Annotations
+  // are included in the Metadata level.
+  // +optional
+  map<string, string> annotations = 17;
+}
+
+// EventList is a list of audit Events.
+message EventList {
+  // +optional
+  optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1;
+
+  repeated Event items = 2;
+}
+
+// GroupResources represents resource kinds in an API group.
+message GroupResources {
+  // Group is the name of the API group that contains the resources.
+  // The empty string represents the core API group.
+  // +optional
+  optional string group = 1;
+
+  // Resources is a list of resources this rule applies to.
+  // 
+  // For example:
+  // 'pods' matches pods.
+  // 'pods/log' matches the log subresource of pods.
+  // '*' matches all resources and their subresources.
+  // 'pods/*' matches all subresources of pods.
+  // '*/scale' matches all scale subresources.
+  // 
+  // If wildcard is present, the validation rule will ensure resources do not
+  // overlap with each other.
+  // 
+  // An empty list implies all resources and subresources in this API groups apply.
+  // +optional
+  repeated string resources = 2;
+
+  // ResourceNames is a list of resource instance names that the policy matches.
+  // Using this field requires Resources to be specified.
+  // An empty list implies that every instance of the resource is matched.
+  // +optional
+  repeated string resourceNames = 3;
+}
+
+// ObjectReference contains enough information to let you inspect or modify the referred object.
+message ObjectReference {
+  // +optional
+  optional string resource = 1;
+
+  // +optional
+  optional string namespace = 2;
+
+  // +optional
+  optional string name = 3;
+
+  // +optional
+  optional string uid = 4;
+
+  // APIGroup is the name of the API group that contains the referred object.
+  // The empty string represents the core API group.
+  // +optional
+  optional string apiGroup = 5;
+
+  // APIVersion is the version of the API group that contains the referred object.
+  // +optional
+  optional string apiVersion = 6;
+
+  // +optional
+  optional string resourceVersion = 7;
+
+  // +optional
+  optional string subresource = 8;
+}
+
+// Policy defines the configuration of audit logging, and the rules for how different request
+// categories are logged.
+message Policy {
+  // ObjectMeta is included for interoperability with API infrastructure.
+  // +optional
+  optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1;
+
+  // Rules specify the audit Level a request should be recorded at.
+  // A request may match multiple rules, in which case the FIRST matching rule is used.
+  // The default audit level is None, but can be overridden by a catch-all rule at the end of the list.
+  // PolicyRules are strictly ordered.
+  repeated PolicyRule rules = 2;
+
+  // OmitStages is a list of stages for which no events are created. Note that this can also
+  // be specified per rule in which case the union of both are omitted.
+  // +optional
+  repeated string omitStages = 3;
+}
+
+// PolicyList is a list of audit Policies.
+message PolicyList {
+  // +optional
+  optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1;
+
+  repeated Policy items = 2;
+}
+
+// PolicyRule maps requests based off metadata to an audit Level.
+// Requests must match the rules of every field (an intersection of rules).
+message PolicyRule {
+  // The Level that requests matching this rule are recorded at.
+  optional string level = 1;
+
+  // The users (by authenticated user name) this rule applies to.
+  // An empty list implies every user.
+  // +optional
+  repeated string users = 2;
+
+  // The user groups this rule applies to. A user is considered matching
+  // if it is a member of any of the UserGroups.
+  // An empty list implies every user group.
+  // +optional
+  repeated string userGroups = 3;
+
+  // The verbs that match this rule.
+  // An empty list implies every verb.
+  // +optional
+  repeated string verbs = 4;
+
+  // Resources that this rule matches. An empty list implies all kinds in all API groups.
+  // +optional
+  repeated GroupResources resources = 5;
+
+  // Namespaces that this rule matches.
+  // The empty string "" matches non-namespaced resources.
+  // An empty list implies every namespace.
+  // +optional
+  repeated string namespaces = 6;
+
+  // NonResourceURLs is a set of URL paths that should be audited.
+  // *s are allowed, but only as the full, final step in the path.
+  // Examples:
+  //  "/metrics" - Log requests for apiserver metrics
+  //  "/healthz*" - Log all health checks
+  // +optional
+  repeated string nonResourceURLs = 7;
+
+  // OmitStages is a list of stages for which no events are created. Note that this can also
+  // be specified policy wide in which case the union of both are omitted.
+  // An empty list means no restrictions will apply.
+  // +optional
+  repeated string omitStages = 8;
+}
+
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/register.go b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/register.go
new file mode 100644
index 0000000..1bb1a50
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/register.go
@@ -0,0 +1,58 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package v1beta1
+
+import (
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+)
+
+// GroupName is the group name use in this package
+const GroupName = "audit.k8s.io"
+
+// SchemeGroupVersion is group version used to register these objects
+var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1beta1"}
+
+// Resource takes an unqualified resource and returns a Group qualified GroupResource
+func Resource(resource string) schema.GroupResource {
+	return SchemeGroupVersion.WithResource(resource).GroupResource()
+}
+
+var (
+	SchemeBuilder      runtime.SchemeBuilder
+	localSchemeBuilder = &SchemeBuilder
+	AddToScheme        = localSchemeBuilder.AddToScheme
+)
+
+func init() {
+	// We only register manually written functions here. The registration of the
+	// generated functions takes place in the generated files. The separation
+	// makes the code compile even when the generated files are missing.
+	localSchemeBuilder.Register(addKnownTypes)
+}
+
+func addKnownTypes(scheme *runtime.Scheme) error {
+	scheme.AddKnownTypes(SchemeGroupVersion,
+		&Event{},
+		&EventList{},
+		&Policy{},
+		&PolicyList{},
+	)
+	metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
+	return nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/types.go b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/types.go
new file mode 100644
index 0000000..0c3299b
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/types.go
@@ -0,0 +1,283 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package v1beta1
+
+import (
+	authnv1 "k8s.io/api/authentication/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/types"
+)
+
+// Header keys used by the audit system.
+const (
+	// Header to hold the audit ID as the request is propagated through the serving hierarchy. The
+	// Audit-ID header should be set by the first server to receive the request (e.g. the federation
+	// server or kube-aggregator).
+	HeaderAuditID = "Audit-ID"
+)
+
+// Level defines the amount of information logged during auditing
+type Level string
+
+// Valid audit levels
+const (
+	// LevelNone disables auditing
+	LevelNone Level = "None"
+	// LevelMetadata provides the basic level of auditing.
+	LevelMetadata Level = "Metadata"
+	// LevelRequest provides Metadata level of auditing, and additionally
+	// logs the request object (does not apply for non-resource requests).
+	LevelRequest Level = "Request"
+	// LevelRequestResponse provides Request level of auditing, and additionally
+	// logs the response object (does not apply for non-resource requests).
+	LevelRequestResponse Level = "RequestResponse"
+)
+
+// Stage defines the stages in request handling that audit events may be generated.
+type Stage string
+
+// Valid audit stages.
+const (
+	// The stage for events generated as soon as the audit handler receives the request, and before it
+	// is delegated down the handler chain.
+	StageRequestReceived = "RequestReceived"
+	// The stage for events generated once the response headers are sent, but before the response body
+	// is sent. This stage is only generated for long-running requests (e.g. watch).
+	StageResponseStarted = "ResponseStarted"
+	// The stage for events generated once the response body has been completed, and no more bytes
+	// will be sent.
+	StageResponseComplete = "ResponseComplete"
+	// The stage for events generated when a panic occurred.
+	StagePanic = "Panic"
+)
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// Event captures all the information that can be included in an API audit log.
+type Event struct {
+	metav1.TypeMeta `json:",inline"`
+	// ObjectMeta is included for interoperability with API infrastructure.
+	// +optional
+	// DEPRECATED: Use StageTimestamp which supports micro second instead of ObjectMeta.CreateTimestamp
+	// and the rest of the object is not used
+	metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
+
+	// AuditLevel at which event was generated
+	Level Level `json:"level" protobuf:"bytes,2,opt,name=level,casttype=Level"`
+
+	// Time the request reached the apiserver.
+	// DEPRECATED: Use RequestReceivedTimestamp which supports micro second instead.
+	Timestamp metav1.Time `json:"timestamp" protobuf:"bytes,3,opt,name=timestamp"`
+	// Unique audit ID, generated for each request.
+	AuditID types.UID `json:"auditID" protobuf:"bytes,4,opt,name=auditID,casttype=k8s.io/apimachinery/pkg/types.UID"`
+	// Stage of the request handling when this event instance was generated.
+	Stage Stage `json:"stage" protobuf:"bytes,5,opt,name=stage,casttype=Stage"`
+
+	// RequestURI is the request URI as sent by the client to a server.
+	RequestURI string `json:"requestURI" protobuf:"bytes,6,opt,name=requestURI"`
+	// Verb is the kubernetes verb associated with the request.
+	// For non-resource requests, this is the lower-cased HTTP method.
+	Verb string `json:"verb" protobuf:"bytes,7,opt,name=verb"`
+	// Authenticated user information.
+	User authnv1.UserInfo `json:"user" protobuf:"bytes,8,opt,name=user"`
+	// Impersonated user information.
+	// +optional
+	ImpersonatedUser *authnv1.UserInfo `json:"impersonatedUser,omitempty" protobuf:"bytes,9,opt,name=impersonatedUser"`
+	// Source IPs, from where the request originated and intermediate proxies.
+	// +optional
+	SourceIPs []string `json:"sourceIPs,omitempty" protobuf:"bytes,10,rep,name=sourceIPs"`
+	// Object reference this request is targeted at.
+	// Does not apply for List-type requests, or non-resource requests.
+	// +optional
+	ObjectRef *ObjectReference `json:"objectRef,omitempty" protobuf:"bytes,11,opt,name=objectRef"`
+	// The response status, populated even when the ResponseObject is not a Status type.
+	// For successful responses, this will only include the Code and StatusSuccess.
+	// For non-status type error responses, this will be auto-populated with the error Message.
+	// +optional
+	ResponseStatus *metav1.Status `json:"responseStatus,omitempty" protobuf:"bytes,12,opt,name=responseStatus"`
+
+	// API object from the request, in JSON format. The RequestObject is recorded as-is in the request
+	// (possibly re-encoded as JSON), prior to version conversion, defaulting, admission or
+	// merging. It is an external versioned object type, and may not be a valid object on its own.
+	// Omitted for non-resource requests.  Only logged at Request Level and higher.
+	// +optional
+	RequestObject *runtime.Unknown `json:"requestObject,omitempty" protobuf:"bytes,13,opt,name=requestObject"`
+	// API object returned in the response, in JSON. The ResponseObject is recorded after conversion
+	// to the external type, and serialized as JSON.  Omitted for non-resource requests.  Only logged
+	// at Response Level.
+	// +optional
+	ResponseObject *runtime.Unknown `json:"responseObject,omitempty" protobuf:"bytes,14,opt,name=responseObject"`
+	// Time the request reached the apiserver.
+	// +optional
+	RequestReceivedTimestamp metav1.MicroTime `json:"requestReceivedTimestamp" protobuf:"bytes,15,opt,name=requestReceivedTimestamp"`
+	// Time the request reached current audit stage.
+	// +optional
+	StageTimestamp metav1.MicroTime `json:"stageTimestamp" protobuf:"bytes,16,opt,name=stageTimestamp"`
+
+	// Annotations is an unstructured key value map stored with an audit event that may be set by
+	// plugins invoked in the request serving chain, including authentication, authorization and
+	// admission plugins. Keys should uniquely identify the informing component to avoid name
+	// collisions (e.g. podsecuritypolicy.admission.k8s.io/policy). Values should be short. Annotations
+	// are included in the Metadata level.
+	// +optional
+	Annotations map[string]string `json:"annotations,omitempty" protobuf:"bytes,17,rep,name=annotations"`
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// EventList is a list of audit Events.
+type EventList struct {
+	metav1.TypeMeta `json:",inline"`
+	// +optional
+	metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
+
+	Items []Event `json:"items" protobuf:"bytes,2,rep,name=items"`
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// Policy defines the configuration of audit logging, and the rules for how different request
+// categories are logged.
+type Policy struct {
+	metav1.TypeMeta `json:",inline"`
+	// ObjectMeta is included for interoperability with API infrastructure.
+	// +optional
+	metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
+
+	// Rules specify the audit Level a request should be recorded at.
+	// A request may match multiple rules, in which case the FIRST matching rule is used.
+	// The default audit level is None, but can be overridden by a catch-all rule at the end of the list.
+	// PolicyRules are strictly ordered.
+	Rules []PolicyRule `json:"rules" protobuf:"bytes,2,rep,name=rules"`
+
+	// OmitStages is a list of stages for which no events are created. Note that this can also
+	// be specified per rule in which case the union of both are omitted.
+	// +optional
+	OmitStages []Stage `json:"omitStages,omitempty" protobuf:"bytes,3,rep,name=omitStages"`
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// PolicyList is a list of audit Policies.
+type PolicyList struct {
+	metav1.TypeMeta `json:",inline"`
+	// +optional
+	metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`
+
+	Items []Policy `json:"items" protobuf:"bytes,2,rep,name=items"`
+}
+
+// PolicyRule maps requests based off metadata to an audit Level.
+// Requests must match the rules of every field (an intersection of rules).
+type PolicyRule struct {
+	// The Level that requests matching this rule are recorded at.
+	Level Level `json:"level" protobuf:"bytes,1,opt,name=level,casttype=Level"`
+
+	// The users (by authenticated user name) this rule applies to.
+	// An empty list implies every user.
+	// +optional
+	Users []string `json:"users,omitempty" protobuf:"bytes,2,rep,name=users"`
+	// The user groups this rule applies to. A user is considered matching
+	// if it is a member of any of the UserGroups.
+	// An empty list implies every user group.
+	// +optional
+	UserGroups []string `json:"userGroups,omitempty" protobuf:"bytes,3,rep,name=userGroups"`
+
+	// The verbs that match this rule.
+	// An empty list implies every verb.
+	// +optional
+	Verbs []string `json:"verbs,omitempty" protobuf:"bytes,4,rep,name=verbs"`
+
+	// Rules can apply to API resources (such as "pods" or "secrets"),
+	// non-resource URL paths (such as "/api"), or neither, but not both.
+	// If neither is specified, the rule is treated as a default for all URLs.
+
+	// Resources that this rule matches. An empty list implies all kinds in all API groups.
+	// +optional
+	Resources []GroupResources `json:"resources,omitempty" protobuf:"bytes,5,rep,name=resources"`
+	// Namespaces that this rule matches.
+	// The empty string "" matches non-namespaced resources.
+	// An empty list implies every namespace.
+	// +optional
+	Namespaces []string `json:"namespaces,omitempty" protobuf:"bytes,6,rep,name=namespaces"`
+
+	// NonResourceURLs is a set of URL paths that should be audited.
+	// *s are allowed, but only as the full, final step in the path.
+	// Examples:
+	//  "/metrics" - Log requests for apiserver metrics
+	//  "/healthz*" - Log all health checks
+	// +optional
+	NonResourceURLs []string `json:"nonResourceURLs,omitempty" protobuf:"bytes,7,rep,name=nonResourceURLs"`
+
+	// OmitStages is a list of stages for which no events are created. Note that this can also
+	// be specified policy wide in which case the union of both are omitted.
+	// An empty list means no restrictions will apply.
+	// +optional
+	OmitStages []Stage `json:"omitStages,omitempty" protobuf:"bytes,8,rep,name=omitStages"`
+}
+
+// GroupResources represents resource kinds in an API group.
+type GroupResources struct {
+	// Group is the name of the API group that contains the resources.
+	// The empty string represents the core API group.
+	// +optional
+	Group string `json:"group,omitempty" protobuf:"bytes,1,opt,name=group"`
+	// Resources is a list of resources this rule applies to.
+	//
+	// For example:
+	// 'pods' matches pods.
+	// 'pods/log' matches the log subresource of pods.
+	// '*' matches all resources and their subresources.
+	// 'pods/*' matches all subresources of pods.
+	// '*/scale' matches all scale subresources.
+	//
+	// If wildcard is present, the validation rule will ensure resources do not
+	// overlap with each other.
+	//
+	// An empty list implies all resources and subresources in this API groups apply.
+	// +optional
+	Resources []string `json:"resources,omitempty" protobuf:"bytes,2,rep,name=resources"`
+	// ResourceNames is a list of resource instance names that the policy matches.
+	// Using this field requires Resources to be specified.
+	// An empty list implies that every instance of the resource is matched.
+	// +optional
+	ResourceNames []string `json:"resourceNames,omitempty" protobuf:"bytes,3,rep,name=resourceNames"`
+}
+
+// ObjectReference contains enough information to let you inspect or modify the referred object.
+type ObjectReference struct {
+	// +optional
+	Resource string `json:"resource,omitempty" protobuf:"bytes,1,opt,name=resource"`
+	// +optional
+	Namespace string `json:"namespace,omitempty" protobuf:"bytes,2,opt,name=namespace"`
+	// +optional
+	Name string `json:"name,omitempty" protobuf:"bytes,3,opt,name=name"`
+	// +optional
+	UID types.UID `json:"uid,omitempty" protobuf:"bytes,4,opt,name=uid,casttype=k8s.io/apimachinery/pkg/types.UID"`
+	// APIGroup is the name of the API group that contains the referred object.
+	// The empty string represents the core API group.
+	// +optional
+	APIGroup string `json:"apiGroup,omitempty" protobuf:"bytes,5,opt,name=apiGroup"`
+	// APIVersion is the version of the API group that contains the referred object.
+	// +optional
+	APIVersion string `json:"apiVersion,omitempty" protobuf:"bytes,6,opt,name=apiVersion"`
+	// +optional
+	ResourceVersion string `json:"resourceVersion,omitempty" protobuf:"bytes,7,opt,name=resourceVersion"`
+	// +optional
+	Subresource string `json:"subresource,omitempty" protobuf:"bytes,8,opt,name=subresource"`
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/zz_generated.conversion.go b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/zz_generated.conversion.go
new file mode 100644
index 0000000..6df889a
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/zz_generated.conversion.go
@@ -0,0 +1,283 @@
+// +build !ignore_autogenerated
+
+/*
+Copyright The Kubernetes Authors.
+
+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.
+*/
+
+// Code generated by conversion-gen. DO NOT EDIT.
+
+package v1beta1
+
+import (
+	unsafe "unsafe"
+
+	authentication_v1 "k8s.io/api/authentication/v1"
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	conversion "k8s.io/apimachinery/pkg/conversion"
+	runtime "k8s.io/apimachinery/pkg/runtime"
+	types "k8s.io/apimachinery/pkg/types"
+	audit "k8s.io/apiserver/pkg/apis/audit"
+)
+
+func init() {
+	localSchemeBuilder.Register(RegisterConversions)
+}
+
+// RegisterConversions adds conversion functions to the given scheme.
+// Public to allow building arbitrary schemes.
+func RegisterConversions(scheme *runtime.Scheme) error {
+	return scheme.AddGeneratedConversionFuncs(
+		Convert_v1beta1_Event_To_audit_Event,
+		Convert_audit_Event_To_v1beta1_Event,
+		Convert_v1beta1_EventList_To_audit_EventList,
+		Convert_audit_EventList_To_v1beta1_EventList,
+		Convert_v1beta1_GroupResources_To_audit_GroupResources,
+		Convert_audit_GroupResources_To_v1beta1_GroupResources,
+		Convert_v1beta1_ObjectReference_To_audit_ObjectReference,
+		Convert_audit_ObjectReference_To_v1beta1_ObjectReference,
+		Convert_v1beta1_Policy_To_audit_Policy,
+		Convert_audit_Policy_To_v1beta1_Policy,
+		Convert_v1beta1_PolicyList_To_audit_PolicyList,
+		Convert_audit_PolicyList_To_v1beta1_PolicyList,
+		Convert_v1beta1_PolicyRule_To_audit_PolicyRule,
+		Convert_audit_PolicyRule_To_v1beta1_PolicyRule,
+	)
+}
+
+func autoConvert_v1beta1_Event_To_audit_Event(in *Event, out *audit.Event, s conversion.Scope) error {
+	// WARNING: in.ObjectMeta requires manual conversion: does not exist in peer-type
+	out.Level = audit.Level(in.Level)
+	// WARNING: in.Timestamp requires manual conversion: does not exist in peer-type
+	out.AuditID = types.UID(in.AuditID)
+	out.Stage = audit.Stage(in.Stage)
+	out.RequestURI = in.RequestURI
+	out.Verb = in.Verb
+	// TODO: Inefficient conversion - can we improve it?
+	if err := s.Convert(&in.User, &out.User, 0); err != nil {
+		return err
+	}
+	out.ImpersonatedUser = (*audit.UserInfo)(unsafe.Pointer(in.ImpersonatedUser))
+	out.SourceIPs = *(*[]string)(unsafe.Pointer(&in.SourceIPs))
+	out.ObjectRef = (*audit.ObjectReference)(unsafe.Pointer(in.ObjectRef))
+	out.ResponseStatus = (*v1.Status)(unsafe.Pointer(in.ResponseStatus))
+	out.RequestObject = (*runtime.Unknown)(unsafe.Pointer(in.RequestObject))
+	out.ResponseObject = (*runtime.Unknown)(unsafe.Pointer(in.ResponseObject))
+	out.RequestReceivedTimestamp = in.RequestReceivedTimestamp
+	out.StageTimestamp = in.StageTimestamp
+	out.Annotations = *(*map[string]string)(unsafe.Pointer(&in.Annotations))
+	return nil
+}
+
+func autoConvert_audit_Event_To_v1beta1_Event(in *audit.Event, out *Event, s conversion.Scope) error {
+	out.Level = Level(in.Level)
+	out.AuditID = types.UID(in.AuditID)
+	out.Stage = Stage(in.Stage)
+	out.RequestURI = in.RequestURI
+	out.Verb = in.Verb
+	// TODO: Inefficient conversion - can we improve it?
+	if err := s.Convert(&in.User, &out.User, 0); err != nil {
+		return err
+	}
+	out.ImpersonatedUser = (*authentication_v1.UserInfo)(unsafe.Pointer(in.ImpersonatedUser))
+	out.SourceIPs = *(*[]string)(unsafe.Pointer(&in.SourceIPs))
+	out.ObjectRef = (*ObjectReference)(unsafe.Pointer(in.ObjectRef))
+	out.ResponseStatus = (*v1.Status)(unsafe.Pointer(in.ResponseStatus))
+	out.RequestObject = (*runtime.Unknown)(unsafe.Pointer(in.RequestObject))
+	out.ResponseObject = (*runtime.Unknown)(unsafe.Pointer(in.ResponseObject))
+	out.RequestReceivedTimestamp = in.RequestReceivedTimestamp
+	out.StageTimestamp = in.StageTimestamp
+	out.Annotations = *(*map[string]string)(unsafe.Pointer(&in.Annotations))
+	return nil
+}
+
+func autoConvert_v1beta1_EventList_To_audit_EventList(in *EventList, out *audit.EventList, s conversion.Scope) error {
+	out.ListMeta = in.ListMeta
+	if in.Items != nil {
+		in, out := &in.Items, &out.Items
+		*out = make([]audit.Event, len(*in))
+		for i := range *in {
+			if err := Convert_v1beta1_Event_To_audit_Event(&(*in)[i], &(*out)[i], s); err != nil {
+				return err
+			}
+		}
+	} else {
+		out.Items = nil
+	}
+	return nil
+}
+
+// Convert_v1beta1_EventList_To_audit_EventList is an autogenerated conversion function.
+func Convert_v1beta1_EventList_To_audit_EventList(in *EventList, out *audit.EventList, s conversion.Scope) error {
+	return autoConvert_v1beta1_EventList_To_audit_EventList(in, out, s)
+}
+
+func autoConvert_audit_EventList_To_v1beta1_EventList(in *audit.EventList, out *EventList, s conversion.Scope) error {
+	out.ListMeta = in.ListMeta
+	if in.Items != nil {
+		in, out := &in.Items, &out.Items
+		*out = make([]Event, len(*in))
+		for i := range *in {
+			if err := Convert_audit_Event_To_v1beta1_Event(&(*in)[i], &(*out)[i], s); err != nil {
+				return err
+			}
+		}
+	} else {
+		out.Items = nil
+	}
+	return nil
+}
+
+// Convert_audit_EventList_To_v1beta1_EventList is an autogenerated conversion function.
+func Convert_audit_EventList_To_v1beta1_EventList(in *audit.EventList, out *EventList, s conversion.Scope) error {
+	return autoConvert_audit_EventList_To_v1beta1_EventList(in, out, s)
+}
+
+func autoConvert_v1beta1_GroupResources_To_audit_GroupResources(in *GroupResources, out *audit.GroupResources, s conversion.Scope) error {
+	out.Group = in.Group
+	out.Resources = *(*[]string)(unsafe.Pointer(&in.Resources))
+	out.ResourceNames = *(*[]string)(unsafe.Pointer(&in.ResourceNames))
+	return nil
+}
+
+// Convert_v1beta1_GroupResources_To_audit_GroupResources is an autogenerated conversion function.
+func Convert_v1beta1_GroupResources_To_audit_GroupResources(in *GroupResources, out *audit.GroupResources, s conversion.Scope) error {
+	return autoConvert_v1beta1_GroupResources_To_audit_GroupResources(in, out, s)
+}
+
+func autoConvert_audit_GroupResources_To_v1beta1_GroupResources(in *audit.GroupResources, out *GroupResources, s conversion.Scope) error {
+	out.Group = in.Group
+	out.Resources = *(*[]string)(unsafe.Pointer(&in.Resources))
+	out.ResourceNames = *(*[]string)(unsafe.Pointer(&in.ResourceNames))
+	return nil
+}
+
+// Convert_audit_GroupResources_To_v1beta1_GroupResources is an autogenerated conversion function.
+func Convert_audit_GroupResources_To_v1beta1_GroupResources(in *audit.GroupResources, out *GroupResources, s conversion.Scope) error {
+	return autoConvert_audit_GroupResources_To_v1beta1_GroupResources(in, out, s)
+}
+
+func autoConvert_v1beta1_ObjectReference_To_audit_ObjectReference(in *ObjectReference, out *audit.ObjectReference, s conversion.Scope) error {
+	out.Resource = in.Resource
+	out.Namespace = in.Namespace
+	out.Name = in.Name
+	out.UID = types.UID(in.UID)
+	out.APIGroup = in.APIGroup
+	out.APIVersion = in.APIVersion
+	out.ResourceVersion = in.ResourceVersion
+	out.Subresource = in.Subresource
+	return nil
+}
+
+// Convert_v1beta1_ObjectReference_To_audit_ObjectReference is an autogenerated conversion function.
+func Convert_v1beta1_ObjectReference_To_audit_ObjectReference(in *ObjectReference, out *audit.ObjectReference, s conversion.Scope) error {
+	return autoConvert_v1beta1_ObjectReference_To_audit_ObjectReference(in, out, s)
+}
+
+func autoConvert_audit_ObjectReference_To_v1beta1_ObjectReference(in *audit.ObjectReference, out *ObjectReference, s conversion.Scope) error {
+	out.Resource = in.Resource
+	out.Namespace = in.Namespace
+	out.Name = in.Name
+	out.UID = types.UID(in.UID)
+	out.APIGroup = in.APIGroup
+	out.APIVersion = in.APIVersion
+	out.ResourceVersion = in.ResourceVersion
+	out.Subresource = in.Subresource
+	return nil
+}
+
+// Convert_audit_ObjectReference_To_v1beta1_ObjectReference is an autogenerated conversion function.
+func Convert_audit_ObjectReference_To_v1beta1_ObjectReference(in *audit.ObjectReference, out *ObjectReference, s conversion.Scope) error {
+	return autoConvert_audit_ObjectReference_To_v1beta1_ObjectReference(in, out, s)
+}
+
+func autoConvert_v1beta1_Policy_To_audit_Policy(in *Policy, out *audit.Policy, s conversion.Scope) error {
+	out.ObjectMeta = in.ObjectMeta
+	out.Rules = *(*[]audit.PolicyRule)(unsafe.Pointer(&in.Rules))
+	out.OmitStages = *(*[]audit.Stage)(unsafe.Pointer(&in.OmitStages))
+	return nil
+}
+
+// Convert_v1beta1_Policy_To_audit_Policy is an autogenerated conversion function.
+func Convert_v1beta1_Policy_To_audit_Policy(in *Policy, out *audit.Policy, s conversion.Scope) error {
+	return autoConvert_v1beta1_Policy_To_audit_Policy(in, out, s)
+}
+
+func autoConvert_audit_Policy_To_v1beta1_Policy(in *audit.Policy, out *Policy, s conversion.Scope) error {
+	out.ObjectMeta = in.ObjectMeta
+	out.Rules = *(*[]PolicyRule)(unsafe.Pointer(&in.Rules))
+	out.OmitStages = *(*[]Stage)(unsafe.Pointer(&in.OmitStages))
+	return nil
+}
+
+// Convert_audit_Policy_To_v1beta1_Policy is an autogenerated conversion function.
+func Convert_audit_Policy_To_v1beta1_Policy(in *audit.Policy, out *Policy, s conversion.Scope) error {
+	return autoConvert_audit_Policy_To_v1beta1_Policy(in, out, s)
+}
+
+func autoConvert_v1beta1_PolicyList_To_audit_PolicyList(in *PolicyList, out *audit.PolicyList, s conversion.Scope) error {
+	out.ListMeta = in.ListMeta
+	out.Items = *(*[]audit.Policy)(unsafe.Pointer(&in.Items))
+	return nil
+}
+
+// Convert_v1beta1_PolicyList_To_audit_PolicyList is an autogenerated conversion function.
+func Convert_v1beta1_PolicyList_To_audit_PolicyList(in *PolicyList, out *audit.PolicyList, s conversion.Scope) error {
+	return autoConvert_v1beta1_PolicyList_To_audit_PolicyList(in, out, s)
+}
+
+func autoConvert_audit_PolicyList_To_v1beta1_PolicyList(in *audit.PolicyList, out *PolicyList, s conversion.Scope) error {
+	out.ListMeta = in.ListMeta
+	out.Items = *(*[]Policy)(unsafe.Pointer(&in.Items))
+	return nil
+}
+
+// Convert_audit_PolicyList_To_v1beta1_PolicyList is an autogenerated conversion function.
+func Convert_audit_PolicyList_To_v1beta1_PolicyList(in *audit.PolicyList, out *PolicyList, s conversion.Scope) error {
+	return autoConvert_audit_PolicyList_To_v1beta1_PolicyList(in, out, s)
+}
+
+func autoConvert_v1beta1_PolicyRule_To_audit_PolicyRule(in *PolicyRule, out *audit.PolicyRule, s conversion.Scope) error {
+	out.Level = audit.Level(in.Level)
+	out.Users = *(*[]string)(unsafe.Pointer(&in.Users))
+	out.UserGroups = *(*[]string)(unsafe.Pointer(&in.UserGroups))
+	out.Verbs = *(*[]string)(unsafe.Pointer(&in.Verbs))
+	out.Resources = *(*[]audit.GroupResources)(unsafe.Pointer(&in.Resources))
+	out.Namespaces = *(*[]string)(unsafe.Pointer(&in.Namespaces))
+	out.NonResourceURLs = *(*[]string)(unsafe.Pointer(&in.NonResourceURLs))
+	out.OmitStages = *(*[]audit.Stage)(unsafe.Pointer(&in.OmitStages))
+	return nil
+}
+
+// Convert_v1beta1_PolicyRule_To_audit_PolicyRule is an autogenerated conversion function.
+func Convert_v1beta1_PolicyRule_To_audit_PolicyRule(in *PolicyRule, out *audit.PolicyRule, s conversion.Scope) error {
+	return autoConvert_v1beta1_PolicyRule_To_audit_PolicyRule(in, out, s)
+}
+
+func autoConvert_audit_PolicyRule_To_v1beta1_PolicyRule(in *audit.PolicyRule, out *PolicyRule, s conversion.Scope) error {
+	out.Level = Level(in.Level)
+	out.Users = *(*[]string)(unsafe.Pointer(&in.Users))
+	out.UserGroups = *(*[]string)(unsafe.Pointer(&in.UserGroups))
+	out.Verbs = *(*[]string)(unsafe.Pointer(&in.Verbs))
+	out.Resources = *(*[]GroupResources)(unsafe.Pointer(&in.Resources))
+	out.Namespaces = *(*[]string)(unsafe.Pointer(&in.Namespaces))
+	out.NonResourceURLs = *(*[]string)(unsafe.Pointer(&in.NonResourceURLs))
+	out.OmitStages = *(*[]Stage)(unsafe.Pointer(&in.OmitStages))
+	return nil
+}
+
+// Convert_audit_PolicyRule_To_v1beta1_PolicyRule is an autogenerated conversion function.
+func Convert_audit_PolicyRule_To_v1beta1_PolicyRule(in *audit.PolicyRule, out *PolicyRule, s conversion.Scope) error {
+	return autoConvert_audit_PolicyRule_To_v1beta1_PolicyRule(in, out, s)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/zz_generated.deepcopy.go b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/zz_generated.deepcopy.go
new file mode 100644
index 0000000..5ed9a99
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/zz_generated.deepcopy.go
@@ -0,0 +1,313 @@
+// +build !ignore_autogenerated
+
+/*
+Copyright The Kubernetes Authors.
+
+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.
+*/
+
+// Code generated by deepcopy-gen. DO NOT EDIT.
+
+package v1beta1
+
+import (
+	v1 "k8s.io/api/authentication/v1"
+	meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	runtime "k8s.io/apimachinery/pkg/runtime"
+)
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Event) DeepCopyInto(out *Event) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+	in.Timestamp.DeepCopyInto(&out.Timestamp)
+	in.User.DeepCopyInto(&out.User)
+	if in.ImpersonatedUser != nil {
+		in, out := &in.ImpersonatedUser, &out.ImpersonatedUser
+		if *in == nil {
+			*out = nil
+		} else {
+			*out = new(v1.UserInfo)
+			(*in).DeepCopyInto(*out)
+		}
+	}
+	if in.SourceIPs != nil {
+		in, out := &in.SourceIPs, &out.SourceIPs
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.ObjectRef != nil {
+		in, out := &in.ObjectRef, &out.ObjectRef
+		if *in == nil {
+			*out = nil
+		} else {
+			*out = new(ObjectReference)
+			**out = **in
+		}
+	}
+	if in.ResponseStatus != nil {
+		in, out := &in.ResponseStatus, &out.ResponseStatus
+		if *in == nil {
+			*out = nil
+		} else {
+			*out = new(meta_v1.Status)
+			(*in).DeepCopyInto(*out)
+		}
+	}
+	if in.RequestObject != nil {
+		in, out := &in.RequestObject, &out.RequestObject
+		if *in == nil {
+			*out = nil
+		} else {
+			*out = new(runtime.Unknown)
+			(*in).DeepCopyInto(*out)
+		}
+	}
+	if in.ResponseObject != nil {
+		in, out := &in.ResponseObject, &out.ResponseObject
+		if *in == nil {
+			*out = nil
+		} else {
+			*out = new(runtime.Unknown)
+			(*in).DeepCopyInto(*out)
+		}
+	}
+	in.RequestReceivedTimestamp.DeepCopyInto(&out.RequestReceivedTimestamp)
+	in.StageTimestamp.DeepCopyInto(&out.StageTimestamp)
+	if in.Annotations != nil {
+		in, out := &in.Annotations, &out.Annotations
+		*out = make(map[string]string, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Event.
+func (in *Event) DeepCopy() *Event {
+	if in == nil {
+		return nil
+	}
+	out := new(Event)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *Event) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *EventList) DeepCopyInto(out *EventList) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	out.ListMeta = in.ListMeta
+	if in.Items != nil {
+		in, out := &in.Items, &out.Items
+		*out = make([]Event, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EventList.
+func (in *EventList) DeepCopy() *EventList {
+	if in == nil {
+		return nil
+	}
+	out := new(EventList)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *EventList) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *GroupResources) DeepCopyInto(out *GroupResources) {
+	*out = *in
+	if in.Resources != nil {
+		in, out := &in.Resources, &out.Resources
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.ResourceNames != nil {
+		in, out := &in.ResourceNames, &out.ResourceNames
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GroupResources.
+func (in *GroupResources) DeepCopy() *GroupResources {
+	if in == nil {
+		return nil
+	}
+	out := new(GroupResources)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ObjectReference) DeepCopyInto(out *ObjectReference) {
+	*out = *in
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ObjectReference.
+func (in *ObjectReference) DeepCopy() *ObjectReference {
+	if in == nil {
+		return nil
+	}
+	out := new(ObjectReference)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Policy) DeepCopyInto(out *Policy) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+	if in.Rules != nil {
+		in, out := &in.Rules, &out.Rules
+		*out = make([]PolicyRule, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	if in.OmitStages != nil {
+		in, out := &in.OmitStages, &out.OmitStages
+		*out = make([]Stage, len(*in))
+		copy(*out, *in)
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Policy.
+func (in *Policy) DeepCopy() *Policy {
+	if in == nil {
+		return nil
+	}
+	out := new(Policy)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *Policy) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PolicyList) DeepCopyInto(out *PolicyList) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	out.ListMeta = in.ListMeta
+	if in.Items != nil {
+		in, out := &in.Items, &out.Items
+		*out = make([]Policy, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PolicyList.
+func (in *PolicyList) DeepCopy() *PolicyList {
+	if in == nil {
+		return nil
+	}
+	out := new(PolicyList)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *PolicyList) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PolicyRule) DeepCopyInto(out *PolicyRule) {
+	*out = *in
+	if in.Users != nil {
+		in, out := &in.Users, &out.Users
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.UserGroups != nil {
+		in, out := &in.UserGroups, &out.UserGroups
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.Verbs != nil {
+		in, out := &in.Verbs, &out.Verbs
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.Resources != nil {
+		in, out := &in.Resources, &out.Resources
+		*out = make([]GroupResources, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	if in.Namespaces != nil {
+		in, out := &in.Namespaces, &out.Namespaces
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.NonResourceURLs != nil {
+		in, out := &in.NonResourceURLs, &out.NonResourceURLs
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.OmitStages != nil {
+		in, out := &in.OmitStages, &out.OmitStages
+		*out = make([]Stage, len(*in))
+		copy(*out, *in)
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PolicyRule.
+func (in *PolicyRule) DeepCopy() *PolicyRule {
+	if in == nil {
+		return nil
+	}
+	out := new(PolicyRule)
+	in.DeepCopyInto(out)
+	return out
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/zz_generated.defaults.go b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/zz_generated.defaults.go
new file mode 100644
index 0000000..73e63fc
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/v1beta1/zz_generated.defaults.go
@@ -0,0 +1,32 @@
+// +build !ignore_autogenerated
+
+/*
+Copyright The Kubernetes Authors.
+
+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.
+*/
+
+// Code generated by defaulter-gen. DO NOT EDIT.
+
+package v1beta1
+
+import (
+	runtime "k8s.io/apimachinery/pkg/runtime"
+)
+
+// RegisterDefaults adds defaulters functions to the given scheme.
+// Public to allow building arbitrary schemes.
+// All generated defaulters are covering - they call all nested defaulters.
+func RegisterDefaults(scheme *runtime.Scheme) error {
+	return nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/validation/validation.go b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/validation/validation.go
new file mode 100644
index 0000000..f80aba0
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/validation/validation.go
@@ -0,0 +1,132 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package validation
+
+import (
+	"strings"
+
+	"k8s.io/apimachinery/pkg/api/validation"
+	"k8s.io/apimachinery/pkg/util/validation/field"
+	"k8s.io/apiserver/pkg/apis/audit"
+)
+
+func ValidatePolicy(policy *audit.Policy) field.ErrorList {
+	var allErrs field.ErrorList
+	allErrs = append(allErrs, validateOmitStages(policy.OmitStages, field.NewPath("omitStages"))...)
+	rulePath := field.NewPath("rules")
+	for i, rule := range policy.Rules {
+		allErrs = append(allErrs, validatePolicyRule(rule, rulePath.Index(i))...)
+	}
+	return allErrs
+}
+
+func validatePolicyRule(rule audit.PolicyRule, fldPath *field.Path) field.ErrorList {
+	var allErrs field.ErrorList
+	allErrs = append(allErrs, validateLevel(rule.Level, fldPath.Child("level"))...)
+	allErrs = append(allErrs, validateNonResourceURLs(rule.NonResourceURLs, fldPath.Child("nonResourceURLs"))...)
+	allErrs = append(allErrs, validateResources(rule.Resources, fldPath.Child("resources"))...)
+	allErrs = append(allErrs, validateOmitStages(rule.OmitStages, fldPath.Child("omitStages"))...)
+
+	if len(rule.NonResourceURLs) > 0 {
+		if len(rule.Resources) > 0 || len(rule.Namespaces) > 0 {
+			allErrs = append(allErrs, field.Invalid(fldPath.Child("nonResourceURLs"), rule.NonResourceURLs, "rules cannot apply to both regular resources and non-resource URLs"))
+		}
+	}
+
+	return allErrs
+}
+
+var validLevels = []string{
+	string(audit.LevelNone),
+	string(audit.LevelMetadata),
+	string(audit.LevelRequest),
+	string(audit.LevelRequestResponse),
+}
+
+var validOmitStages = []string{
+	string(audit.StageRequestReceived),
+	string(audit.StageResponseStarted),
+	string(audit.StageResponseComplete),
+	string(audit.StagePanic),
+}
+
+func validateLevel(level audit.Level, fldPath *field.Path) field.ErrorList {
+	switch level {
+	case audit.LevelNone, audit.LevelMetadata, audit.LevelRequest, audit.LevelRequestResponse:
+		return nil
+	case "":
+		return field.ErrorList{field.Required(fldPath, "")}
+	default:
+		return field.ErrorList{field.NotSupported(fldPath, level, validLevels)}
+	}
+}
+
+func validateNonResourceURLs(urls []string, fldPath *field.Path) field.ErrorList {
+	var allErrs field.ErrorList
+	for i, url := range urls {
+		if url == "*" {
+			continue
+		}
+
+		if !strings.HasPrefix(url, "/") {
+			allErrs = append(allErrs, field.Invalid(fldPath.Index(i), url, "non-resource URL rules must begin with a '/' character"))
+		}
+
+		if url != "" && strings.ContainsRune(url[:len(url)-1], '*') {
+			allErrs = append(allErrs, field.Invalid(fldPath.Index(i), url, "non-resource URL wildcards '*' must be the final character of the rule"))
+		}
+	}
+	return allErrs
+}
+
+func validateResources(groupResources []audit.GroupResources, fldPath *field.Path) field.ErrorList {
+	var allErrs field.ErrorList
+	for _, groupResource := range groupResources {
+		// The empty string represents the core API group.
+		if len(groupResource.Group) != 0 {
+			// Group names must be lower case and be valid DNS subdomains.
+			// reference: https://github.com/kubernetes/community/blob/master/contributors/devel/api-conventions.md
+			// an error is returned for group name like rbac.authorization.k8s.io/v1beta1
+			// rbac.authorization.k8s.io is the valid one
+			if msgs := validation.NameIsDNSSubdomain(groupResource.Group, false); len(msgs) != 0 {
+				allErrs = append(allErrs, field.Invalid(fldPath.Child("group"), groupResource.Group, strings.Join(msgs, ",")))
+			}
+		}
+
+		if len(groupResource.ResourceNames) > 0 && len(groupResource.Resources) == 0 {
+			allErrs = append(allErrs, field.Invalid(fldPath.Child("resourceNames"), groupResource.ResourceNames, "using resourceNames requires at least one resource"))
+		}
+	}
+	return allErrs
+}
+
+func validateOmitStages(omitStages []audit.Stage, fldPath *field.Path) field.ErrorList {
+	var allErrs field.ErrorList
+	for i, stage := range omitStages {
+		valid := false
+		for _, validOmitStage := range validOmitStages {
+			if string(stage) == validOmitStage {
+				valid = true
+				break
+			}
+		}
+		if !valid {
+			allErrs = append(allErrs, field.Invalid(fldPath.Index(i), string(stage), "allowed stages are "+strings.Join(validOmitStages, ",")))
+		}
+	}
+	return allErrs
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/zz_generated.deepcopy.go b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/zz_generated.deepcopy.go
new file mode 100644
index 0000000..f0f6722
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/apis/audit/zz_generated.deepcopy.go
@@ -0,0 +1,363 @@
+// +build !ignore_autogenerated
+
+/*
+Copyright The Kubernetes Authors.
+
+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.
+*/
+
+// Code generated by deepcopy-gen. DO NOT EDIT.
+
+package audit
+
+import (
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	runtime "k8s.io/apimachinery/pkg/runtime"
+)
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Event) DeepCopyInto(out *Event) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.User.DeepCopyInto(&out.User)
+	if in.ImpersonatedUser != nil {
+		in, out := &in.ImpersonatedUser, &out.ImpersonatedUser
+		if *in == nil {
+			*out = nil
+		} else {
+			*out = new(UserInfo)
+			(*in).DeepCopyInto(*out)
+		}
+	}
+	if in.SourceIPs != nil {
+		in, out := &in.SourceIPs, &out.SourceIPs
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.ObjectRef != nil {
+		in, out := &in.ObjectRef, &out.ObjectRef
+		if *in == nil {
+			*out = nil
+		} else {
+			*out = new(ObjectReference)
+			**out = **in
+		}
+	}
+	if in.ResponseStatus != nil {
+		in, out := &in.ResponseStatus, &out.ResponseStatus
+		if *in == nil {
+			*out = nil
+		} else {
+			*out = new(v1.Status)
+			(*in).DeepCopyInto(*out)
+		}
+	}
+	if in.RequestObject != nil {
+		in, out := &in.RequestObject, &out.RequestObject
+		if *in == nil {
+			*out = nil
+		} else {
+			*out = new(runtime.Unknown)
+			(*in).DeepCopyInto(*out)
+		}
+	}
+	if in.ResponseObject != nil {
+		in, out := &in.ResponseObject, &out.ResponseObject
+		if *in == nil {
+			*out = nil
+		} else {
+			*out = new(runtime.Unknown)
+			(*in).DeepCopyInto(*out)
+		}
+	}
+	in.RequestReceivedTimestamp.DeepCopyInto(&out.RequestReceivedTimestamp)
+	in.StageTimestamp.DeepCopyInto(&out.StageTimestamp)
+	if in.Annotations != nil {
+		in, out := &in.Annotations, &out.Annotations
+		*out = make(map[string]string, len(*in))
+		for key, val := range *in {
+			(*out)[key] = val
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Event.
+func (in *Event) DeepCopy() *Event {
+	if in == nil {
+		return nil
+	}
+	out := new(Event)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *Event) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *EventList) DeepCopyInto(out *EventList) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	out.ListMeta = in.ListMeta
+	if in.Items != nil {
+		in, out := &in.Items, &out.Items
+		*out = make([]Event, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EventList.
+func (in *EventList) DeepCopy() *EventList {
+	if in == nil {
+		return nil
+	}
+	out := new(EventList)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *EventList) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in ExtraValue) DeepCopyInto(out *ExtraValue) {
+	{
+		in := &in
+		*out = make(ExtraValue, len(*in))
+		copy(*out, *in)
+		return
+	}
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExtraValue.
+func (in ExtraValue) DeepCopy() ExtraValue {
+	if in == nil {
+		return nil
+	}
+	out := new(ExtraValue)
+	in.DeepCopyInto(out)
+	return *out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *GroupResources) DeepCopyInto(out *GroupResources) {
+	*out = *in
+	if in.Resources != nil {
+		in, out := &in.Resources, &out.Resources
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.ResourceNames != nil {
+		in, out := &in.ResourceNames, &out.ResourceNames
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GroupResources.
+func (in *GroupResources) DeepCopy() *GroupResources {
+	if in == nil {
+		return nil
+	}
+	out := new(GroupResources)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ObjectReference) DeepCopyInto(out *ObjectReference) {
+	*out = *in
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ObjectReference.
+func (in *ObjectReference) DeepCopy() *ObjectReference {
+	if in == nil {
+		return nil
+	}
+	out := new(ObjectReference)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *Policy) DeepCopyInto(out *Policy) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+	if in.Rules != nil {
+		in, out := &in.Rules, &out.Rules
+		*out = make([]PolicyRule, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	if in.OmitStages != nil {
+		in, out := &in.OmitStages, &out.OmitStages
+		*out = make([]Stage, len(*in))
+		copy(*out, *in)
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Policy.
+func (in *Policy) DeepCopy() *Policy {
+	if in == nil {
+		return nil
+	}
+	out := new(Policy)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *Policy) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PolicyList) DeepCopyInto(out *PolicyList) {
+	*out = *in
+	out.TypeMeta = in.TypeMeta
+	out.ListMeta = in.ListMeta
+	if in.Items != nil {
+		in, out := &in.Items, &out.Items
+		*out = make([]Policy, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PolicyList.
+func (in *PolicyList) DeepCopy() *PolicyList {
+	if in == nil {
+		return nil
+	}
+	out := new(PolicyList)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *PolicyList) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PolicyRule) DeepCopyInto(out *PolicyRule) {
+	*out = *in
+	if in.Users != nil {
+		in, out := &in.Users, &out.Users
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.UserGroups != nil {
+		in, out := &in.UserGroups, &out.UserGroups
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.Verbs != nil {
+		in, out := &in.Verbs, &out.Verbs
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.Resources != nil {
+		in, out := &in.Resources, &out.Resources
+		*out = make([]GroupResources, len(*in))
+		for i := range *in {
+			(*in)[i].DeepCopyInto(&(*out)[i])
+		}
+	}
+	if in.Namespaces != nil {
+		in, out := &in.Namespaces, &out.Namespaces
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.NonResourceURLs != nil {
+		in, out := &in.NonResourceURLs, &out.NonResourceURLs
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.OmitStages != nil {
+		in, out := &in.OmitStages, &out.OmitStages
+		*out = make([]Stage, len(*in))
+		copy(*out, *in)
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PolicyRule.
+func (in *PolicyRule) DeepCopy() *PolicyRule {
+	if in == nil {
+		return nil
+	}
+	out := new(PolicyRule)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *UserInfo) DeepCopyInto(out *UserInfo) {
+	*out = *in
+	if in.Groups != nil {
+		in, out := &in.Groups, &out.Groups
+		*out = make([]string, len(*in))
+		copy(*out, *in)
+	}
+	if in.Extra != nil {
+		in, out := &in.Extra, &out.Extra
+		*out = make(map[string]ExtraValue, len(*in))
+		for key, val := range *in {
+			if val == nil {
+				(*out)[key] = nil
+			} else {
+				(*out)[key] = make([]string, len(val))
+				copy((*out)[key], val)
+			}
+		}
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UserInfo.
+func (in *UserInfo) DeepCopy() *UserInfo {
+	if in == nil {
+		return nil
+	}
+	out := new(UserInfo)
+	in.DeepCopyInto(out)
+	return out
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/audit/format.go b/metrics-server/vendor/k8s.io/apiserver/pkg/audit/format.go
new file mode 100644
index 0000000..bf805f5
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/audit/format.go
@@ -0,0 +1,73 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package audit
+
+import (
+	"fmt"
+	"strconv"
+	"strings"
+	"time"
+
+	auditinternal "k8s.io/apiserver/pkg/apis/audit"
+)
+
+// EventString creates a 1-line text representation of an audit event, using a subset of the
+// information in the event struct.
+func EventString(ev *auditinternal.Event) string {
+	username := "<none>"
+	groups := "<none>"
+	if len(ev.User.Username) > 0 {
+		username = ev.User.Username
+		if len(ev.User.Groups) > 0 {
+			groups = auditStringSlice(ev.User.Groups)
+		}
+	}
+	asuser := "<self>"
+	asgroups := "<lookup>"
+	if ev.ImpersonatedUser != nil {
+		asuser = ev.ImpersonatedUser.Username
+		if ev.ImpersonatedUser.Groups != nil {
+			asgroups = auditStringSlice(ev.ImpersonatedUser.Groups)
+		}
+	}
+
+	namespace := "<none>"
+	if ev.ObjectRef != nil && len(ev.ObjectRef.Namespace) != 0 {
+		namespace = ev.ObjectRef.Namespace
+	}
+
+	response := "<deferred>"
+	if ev.ResponseStatus != nil {
+		response = strconv.Itoa(int(ev.ResponseStatus.Code))
+	}
+
+	ip := "<unknown>"
+	if len(ev.SourceIPs) > 0 {
+		ip = ev.SourceIPs[0]
+	}
+
+	return fmt.Sprintf("%s AUDIT: id=%q stage=%q ip=%q method=%q user=%q groups=%q as=%q asgroups=%q namespace=%q uri=%q response=\"%s\"",
+		ev.RequestReceivedTimestamp.Format(time.RFC3339Nano), ev.AuditID, ev.Stage, ip, ev.Verb, username, groups, asuser, asgroups, namespace, ev.RequestURI, response)
+}
+
+func auditStringSlice(inList []string) string {
+	quotedElements := make([]string, len(inList))
+	for i, in := range inList {
+		quotedElements[i] = fmt.Sprintf("%q", in)
+	}
+	return strings.Join(quotedElements, ",")
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/audit/metrics.go b/metrics-server/vendor/k8s.io/apiserver/pkg/audit/metrics.go
new file mode 100644
index 0000000..10280e0
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/audit/metrics.go
@@ -0,0 +1,87 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package audit
+
+import (
+	"fmt"
+
+	"github.com/golang/glog"
+	"github.com/prometheus/client_golang/prometheus"
+	auditinternal "k8s.io/apiserver/pkg/apis/audit"
+)
+
+const (
+	subsystem = "apiserver_audit"
+)
+
+var (
+	eventCounter = prometheus.NewCounter(
+		prometheus.CounterOpts{
+			Subsystem: subsystem,
+			Name:      "event_total",
+			Help:      "Counter of audit events generated and sent to the audit backend.",
+		})
+	errorCounter = prometheus.NewCounterVec(
+		prometheus.CounterOpts{
+			Subsystem: subsystem,
+			Name:      "error_total",
+			Help: "Counter of audit events that failed to be audited properly. " +
+				"Plugin identifies the plugin affected by the error.",
+		},
+		[]string{"plugin"},
+	)
+	levelCounter = prometheus.NewCounterVec(
+		prometheus.CounterOpts{
+			Subsystem: subsystem,
+			Name:      "level_total",
+			Help:      "Counter of policy levels for audit events (1 per request).",
+		},
+		[]string{"level"},
+	)
+)
+
+func init() {
+	prometheus.MustRegister(eventCounter)
+	prometheus.MustRegister(errorCounter)
+	prometheus.MustRegister(levelCounter)
+}
+
+// ObserveEvent updates the relevant prometheus metrics for the generated audit event.
+func ObserveEvent() {
+	eventCounter.Inc()
+}
+
+// ObservePolicyLevel updates the relevant prometheus metrics with the audit level for a request.
+func ObservePolicyLevel(level auditinternal.Level) {
+	levelCounter.WithLabelValues(string(level)).Inc()
+}
+
+// HandlePluginError handles an error that occurred in an audit plugin. This method should only be
+// used if the error may have prevented the audit event from being properly recorded. The events are
+// logged to the debug log.
+func HandlePluginError(plugin string, err error, impacted ...*auditinternal.Event) {
+	// Count the error.
+	errorCounter.WithLabelValues(plugin).Add(float64(len(impacted)))
+
+	// Log the audit events to the debug log.
+	msg := fmt.Sprintf("Error in audit plugin '%s' affecting %d audit events: %v\nImpacted events:\n",
+		plugin, len(impacted), err)
+	for _, ev := range impacted {
+		msg = msg + EventString(ev) + "\n"
+	}
+	glog.Error(msg)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/audit/policy/checker.go b/metrics-server/vendor/k8s.io/apiserver/pkg/audit/policy/checker.go
new file mode 100644
index 0000000..41c6b1a
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/audit/policy/checker.go
@@ -0,0 +1,219 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package policy
+
+import (
+	"strings"
+
+	"k8s.io/apiserver/pkg/apis/audit"
+	"k8s.io/apiserver/pkg/authorization/authorizer"
+)
+
+const (
+	// DefaultAuditLevel is the default level to audit at, if no policy rules are matched.
+	DefaultAuditLevel = audit.LevelNone
+)
+
+// Checker exposes methods for checking the policy rules.
+type Checker interface {
+	// Check the audit level for a request with the given authorizer attributes.
+	LevelAndStages(authorizer.Attributes) (audit.Level, []audit.Stage)
+}
+
+// NewChecker creates a new policy checker.
+func NewChecker(policy *audit.Policy) Checker {
+	for i, rule := range policy.Rules {
+		policy.Rules[i].OmitStages = unionStages(policy.OmitStages, rule.OmitStages)
+	}
+	return &policyChecker{*policy}
+}
+
+func unionStages(stageLists ...[]audit.Stage) []audit.Stage {
+	m := make(map[audit.Stage]bool)
+	for _, sl := range stageLists {
+		for _, s := range sl {
+			m[s] = true
+		}
+	}
+	result := make([]audit.Stage, 0, len(m))
+	for key := range m {
+		result = append(result, key)
+	}
+	return result
+}
+
+// FakeChecker creates a checker that returns a constant level for all requests (for testing).
+func FakeChecker(level audit.Level, stage []audit.Stage) Checker {
+	return &fakeChecker{level, stage}
+}
+
+type policyChecker struct {
+	audit.Policy
+}
+
+func (p *policyChecker) LevelAndStages(attrs authorizer.Attributes) (audit.Level, []audit.Stage) {
+	for _, rule := range p.Rules {
+		if ruleMatches(&rule, attrs) {
+			return rule.Level, rule.OmitStages
+		}
+	}
+	return DefaultAuditLevel, p.OmitStages
+}
+
+// Check whether the rule matches the request attrs.
+func ruleMatches(r *audit.PolicyRule, attrs authorizer.Attributes) bool {
+	user := attrs.GetUser()
+	if len(r.Users) > 0 {
+		if user == nil || !hasString(r.Users, user.GetName()) {
+			return false
+		}
+	}
+	if len(r.UserGroups) > 0 {
+		if user == nil {
+			return false
+		}
+		matched := false
+		for _, group := range user.GetGroups() {
+			if hasString(r.UserGroups, group) {
+				matched = true
+				break
+			}
+		}
+		if !matched {
+			return false
+		}
+	}
+	if len(r.Verbs) > 0 {
+		if !hasString(r.Verbs, attrs.GetVerb()) {
+			return false
+		}
+	}
+
+	if len(r.Namespaces) > 0 || len(r.Resources) > 0 {
+		return ruleMatchesResource(r, attrs)
+	}
+
+	if len(r.NonResourceURLs) > 0 {
+		return ruleMatchesNonResource(r, attrs)
+	}
+
+	return true
+}
+
+// Check whether the rule's non-resource URLs match the request attrs.
+func ruleMatchesNonResource(r *audit.PolicyRule, attrs authorizer.Attributes) bool {
+	if attrs.IsResourceRequest() {
+		return false
+	}
+
+	path := attrs.GetPath()
+	for _, spec := range r.NonResourceURLs {
+		if pathMatches(path, spec) {
+			return true
+		}
+	}
+
+	return false
+}
+
+// Check whether the path matches the path specification.
+func pathMatches(path, spec string) bool {
+	// Allow wildcard match
+	if spec == "*" {
+		return true
+	}
+	// Allow exact match
+	if spec == path {
+		return true
+	}
+	// Allow a trailing * subpath match
+	if strings.HasSuffix(spec, "*") && strings.HasPrefix(path, strings.TrimRight(spec, "*")) {
+		return true
+	}
+	return false
+}
+
+// Check whether the rule's resource fields match the request attrs.
+func ruleMatchesResource(r *audit.PolicyRule, attrs authorizer.Attributes) bool {
+	if !attrs.IsResourceRequest() {
+		return false
+	}
+
+	if len(r.Namespaces) > 0 {
+		if !hasString(r.Namespaces, attrs.GetNamespace()) { // Non-namespaced resources use the empty string.
+			return false
+		}
+	}
+	if len(r.Resources) == 0 {
+		return true
+	}
+
+	apiGroup := attrs.GetAPIGroup()
+	resource := attrs.GetResource()
+	subresource := attrs.GetSubresource()
+	combinedResource := resource
+	// If subresource, the resource in the policy must match "(resource)/(subresource)"
+	if subresource != "" {
+		combinedResource = resource + "/" + subresource
+	}
+
+	name := attrs.GetName()
+
+	for _, gr := range r.Resources {
+		if gr.Group == apiGroup {
+			if len(gr.Resources) == 0 {
+				return true
+			}
+			for _, res := range gr.Resources {
+				if len(gr.ResourceNames) == 0 || hasString(gr.ResourceNames, name) {
+					// match "*"
+					if res == combinedResource || res == "*" {
+						return true
+					}
+					// match "*/subresource"
+					if len(subresource) > 0 && strings.HasPrefix(res, "*/") && subresource == strings.TrimLeft(res, "*/") {
+						return true
+					}
+					// match "resource/*"
+					if strings.HasSuffix(res, "/*") && resource == strings.TrimRight(res, "/*") {
+						return true
+					}
+				}
+			}
+		}
+	}
+	return false
+}
+
+// Utility function to check whether a string slice contains a string.
+func hasString(slice []string, value string) bool {
+	for _, s := range slice {
+		if s == value {
+			return true
+		}
+	}
+	return false
+}
+
+type fakeChecker struct {
+	level audit.Level
+	stage []audit.Stage
+}
+
+func (f *fakeChecker) LevelAndStages(_ authorizer.Attributes) (audit.Level, []audit.Stage) {
+	return f.level, f.stage
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/audit/policy/reader.go b/metrics-server/vendor/k8s.io/apiserver/pkg/audit/policy/reader.go
new file mode 100644
index 0000000..1d02e1a
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/audit/policy/reader.go
@@ -0,0 +1,79 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package policy
+
+import (
+	"fmt"
+	"io/ioutil"
+
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	auditinternal "k8s.io/apiserver/pkg/apis/audit"
+	auditv1alpha1 "k8s.io/apiserver/pkg/apis/audit/v1alpha1"
+	auditv1beta1 "k8s.io/apiserver/pkg/apis/audit/v1beta1"
+	"k8s.io/apiserver/pkg/apis/audit/validation"
+	"k8s.io/apiserver/pkg/audit"
+
+	"github.com/golang/glog"
+)
+
+var (
+	apiGroupVersions = []schema.GroupVersion{
+		auditv1beta1.SchemeGroupVersion,
+		auditv1alpha1.SchemeGroupVersion,
+	}
+	apiGroupVersionSet = map[schema.GroupVersion]bool{}
+)
+
+func init() {
+	for _, gv := range apiGroupVersions {
+		apiGroupVersionSet[gv] = true
+	}
+}
+
+func LoadPolicyFromFile(filePath string) (*auditinternal.Policy, error) {
+	if filePath == "" {
+		return nil, fmt.Errorf("file path not specified")
+	}
+	policyDef, err := ioutil.ReadFile(filePath)
+	if err != nil {
+		return nil, fmt.Errorf("failed to read file path %q: %+v", filePath, err)
+	}
+
+	policy := &auditinternal.Policy{}
+	decoder := audit.Codecs.UniversalDecoder(apiGroupVersions...)
+
+	_, gvk, err := decoder.Decode(policyDef, nil, policy)
+	if err != nil {
+		return nil, fmt.Errorf("failed decoding file %q: %v", filePath, err)
+	}
+
+	// Ensure the policy file contained an apiVersion and kind.
+	if !apiGroupVersionSet[schema.GroupVersion{Group: gvk.Group, Version: gvk.Version}] {
+		return nil, fmt.Errorf("unknown group version field %v in policy file %s", gvk, filePath)
+	}
+
+	if err := validation.ValidatePolicy(policy); err != nil {
+		return nil, err.ToAggregate()
+	}
+
+	policyCnt := len(policy.Rules)
+	if policyCnt == 0 {
+		return nil, fmt.Errorf("loaded illegal policy with 0 rules from file %s", filePath)
+	}
+	glog.V(4).Infof("Loaded %d audit policy rules from file %s", policyCnt, filePath)
+	return policy, nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/audit/request.go b/metrics-server/vendor/k8s.io/apiserver/pkg/audit/request.go
new file mode 100644
index 0000000..25d6c33
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/audit/request.go
@@ -0,0 +1,235 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package audit
+
+import (
+	"bytes"
+	"fmt"
+	"net/http"
+	"time"
+
+	"github.com/golang/glog"
+	"github.com/pborman/uuid"
+
+	"reflect"
+
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apimachinery/pkg/types"
+	utilnet "k8s.io/apimachinery/pkg/util/net"
+	auditinternal "k8s.io/apiserver/pkg/apis/audit"
+	"k8s.io/apiserver/pkg/authentication/user"
+	"k8s.io/apiserver/pkg/authorization/authorizer"
+)
+
+func NewEventFromRequest(req *http.Request, level auditinternal.Level, attribs authorizer.Attributes) (*auditinternal.Event, error) {
+	ev := &auditinternal.Event{
+		RequestReceivedTimestamp: metav1.NewMicroTime(time.Now()),
+		Verb:       attribs.GetVerb(),
+		RequestURI: req.URL.RequestURI(),
+	}
+
+	ev.Level = level
+
+	// prefer the id from the headers. If not available, create a new one.
+	// TODO(audit): do we want to forbid the header for non-front-proxy users?
+	ids := req.Header.Get(auditinternal.HeaderAuditID)
+	if ids != "" {
+		ev.AuditID = types.UID(ids)
+	} else {
+		ev.AuditID = types.UID(uuid.NewRandom().String())
+	}
+
+	ips := utilnet.SourceIPs(req)
+	ev.SourceIPs = make([]string, len(ips))
+	for i := range ips {
+		ev.SourceIPs[i] = ips[i].String()
+	}
+
+	if user := attribs.GetUser(); user != nil {
+		ev.User.Username = user.GetName()
+		ev.User.Extra = map[string]auditinternal.ExtraValue{}
+		for k, v := range user.GetExtra() {
+			ev.User.Extra[k] = auditinternal.ExtraValue(v)
+		}
+		ev.User.Groups = user.GetGroups()
+		ev.User.UID = user.GetUID()
+	}
+
+	if attribs.IsResourceRequest() {
+		ev.ObjectRef = &auditinternal.ObjectReference{
+			Namespace:   attribs.GetNamespace(),
+			Name:        attribs.GetName(),
+			Resource:    attribs.GetResource(),
+			Subresource: attribs.GetSubresource(),
+			APIGroup:    attribs.GetAPIGroup(),
+			APIVersion:  attribs.GetAPIVersion(),
+		}
+	}
+
+	return ev, nil
+}
+
+// LogImpersonatedUser fills in the impersonated user attributes into an audit event.
+func LogImpersonatedUser(ae *auditinternal.Event, user user.Info) {
+	if ae == nil || ae.Level.Less(auditinternal.LevelMetadata) {
+		return
+	}
+	ae.ImpersonatedUser = &auditinternal.UserInfo{
+		Username: user.GetName(),
+	}
+	ae.ImpersonatedUser.Groups = user.GetGroups()
+	ae.ImpersonatedUser.UID = user.GetUID()
+	ae.ImpersonatedUser.Extra = map[string]auditinternal.ExtraValue{}
+	for k, v := range user.GetExtra() {
+		ae.ImpersonatedUser.Extra[k] = auditinternal.ExtraValue(v)
+	}
+}
+
+// LogRequestObject fills in the request object into an audit event. The passed runtime.Object
+// will be converted to the given gv.
+func LogRequestObject(ae *auditinternal.Event, obj runtime.Object, gvr schema.GroupVersionResource, subresource string, s runtime.NegotiatedSerializer) {
+	if ae == nil || ae.Level.Less(auditinternal.LevelMetadata) {
+		return
+	}
+
+	// complete ObjectRef
+	if ae.ObjectRef == nil {
+		ae.ObjectRef = &auditinternal.ObjectReference{}
+	}
+	if acc, ok := obj.(metav1.ObjectMetaAccessor); ok {
+		meta := acc.GetObjectMeta()
+		if len(ae.ObjectRef.Namespace) == 0 {
+			ae.ObjectRef.Namespace = meta.GetNamespace()
+		}
+		if len(ae.ObjectRef.Name) == 0 {
+			ae.ObjectRef.Name = meta.GetName()
+		}
+		if len(ae.ObjectRef.UID) == 0 {
+			ae.ObjectRef.UID = meta.GetUID()
+		}
+		if len(ae.ObjectRef.ResourceVersion) == 0 {
+			ae.ObjectRef.ResourceVersion = meta.GetResourceVersion()
+		}
+	}
+	if len(ae.ObjectRef.APIVersion) == 0 {
+		ae.ObjectRef.APIGroup = gvr.Group
+		ae.ObjectRef.APIVersion = gvr.Version
+	}
+	if len(ae.ObjectRef.Resource) == 0 {
+		ae.ObjectRef.Resource = gvr.Resource
+	}
+	if len(ae.ObjectRef.Subresource) == 0 {
+		ae.ObjectRef.Subresource = subresource
+	}
+
+	if ae.Level.Less(auditinternal.LevelRequest) {
+		return
+	}
+
+	// TODO(audit): hook into the serializer to avoid double conversion
+	var err error
+	ae.RequestObject, err = encodeObject(obj, gvr.GroupVersion(), s)
+	if err != nil {
+		// TODO(audit): add error slice to audit event struct
+		glog.Warningf("Auditing failed of %v request: %v", reflect.TypeOf(obj).Name(), err)
+		return
+	}
+}
+
+// LogRequestPatch fills in the given patch as the request object into an audit event.
+func LogRequestPatch(ae *auditinternal.Event, patch []byte) {
+	if ae == nil || ae.Level.Less(auditinternal.LevelRequest) {
+		return
+	}
+
+	ae.RequestObject = &runtime.Unknown{
+		Raw:         patch,
+		ContentType: runtime.ContentTypeJSON,
+	}
+}
+
+// LogResponseObject fills in the response object into an audit event. The passed runtime.Object
+// will be converted to the given gv.
+func LogResponseObject(ae *auditinternal.Event, obj runtime.Object, gv schema.GroupVersion, s runtime.NegotiatedSerializer) {
+	if ae == nil || ae.Level.Less(auditinternal.LevelMetadata) {
+		return
+	}
+	if status, ok := obj.(*metav1.Status); ok {
+		// selectively copy the bounded fields.
+		ae.ResponseStatus = &metav1.Status{
+			Status: status.Status,
+			Reason: status.Reason,
+			Code:   status.Code,
+		}
+	}
+
+	if ae.Level.Less(auditinternal.LevelRequestResponse) {
+		return
+	}
+	// TODO(audit): hook into the serializer to avoid double conversion
+	var err error
+	ae.ResponseObject, err = encodeObject(obj, gv, s)
+	if err != nil {
+		glog.Warningf("Audit failed for %q response: %v", reflect.TypeOf(obj).Name(), err)
+	}
+}
+
+func encodeObject(obj runtime.Object, gv schema.GroupVersion, serializer runtime.NegotiatedSerializer) (*runtime.Unknown, error) {
+	supported := serializer.SupportedMediaTypes()
+	for i := range supported {
+		if supported[i].MediaType == "application/json" {
+			enc := serializer.EncoderForVersion(supported[i].Serializer, gv)
+			var buf bytes.Buffer
+			if err := enc.Encode(obj, &buf); err != nil {
+				return nil, fmt.Errorf("encoding failed: %v", err)
+			}
+
+			return &runtime.Unknown{
+				Raw:         buf.Bytes(),
+				ContentType: runtime.ContentTypeJSON,
+			}, nil
+		}
+	}
+	return nil, fmt.Errorf("no json encoder found")
+}
+
+// LogAnnotation fills in the Annotations according to the key value pair.
+func LogAnnotation(ae *auditinternal.Event, key, value string) {
+	if ae == nil || ae.Level.Less(auditinternal.LevelMetadata) {
+		return
+	}
+	if ae.Annotations == nil {
+		ae.Annotations = make(map[string]string)
+	}
+	if v, ok := ae.Annotations[key]; ok && v != value {
+		glog.Warningf("Failed to set annotations[%q] to %q for audit:%q, it has already been set to %q", key, value, ae.AuditID, ae.Annotations[key])
+		return
+	}
+	ae.Annotations[key] = value
+}
+
+// LogAnnotations fills in the Annotations according to the annotations map.
+func LogAnnotations(ae *auditinternal.Event, annotations map[string]string) {
+	if ae == nil || ae.Level.Less(auditinternal.LevelMetadata) {
+		return
+	}
+	for key, value := range annotations {
+		LogAnnotation(ae, key, value)
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/audit/scheme.go b/metrics-server/vendor/k8s.io/apiserver/pkg/audit/scheme.go
new file mode 100644
index 0000000..61c32f5
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/audit/scheme.go
@@ -0,0 +1,36 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+// TODO: Delete this file if we generate a clientset.
+package audit
+
+import (
+	"k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apimachinery/pkg/runtime/serializer"
+	"k8s.io/apiserver/pkg/apis/audit/v1alpha1"
+	"k8s.io/apiserver/pkg/apis/audit/v1beta1"
+)
+
+var Scheme = runtime.NewScheme()
+var Codecs = serializer.NewCodecFactory(Scheme)
+
+func init() {
+	v1.AddToGroupVersion(Scheme, schema.GroupVersion{Version: "v1"})
+	v1alpha1.AddToScheme(Scheme)
+	v1beta1.AddToScheme(Scheme)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/audit/types.go b/metrics-server/vendor/k8s.io/apiserver/pkg/audit/types.go
new file mode 100644
index 0000000..f1b7cef
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/audit/types.go
@@ -0,0 +1,42 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package audit
+
+import (
+	auditinternal "k8s.io/apiserver/pkg/apis/audit"
+)
+
+type Sink interface {
+	// ProcessEvents handles events. Per audit ID it might be that ProcessEvents is called up to three times.
+	// Errors might be logged by the sink itself. If an error should be fatal, leading to an internal
+	// error, ProcessEvents is supposed to panic. The event must not be mutated and is reused by the caller
+	// after the call returns, i.e. the sink has to make a deepcopy to keep a copy around if necessary.
+	ProcessEvents(events ...*auditinternal.Event)
+}
+
+type Backend interface {
+	Sink
+
+	// Run will initialize the backend. It must not block, but may run go routines in the background. If
+	// stopCh is closed, it is supposed to stop them. Run will be called before the first call to ProcessEvents.
+	Run(stopCh <-chan struct{}) error
+
+	// Shutdown will synchronously shut down the backend while making sure that all pending
+	// events are delivered. It can be assumed that this method is called after
+	// the stopCh channel passed to the Run method has been closed.
+	Shutdown()
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/audit/union.go b/metrics-server/vendor/k8s.io/apiserver/pkg/audit/union.go
new file mode 100644
index 0000000..6ee4415
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/audit/union.go
@@ -0,0 +1,68 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package audit
+
+import (
+	"fmt"
+	"strings"
+
+	"k8s.io/apimachinery/pkg/util/errors"
+	auditinternal "k8s.io/apiserver/pkg/apis/audit"
+)
+
+// Union returns an audit Backend which logs events to a set of backends. The returned
+// Sink implementation blocks in turn for each call to ProcessEvents.
+func Union(backends ...Backend) Backend {
+	if len(backends) == 1 {
+		return backends[0]
+	}
+	return union{backends}
+}
+
+type union struct {
+	backends []Backend
+}
+
+func (u union) ProcessEvents(events ...*auditinternal.Event) {
+	for _, backend := range u.backends {
+		backend.ProcessEvents(events...)
+	}
+}
+
+func (u union) Run(stopCh <-chan struct{}) error {
+	var funcs []func() error
+	for _, backend := range u.backends {
+		funcs = append(funcs, func() error {
+			return backend.Run(stopCh)
+		})
+	}
+	return errors.AggregateGoroutines(funcs...)
+}
+
+func (u union) Shutdown() {
+	for _, backend := range u.backends {
+		backend.Shutdown()
+	}
+}
+
+func (u union) String() string {
+	var backendStrings []string
+	for _, backend := range u.backends {
+		backendStrings = append(backendStrings, fmt.Sprintf("%s", backend))
+	}
+	return fmt.Sprintf("union[%s]", strings.Join(backendStrings, ","))
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/authenticator/interfaces.go b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/authenticator/interfaces.go
new file mode 100644
index 0000000..fd3d038
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/authenticator/interfaces.go
@@ -0,0 +1,68 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package authenticator
+
+import (
+	"net/http"
+
+	"k8s.io/apiserver/pkg/authentication/user"
+)
+
+// Token checks a string value against a backing authentication store and returns
+// information about the current user and true if successful, false if not successful,
+// or an error if the token could not be checked.
+type Token interface {
+	AuthenticateToken(token string) (user.Info, bool, error)
+}
+
+// Request attempts to extract authentication information from a request and returns
+// information about the current user and true if successful, false if not successful,
+// or an error if the request could not be checked.
+type Request interface {
+	AuthenticateRequest(req *http.Request) (user.Info, bool, error)
+}
+
+// Password checks a username and password against a backing authentication store and
+// returns information about the user and true if successful, false if not successful,
+// or an error if the username and password could not be checked
+type Password interface {
+	AuthenticatePassword(user, password string) (user.Info, bool, error)
+}
+
+// TokenFunc is a function that implements the Token interface.
+type TokenFunc func(token string) (user.Info, bool, error)
+
+// AuthenticateToken implements authenticator.Token.
+func (f TokenFunc) AuthenticateToken(token string) (user.Info, bool, error) {
+	return f(token)
+}
+
+// RequestFunc is a function that implements the Request interface.
+type RequestFunc func(req *http.Request) (user.Info, bool, error)
+
+// AuthenticateRequest implements authenticator.Request.
+func (f RequestFunc) AuthenticateRequest(req *http.Request) (user.Info, bool, error) {
+	return f(req)
+}
+
+// PasswordFunc is a function that implements the Password interface.
+type PasswordFunc func(user, password string) (user.Info, bool, error)
+
+// AuthenticatePassword implements authenticator.Password.
+func (f PasswordFunc) AuthenticatePassword(user, password string) (user.Info, bool, error) {
+	return f(user, password)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/authenticatorfactory/delegating.go b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/authenticatorfactory/delegating.go
new file mode 100644
index 0000000..61114c1
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/authenticatorfactory/delegating.go
@@ -0,0 +1,115 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package authenticatorfactory
+
+import (
+	"errors"
+	"fmt"
+	"time"
+
+	"github.com/go-openapi/spec"
+
+	"k8s.io/apiserver/pkg/authentication/authenticator"
+	"k8s.io/apiserver/pkg/authentication/group"
+	"k8s.io/apiserver/pkg/authentication/request/anonymous"
+	"k8s.io/apiserver/pkg/authentication/request/bearertoken"
+	"k8s.io/apiserver/pkg/authentication/request/headerrequest"
+	unionauth "k8s.io/apiserver/pkg/authentication/request/union"
+	"k8s.io/apiserver/pkg/authentication/request/websocket"
+	"k8s.io/apiserver/pkg/authentication/request/x509"
+	webhooktoken "k8s.io/apiserver/plugin/pkg/authenticator/token/webhook"
+	authenticationclient "k8s.io/client-go/kubernetes/typed/authentication/v1beta1"
+	"k8s.io/client-go/util/cert"
+)
+
+// DelegatingAuthenticatorConfig is the minimal configuration needed to create an authenticator
+// built to delegate authentication to a kube API server
+type DelegatingAuthenticatorConfig struct {
+	Anonymous bool
+
+	TokenAccessReviewClient authenticationclient.TokenReviewInterface
+
+	// CacheTTL is the length of time that a token authentication answer will be cached.
+	CacheTTL time.Duration
+
+	// ClientCAFile is the CA bundle file used to authenticate client certificates
+	ClientCAFile string
+
+	RequestHeaderConfig *RequestHeaderConfig
+}
+
+func (c DelegatingAuthenticatorConfig) New() (authenticator.Request, *spec.SecurityDefinitions, error) {
+	authenticators := []authenticator.Request{}
+	securityDefinitions := spec.SecurityDefinitions{}
+
+	// front-proxy first, then remote
+	// Add the front proxy authenticator if requested
+	if c.RequestHeaderConfig != nil {
+		requestHeaderAuthenticator, err := headerrequest.NewSecure(
+			c.RequestHeaderConfig.ClientCA,
+			c.RequestHeaderConfig.AllowedClientNames,
+			c.RequestHeaderConfig.UsernameHeaders,
+			c.RequestHeaderConfig.GroupHeaders,
+			c.RequestHeaderConfig.ExtraHeaderPrefixes,
+		)
+		if err != nil {
+			return nil, nil, err
+		}
+		authenticators = append(authenticators, requestHeaderAuthenticator)
+	}
+
+	// x509 client cert auth
+	if len(c.ClientCAFile) > 0 {
+		clientCAs, err := cert.NewPool(c.ClientCAFile)
+		if err != nil {
+			return nil, nil, fmt.Errorf("unable to load client CA file %s: %v", c.ClientCAFile, err)
+		}
+		verifyOpts := x509.DefaultVerifyOptions()
+		verifyOpts.Roots = clientCAs
+		authenticators = append(authenticators, x509.New(verifyOpts, x509.CommonNameUserConversion))
+	}
+
+	if c.TokenAccessReviewClient != nil {
+		tokenAuth, err := webhooktoken.NewFromInterface(c.TokenAccessReviewClient, c.CacheTTL)
+		if err != nil {
+			return nil, nil, err
+		}
+		authenticators = append(authenticators, bearertoken.New(tokenAuth), websocket.NewProtocolAuthenticator(tokenAuth))
+
+		securityDefinitions["BearerToken"] = &spec.SecurityScheme{
+			SecuritySchemeProps: spec.SecuritySchemeProps{
+				Type:        "apiKey",
+				Name:        "authorization",
+				In:          "header",
+				Description: "Bearer Token authentication",
+			},
+		}
+	}
+
+	if len(authenticators) == 0 {
+		if c.Anonymous {
+			return anonymous.NewAuthenticator(), &securityDefinitions, nil
+		}
+		return nil, nil, errors.New("No authentication method configured")
+	}
+
+	authenticator := group.NewAuthenticatedGroupAdder(unionauth.New(authenticators...))
+	if c.Anonymous {
+		authenticator = unionauth.NewFailOnError(authenticator, anonymous.NewAuthenticator())
+	}
+	return authenticator, &securityDefinitions, nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/authenticatorfactory/loopback.go b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/authenticatorfactory/loopback.go
new file mode 100644
index 0000000..f316565
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/authenticatorfactory/loopback.go
@@ -0,0 +1,29 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package authenticatorfactory
+
+import (
+	"k8s.io/apiserver/pkg/authentication/authenticator"
+	"k8s.io/apiserver/pkg/authentication/request/bearertoken"
+	"k8s.io/apiserver/pkg/authentication/token/tokenfile"
+	"k8s.io/apiserver/pkg/authentication/user"
+)
+
+// NewFromTokens returns an authenticator.Request or an error
+func NewFromTokens(tokens map[string]*user.DefaultInfo) authenticator.Request {
+	return bearertoken.New(tokenfile.New(tokens))
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/authenticatorfactory/requestheader.go b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/authenticatorfactory/requestheader.go
new file mode 100644
index 0000000..3eeb238
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/authenticatorfactory/requestheader.go
@@ -0,0 +1,31 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package authenticatorfactory
+
+type RequestHeaderConfig struct {
+	// UsernameHeaders are the headers to check (in order, case-insensitively) for an identity. The first header with a value wins.
+	UsernameHeaders []string
+	// GroupHeaders are the headers to check (case-insensitively) for a group names.  All values will be used.
+	GroupHeaders []string
+	// ExtraHeaderPrefixes are the head prefixes to check (case-insentively) for filling in
+	// the user.Info.Extra.  All values of all matching headers will be added.
+	ExtraHeaderPrefixes []string
+	// ClientCA points to CA bundle file which is used verify the identity of the front proxy
+	ClientCA string
+	// AllowedClientNames is a list of common names that may be presented by the authenticating front proxy.  Empty means: accept any.
+	AllowedClientNames []string
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/group/authenticated_group_adder.go b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/group/authenticated_group_adder.go
new file mode 100644
index 0000000..9f0453b
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/group/authenticated_group_adder.go
@@ -0,0 +1,60 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package group
+
+import (
+	"net/http"
+
+	"k8s.io/apiserver/pkg/authentication/authenticator"
+	"k8s.io/apiserver/pkg/authentication/user"
+)
+
+// AuthenticatedGroupAdder adds system:authenticated group when appropriate
+type AuthenticatedGroupAdder struct {
+	// Authenticator is delegated to make the authentication decision
+	Authenticator authenticator.Request
+}
+
+// NewAuthenticatedGroupAdder wraps a request authenticator, and adds the system:authenticated group when appropriate.
+// Authentication must succeed, the user must not be system:anonymous, the groups system:authenticated or system:unauthenticated must
+// not be present
+func NewAuthenticatedGroupAdder(auth authenticator.Request) authenticator.Request {
+	return &AuthenticatedGroupAdder{auth}
+}
+
+func (g *AuthenticatedGroupAdder) AuthenticateRequest(req *http.Request) (user.Info, bool, error) {
+	u, ok, err := g.Authenticator.AuthenticateRequest(req)
+	if err != nil || !ok {
+		return nil, ok, err
+	}
+
+	if u.GetName() == user.Anonymous {
+		return u, true, nil
+	}
+	for _, group := range u.GetGroups() {
+		if group == user.AllAuthenticated || group == user.AllUnauthenticated {
+			return u, true, nil
+		}
+	}
+
+	return &user.DefaultInfo{
+		Name:   u.GetName(),
+		UID:    u.GetUID(),
+		Groups: append(u.GetGroups(), user.AllAuthenticated),
+		Extra:  u.GetExtra(),
+	}, true, nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/group/group_adder.go b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/group/group_adder.go
new file mode 100644
index 0000000..1f71429
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/group/group_adder.go
@@ -0,0 +1,50 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package group
+
+import (
+	"net/http"
+
+	"k8s.io/apiserver/pkg/authentication/authenticator"
+	"k8s.io/apiserver/pkg/authentication/user"
+)
+
+// GroupAdder adds groups to an authenticated user.Info
+type GroupAdder struct {
+	// Authenticator is delegated to make the authentication decision
+	Authenticator authenticator.Request
+	// Groups are additional groups to add to the user.Info from a successful authentication
+	Groups []string
+}
+
+// NewGroupAdder wraps a request authenticator, and adds the specified groups to the returned user when authentication succeeds
+func NewGroupAdder(auth authenticator.Request, groups []string) authenticator.Request {
+	return &GroupAdder{auth, groups}
+}
+
+func (g *GroupAdder) AuthenticateRequest(req *http.Request) (user.Info, bool, error) {
+	u, ok, err := g.Authenticator.AuthenticateRequest(req)
+	if err != nil || !ok {
+		return nil, ok, err
+	}
+	return &user.DefaultInfo{
+		Name:   u.GetName(),
+		UID:    u.GetUID(),
+		Groups: append(u.GetGroups(), g.Groups...),
+		Extra:  u.GetExtra(),
+	}, true, nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/group/token_group_adder.go b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/group/token_group_adder.go
new file mode 100644
index 0000000..4f60d52
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/group/token_group_adder.go
@@ -0,0 +1,48 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package group
+
+import (
+	"k8s.io/apiserver/pkg/authentication/authenticator"
+	"k8s.io/apiserver/pkg/authentication/user"
+)
+
+// TokenGroupAdder adds groups to an authenticated user.Info
+type TokenGroupAdder struct {
+	// Authenticator is delegated to make the authentication decision
+	Authenticator authenticator.Token
+	// Groups are additional groups to add to the user.Info from a successful authentication
+	Groups []string
+}
+
+// NewTokenGroupAdder wraps a token authenticator, and adds the specified groups to the returned user when authentication succeeds
+func NewTokenGroupAdder(auth authenticator.Token, groups []string) authenticator.Token {
+	return &TokenGroupAdder{auth, groups}
+}
+
+func (g *TokenGroupAdder) AuthenticateToken(token string) (user.Info, bool, error) {
+	u, ok, err := g.Authenticator.AuthenticateToken(token)
+	if err != nil || !ok {
+		return nil, ok, err
+	}
+	return &user.DefaultInfo{
+		Name:   u.GetName(),
+		UID:    u.GetUID(),
+		Groups: append(u.GetGroups(), g.Groups...),
+		Extra:  u.GetExtra(),
+	}, true, nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/request/anonymous/anonymous.go b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/request/anonymous/anonymous.go
new file mode 100644
index 0000000..a6d2294
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/request/anonymous/anonymous.go
@@ -0,0 +1,36 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package anonymous
+
+import (
+	"net/http"
+
+	"k8s.io/apiserver/pkg/authentication/authenticator"
+	"k8s.io/apiserver/pkg/authentication/user"
+)
+
+const (
+	anonymousUser = user.Anonymous
+
+	unauthenticatedGroup = user.AllUnauthenticated
+)
+
+func NewAuthenticator() authenticator.Request {
+	return authenticator.RequestFunc(func(req *http.Request) (user.Info, bool, error) {
+		return &user.DefaultInfo{Name: anonymousUser, Groups: []string{unauthenticatedGroup}}, true, nil
+	})
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/request/bearertoken/bearertoken.go b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/request/bearertoken/bearertoken.go
new file mode 100644
index 0000000..5ca22f3
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/request/bearertoken/bearertoken.go
@@ -0,0 +1,68 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package bearertoken
+
+import (
+	"errors"
+	"net/http"
+	"strings"
+
+	"k8s.io/apiserver/pkg/authentication/authenticator"
+	"k8s.io/apiserver/pkg/authentication/user"
+)
+
+type Authenticator struct {
+	auth authenticator.Token
+}
+
+func New(auth authenticator.Token) *Authenticator {
+	return &Authenticator{auth}
+}
+
+var invalidToken = errors.New("invalid bearer token")
+
+func (a *Authenticator) AuthenticateRequest(req *http.Request) (user.Info, bool, error) {
+	auth := strings.TrimSpace(req.Header.Get("Authorization"))
+	if auth == "" {
+		return nil, false, nil
+	}
+	parts := strings.Split(auth, " ")
+	if len(parts) < 2 || strings.ToLower(parts[0]) != "bearer" {
+		return nil, false, nil
+	}
+
+	token := parts[1]
+
+	// Empty bearer tokens aren't valid
+	if len(token) == 0 {
+		return nil, false, nil
+	}
+
+	user, ok, err := a.auth.AuthenticateToken(token)
+	// if we authenticated successfully, go ahead and remove the bearer token so that no one
+	// is ever tempted to use it inside of the API server
+	if ok {
+		req.Header.Del("Authorization")
+	}
+
+	// If the token authenticator didn't error, provide a default error
+	if !ok && err == nil {
+		err = invalidToken
+	}
+
+	return user, ok, err
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/request/headerrequest/requestheader.go b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/request/headerrequest/requestheader.go
new file mode 100644
index 0000000..948478b
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/request/headerrequest/requestheader.go
@@ -0,0 +1,188 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package headerrequest
+
+import (
+	"crypto/x509"
+	"fmt"
+	"io/ioutil"
+	"net/http"
+	"net/url"
+	"strings"
+
+	"k8s.io/apimachinery/pkg/util/sets"
+	"k8s.io/apiserver/pkg/authentication/authenticator"
+	x509request "k8s.io/apiserver/pkg/authentication/request/x509"
+	"k8s.io/apiserver/pkg/authentication/user"
+	utilcert "k8s.io/client-go/util/cert"
+)
+
+type requestHeaderAuthRequestHandler struct {
+	// nameHeaders are the headers to check (in order, case-insensitively) for an identity. The first header with a value wins.
+	nameHeaders []string
+
+	// groupHeaders are the headers to check (case-insensitively) for group membership.  All values of all headers will be added.
+	groupHeaders []string
+
+	// extraHeaderPrefixes are the head prefixes to check (case-insensitively) for filling in
+	// the user.Info.Extra.  All values of all matching headers will be added.
+	extraHeaderPrefixes []string
+}
+
+func New(nameHeaders []string, groupHeaders []string, extraHeaderPrefixes []string) (authenticator.Request, error) {
+	trimmedNameHeaders, err := trimHeaders(nameHeaders...)
+	if err != nil {
+		return nil, err
+	}
+	trimmedGroupHeaders, err := trimHeaders(groupHeaders...)
+	if err != nil {
+		return nil, err
+	}
+	trimmedExtraHeaderPrefixes, err := trimHeaders(extraHeaderPrefixes...)
+	if err != nil {
+		return nil, err
+	}
+
+	return &requestHeaderAuthRequestHandler{
+		nameHeaders:         trimmedNameHeaders,
+		groupHeaders:        trimmedGroupHeaders,
+		extraHeaderPrefixes: trimmedExtraHeaderPrefixes,
+	}, nil
+}
+
+func trimHeaders(headerNames ...string) ([]string, error) {
+	ret := []string{}
+	for _, headerName := range headerNames {
+		trimmedHeader := strings.TrimSpace(headerName)
+		if len(trimmedHeader) == 0 {
+			return nil, fmt.Errorf("empty header %q", headerName)
+		}
+		ret = append(ret, trimmedHeader)
+	}
+
+	return ret, nil
+}
+
+func NewSecure(clientCA string, proxyClientNames []string, nameHeaders []string, groupHeaders []string, extraHeaderPrefixes []string) (authenticator.Request, error) {
+	headerAuthenticator, err := New(nameHeaders, groupHeaders, extraHeaderPrefixes)
+	if err != nil {
+		return nil, err
+	}
+
+	if len(clientCA) == 0 {
+		return nil, fmt.Errorf("missing clientCA file")
+	}
+
+	// Wrap with an x509 verifier
+	caData, err := ioutil.ReadFile(clientCA)
+	if err != nil {
+		return nil, fmt.Errorf("error reading %s: %v", clientCA, err)
+	}
+	opts := x509request.DefaultVerifyOptions()
+	opts.Roots = x509.NewCertPool()
+	certs, err := utilcert.ParseCertsPEM(caData)
+	if err != nil {
+		return nil, fmt.Errorf("error loading certs from  %s: %v", clientCA, err)
+	}
+	for _, cert := range certs {
+		opts.Roots.AddCert(cert)
+	}
+
+	return x509request.NewVerifier(opts, headerAuthenticator, sets.NewString(proxyClientNames...)), nil
+}
+
+func (a *requestHeaderAuthRequestHandler) AuthenticateRequest(req *http.Request) (user.Info, bool, error) {
+	name := headerValue(req.Header, a.nameHeaders)
+	if len(name) == 0 {
+		return nil, false, nil
+	}
+	groups := allHeaderValues(req.Header, a.groupHeaders)
+	extra := newExtra(req.Header, a.extraHeaderPrefixes)
+
+	// clear headers used for authentication
+	for _, headerName := range a.nameHeaders {
+		req.Header.Del(headerName)
+	}
+	for _, headerName := range a.groupHeaders {
+		req.Header.Del(headerName)
+	}
+	for k := range extra {
+		for _, prefix := range a.extraHeaderPrefixes {
+			req.Header.Del(prefix + k)
+		}
+	}
+
+	return &user.DefaultInfo{
+		Name:   name,
+		Groups: groups,
+		Extra:  extra,
+	}, true, nil
+}
+
+func headerValue(h http.Header, headerNames []string) string {
+	for _, headerName := range headerNames {
+		headerValue := h.Get(headerName)
+		if len(headerValue) > 0 {
+			return headerValue
+		}
+	}
+	return ""
+}
+
+func allHeaderValues(h http.Header, headerNames []string) []string {
+	ret := []string{}
+	for _, headerName := range headerNames {
+		headerKey := http.CanonicalHeaderKey(headerName)
+		values, ok := h[headerKey]
+		if !ok {
+			continue
+		}
+
+		for _, headerValue := range values {
+			if len(headerValue) > 0 {
+				ret = append(ret, headerValue)
+			}
+		}
+	}
+	return ret
+}
+
+func unescapeExtraKey(encodedKey string) string {
+	key, err := url.PathUnescape(encodedKey) // Decode %-encoded bytes.
+	if err != nil {
+		return encodedKey // Always record extra strings, even if malformed/unencoded.
+	}
+	return key
+}
+
+func newExtra(h http.Header, headerPrefixes []string) map[string][]string {
+	ret := map[string][]string{}
+
+	// we have to iterate over prefixes first in order to have proper ordering inside the value slices
+	for _, prefix := range headerPrefixes {
+		for headerName, vv := range h {
+			if !strings.HasPrefix(strings.ToLower(headerName), strings.ToLower(prefix)) {
+				continue
+			}
+
+			extraKey := unescapeExtraKey(strings.ToLower(headerName[len(prefix):]))
+			ret[extraKey] = append(ret[extraKey], vv...)
+		}
+	}
+
+	return ret
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/request/union/union.go b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/request/union/union.go
new file mode 100644
index 0000000..1613940
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/request/union/union.go
@@ -0,0 +1,72 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package union
+
+import (
+	"net/http"
+
+	utilerrors "k8s.io/apimachinery/pkg/util/errors"
+	"k8s.io/apiserver/pkg/authentication/authenticator"
+	"k8s.io/apiserver/pkg/authentication/user"
+)
+
+// unionAuthRequestHandler authenticates requests using a chain of authenticator.Requests
+type unionAuthRequestHandler struct {
+	// Handlers is a chain of request authenticators to delegate to
+	Handlers []authenticator.Request
+	// FailOnError determines whether an error returns short-circuits the chain
+	FailOnError bool
+}
+
+// New returns a request authenticator that validates credentials using a chain of authenticator.Request objects.
+// The entire chain is tried until one succeeds. If all fail, an aggregate error is returned.
+func New(authRequestHandlers ...authenticator.Request) authenticator.Request {
+	if len(authRequestHandlers) == 1 {
+		return authRequestHandlers[0]
+	}
+	return &unionAuthRequestHandler{Handlers: authRequestHandlers, FailOnError: false}
+}
+
+// NewFailOnError returns a request authenticator that validates credentials using a chain of authenticator.Request objects.
+// The first error short-circuits the chain.
+func NewFailOnError(authRequestHandlers ...authenticator.Request) authenticator.Request {
+	if len(authRequestHandlers) == 1 {
+		return authRequestHandlers[0]
+	}
+	return &unionAuthRequestHandler{Handlers: authRequestHandlers, FailOnError: true}
+}
+
+// AuthenticateRequest authenticates the request using a chain of authenticator.Request objects.
+func (authHandler *unionAuthRequestHandler) AuthenticateRequest(req *http.Request) (user.Info, bool, error) {
+	var errlist []error
+	for _, currAuthRequestHandler := range authHandler.Handlers {
+		info, ok, err := currAuthRequestHandler.AuthenticateRequest(req)
+		if err != nil {
+			if authHandler.FailOnError {
+				return info, ok, err
+			}
+			errlist = append(errlist, err)
+			continue
+		}
+
+		if ok {
+			return info, ok, err
+		}
+	}
+
+	return nil, false, utilerrors.NewAggregate(errlist)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/request/websocket/protocol.go b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/request/websocket/protocol.go
new file mode 100644
index 0000000..4a30bb6
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/request/websocket/protocol.go
@@ -0,0 +1,109 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package websocket
+
+import (
+	"encoding/base64"
+	"errors"
+	"net/http"
+	"net/textproto"
+	"strings"
+	"unicode/utf8"
+
+	"k8s.io/apiserver/pkg/authentication/authenticator"
+	"k8s.io/apiserver/pkg/authentication/user"
+	"k8s.io/apiserver/pkg/util/wsstream"
+)
+
+const bearerProtocolPrefix = "base64url.bearer.authorization.k8s.io."
+
+var protocolHeader = textproto.CanonicalMIMEHeaderKey("Sec-WebSocket-Protocol")
+
+var errInvalidToken = errors.New("invalid bearer token")
+
+// ProtocolAuthenticator allows a websocket connection to provide a bearer token as a subprotocol
+// in the format "base64url.bearer.authorization.<base64url-without-padding(bearer-token)>"
+type ProtocolAuthenticator struct {
+	// auth is the token authenticator to use to validate the token
+	auth authenticator.Token
+}
+
+func NewProtocolAuthenticator(auth authenticator.Token) *ProtocolAuthenticator {
+	return &ProtocolAuthenticator{auth}
+}
+
+func (a *ProtocolAuthenticator) AuthenticateRequest(req *http.Request) (user.Info, bool, error) {
+	// Only accept websocket connections
+	if !wsstream.IsWebSocketRequest(req) {
+		return nil, false, nil
+	}
+
+	token := ""
+	sawTokenProtocol := false
+	filteredProtocols := []string{}
+	for _, protocolHeader := range req.Header[protocolHeader] {
+		for _, protocol := range strings.Split(protocolHeader, ",") {
+			protocol = strings.TrimSpace(protocol)
+
+			if !strings.HasPrefix(protocol, bearerProtocolPrefix) {
+				filteredProtocols = append(filteredProtocols, protocol)
+				continue
+			}
+
+			if sawTokenProtocol {
+				return nil, false, errors.New("multiple base64.bearer.authorization tokens specified")
+			}
+			sawTokenProtocol = true
+
+			encodedToken := strings.TrimPrefix(protocol, bearerProtocolPrefix)
+			decodedToken, err := base64.RawURLEncoding.DecodeString(encodedToken)
+			if err != nil {
+				return nil, false, errors.New("invalid base64.bearer.authorization token encoding")
+			}
+			if !utf8.Valid(decodedToken) {
+				return nil, false, errors.New("invalid base64.bearer.authorization token")
+			}
+			token = string(decodedToken)
+		}
+	}
+
+	// Must pass at least one other subprotocol so that we can remove the one containing the bearer token,
+	// and there is at least one to echo back to the client
+	if len(token) > 0 && len(filteredProtocols) == 0 {
+		return nil, false, errors.New("missing additional subprotocol")
+	}
+
+	if len(token) == 0 {
+		return nil, false, nil
+	}
+
+	user, ok, err := a.auth.AuthenticateToken(token)
+
+	// on success, remove the protocol with the token
+	if ok {
+		// https://tools.ietf.org/html/rfc6455#section-11.3.4 indicates the Sec-WebSocket-Protocol header may appear multiple times
+		// in a request, and is logically the same as a single Sec-WebSocket-Protocol header field that contains all values
+		req.Header.Set(protocolHeader, strings.Join(filteredProtocols, ","))
+	}
+
+	// If the token authenticator didn't error, provide a default error
+	if !ok && err == nil {
+		err = errInvalidToken
+	}
+
+	return user, ok, err
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/request/x509/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/request/x509/doc.go
new file mode 100644
index 0000000..8f3d36b
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/request/x509/doc.go
@@ -0,0 +1,19 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+// Package x509 provides a request authenticator that validates and
+// extracts user information from client certificates
+package x509 // import "k8s.io/apiserver/pkg/authentication/request/x509"
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/request/x509/x509.go b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/request/x509/x509.go
new file mode 100644
index 0000000..708a89e
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/request/x509/x509.go
@@ -0,0 +1,215 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package x509
+
+import (
+	"crypto/x509"
+	"crypto/x509/pkix"
+	"encoding/asn1"
+	"fmt"
+	"net/http"
+	"time"
+
+	"github.com/golang/glog"
+	"github.com/prometheus/client_golang/prometheus"
+
+	utilerrors "k8s.io/apimachinery/pkg/util/errors"
+	"k8s.io/apimachinery/pkg/util/sets"
+	"k8s.io/apiserver/pkg/authentication/authenticator"
+	"k8s.io/apiserver/pkg/authentication/user"
+)
+
+var clientCertificateExpirationHistogram = prometheus.NewHistogram(
+	prometheus.HistogramOpts{
+		Namespace: "apiserver",
+		Subsystem: "client",
+		Name:      "certificate_expiration_seconds",
+		Help:      "Distribution of the remaining lifetime on the certificate used to authenticate a request.",
+		Buckets: []float64{
+			0,
+			(6 * time.Hour).Seconds(),
+			(12 * time.Hour).Seconds(),
+			(24 * time.Hour).Seconds(),
+			(2 * 24 * time.Hour).Seconds(),
+			(4 * 24 * time.Hour).Seconds(),
+			(7 * 24 * time.Hour).Seconds(),
+			(30 * 24 * time.Hour).Seconds(),
+			(3 * 30 * 24 * time.Hour).Seconds(),
+			(6 * 30 * 24 * time.Hour).Seconds(),
+			(12 * 30 * 24 * time.Hour).Seconds(),
+		},
+	},
+)
+
+func init() {
+	prometheus.MustRegister(clientCertificateExpirationHistogram)
+}
+
+// UserConversion defines an interface for extracting user info from a client certificate chain
+type UserConversion interface {
+	User(chain []*x509.Certificate) (user.Info, bool, error)
+}
+
+// UserConversionFunc is a function that implements the UserConversion interface.
+type UserConversionFunc func(chain []*x509.Certificate) (user.Info, bool, error)
+
+// User implements x509.UserConversion
+func (f UserConversionFunc) User(chain []*x509.Certificate) (user.Info, bool, error) {
+	return f(chain)
+}
+
+// Authenticator implements request.Authenticator by extracting user info from verified client certificates
+type Authenticator struct {
+	opts x509.VerifyOptions
+	user UserConversion
+}
+
+// New returns a request.Authenticator that verifies client certificates using the provided
+// VerifyOptions, and converts valid certificate chains into user.Info using the provided UserConversion
+func New(opts x509.VerifyOptions, user UserConversion) *Authenticator {
+	return &Authenticator{opts, user}
+}
+
+// AuthenticateRequest authenticates the request using presented client certificates
+func (a *Authenticator) AuthenticateRequest(req *http.Request) (user.Info, bool, error) {
+	if req.TLS == nil || len(req.TLS.PeerCertificates) == 0 {
+		return nil, false, nil
+	}
+
+	// Use intermediates, if provided
+	optsCopy := a.opts
+	if optsCopy.Intermediates == nil && len(req.TLS.PeerCertificates) > 1 {
+		optsCopy.Intermediates = x509.NewCertPool()
+		for _, intermediate := range req.TLS.PeerCertificates[1:] {
+			optsCopy.Intermediates.AddCert(intermediate)
+		}
+	}
+
+	remaining := req.TLS.PeerCertificates[0].NotAfter.Sub(time.Now())
+	clientCertificateExpirationHistogram.Observe(remaining.Seconds())
+	chains, err := req.TLS.PeerCertificates[0].Verify(optsCopy)
+	if err != nil {
+		return nil, false, err
+	}
+
+	var errlist []error
+	for _, chain := range chains {
+		user, ok, err := a.user.User(chain)
+		if err != nil {
+			errlist = append(errlist, err)
+			continue
+		}
+
+		if ok {
+			return user, ok, err
+		}
+	}
+	return nil, false, utilerrors.NewAggregate(errlist)
+}
+
+// Verifier implements request.Authenticator by verifying a client cert on the request, then delegating to the wrapped auth
+type Verifier struct {
+	opts x509.VerifyOptions
+	auth authenticator.Request
+
+	// allowedCommonNames contains the common names which a verified certificate is allowed to have.
+	// If empty, all verified certificates are allowed.
+	allowedCommonNames sets.String
+}
+
+// NewVerifier create a request.Authenticator by verifying a client cert on the request, then delegating to the wrapped auth
+func NewVerifier(opts x509.VerifyOptions, auth authenticator.Request, allowedCommonNames sets.String) authenticator.Request {
+	return &Verifier{opts, auth, allowedCommonNames}
+}
+
+// AuthenticateRequest verifies the presented client certificate, then delegates to the wrapped auth
+func (a *Verifier) AuthenticateRequest(req *http.Request) (user.Info, bool, error) {
+	if req.TLS == nil || len(req.TLS.PeerCertificates) == 0 {
+		return nil, false, nil
+	}
+
+	// Use intermediates, if provided
+	optsCopy := a.opts
+	if optsCopy.Intermediates == nil && len(req.TLS.PeerCertificates) > 1 {
+		optsCopy.Intermediates = x509.NewCertPool()
+		for _, intermediate := range req.TLS.PeerCertificates[1:] {
+			optsCopy.Intermediates.AddCert(intermediate)
+		}
+	}
+
+	if _, err := req.TLS.PeerCertificates[0].Verify(optsCopy); err != nil {
+		return nil, false, err
+	}
+	if err := a.verifySubject(req.TLS.PeerCertificates[0].Subject); err != nil {
+		return nil, false, err
+	}
+	return a.auth.AuthenticateRequest(req)
+}
+
+func (a *Verifier) verifySubject(subject pkix.Name) error {
+	// No CN restrictions
+	if len(a.allowedCommonNames) == 0 {
+		return nil
+	}
+	// Enforce CN restrictions
+	if a.allowedCommonNames.Has(subject.CommonName) {
+		return nil
+	}
+	glog.Warningf("x509: subject with cn=%s is not in the allowed list: %v", subject.CommonName, a.allowedCommonNames.List())
+	return fmt.Errorf("x509: subject with cn=%s is not allowed", subject.CommonName)
+}
+
+// DefaultVerifyOptions returns VerifyOptions that use the system root certificates, current time,
+// and requires certificates to be valid for client auth (x509.ExtKeyUsageClientAuth)
+func DefaultVerifyOptions() x509.VerifyOptions {
+	return x509.VerifyOptions{
+		KeyUsages: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth},
+	}
+}
+
+// CommonNameUserConversion builds user info from a certificate chain using the subject's CommonName
+var CommonNameUserConversion = UserConversionFunc(func(chain []*x509.Certificate) (user.Info, bool, error) {
+	if len(chain[0].Subject.CommonName) == 0 {
+		return nil, false, nil
+	}
+	return &user.DefaultInfo{
+		Name:   chain[0].Subject.CommonName,
+		Groups: chain[0].Subject.Organization,
+	}, true, nil
+})
+
+// DNSNameUserConversion builds user info from a certificate chain using the first DNSName on the certificate
+var DNSNameUserConversion = UserConversionFunc(func(chain []*x509.Certificate) (user.Info, bool, error) {
+	if len(chain[0].DNSNames) == 0 {
+		return nil, false, nil
+	}
+	return &user.DefaultInfo{Name: chain[0].DNSNames[0]}, true, nil
+})
+
+// EmailAddressUserConversion builds user info from a certificate chain using the first EmailAddress on the certificate
+var EmailAddressUserConversion = UserConversionFunc(func(chain []*x509.Certificate) (user.Info, bool, error) {
+	var emailAddressOID asn1.ObjectIdentifier = []int{1, 2, 840, 113549, 1, 9, 1}
+	if len(chain[0].EmailAddresses) == 0 {
+		for _, name := range chain[0].Subject.Names {
+			if name.Type.Equal(emailAddressOID) {
+				return &user.DefaultInfo{Name: name.Value.(string)}, true, nil
+			}
+		}
+		return nil, false, nil
+	}
+	return &user.DefaultInfo{Name: chain[0].EmailAddresses[0]}, true, nil
+})
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/serviceaccount/util.go b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/serviceaccount/util.go
new file mode 100644
index 0000000..1b7bbc1
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/serviceaccount/util.go
@@ -0,0 +1,73 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package serviceaccount
+
+import (
+	"fmt"
+	"strings"
+
+	apimachineryvalidation "k8s.io/apimachinery/pkg/api/validation"
+)
+
+const (
+	ServiceAccountUsernamePrefix    = "system:serviceaccount:"
+	ServiceAccountUsernameSeparator = ":"
+	ServiceAccountGroupPrefix       = "system:serviceaccounts:"
+	AllServiceAccountsGroup         = "system:serviceaccounts"
+)
+
+// MakeUsername generates a username from the given namespace and ServiceAccount name.
+// The resulting username can be passed to SplitUsername to extract the original namespace and ServiceAccount name.
+func MakeUsername(namespace, name string) string {
+	return ServiceAccountUsernamePrefix + namespace + ServiceAccountUsernameSeparator + name
+}
+
+var invalidUsernameErr = fmt.Errorf("Username must be in the form %s", MakeUsername("namespace", "name"))
+
+// SplitUsername returns the namespace and ServiceAccount name embedded in the given username,
+// or an error if the username is not a valid name produced by MakeUsername
+func SplitUsername(username string) (string, string, error) {
+	if !strings.HasPrefix(username, ServiceAccountUsernamePrefix) {
+		return "", "", invalidUsernameErr
+	}
+	trimmed := strings.TrimPrefix(username, ServiceAccountUsernamePrefix)
+	parts := strings.Split(trimmed, ServiceAccountUsernameSeparator)
+	if len(parts) != 2 {
+		return "", "", invalidUsernameErr
+	}
+	namespace, name := parts[0], parts[1]
+	if len(apimachineryvalidation.ValidateNamespaceName(namespace, false)) != 0 {
+		return "", "", invalidUsernameErr
+	}
+	if len(apimachineryvalidation.ValidateServiceAccountName(name, false)) != 0 {
+		return "", "", invalidUsernameErr
+	}
+	return namespace, name, nil
+}
+
+// MakeGroupNames generates service account group names for the given namespace
+func MakeGroupNames(namespace string) []string {
+	return []string{
+		AllServiceAccountsGroup,
+		MakeNamespaceGroupName(namespace),
+	}
+}
+
+// MakeNamespaceGroupName returns the name of the group all service accounts in the namespace are included in
+func MakeNamespaceGroupName(namespace string) string {
+	return ServiceAccountGroupPrefix + namespace
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/token/tokenfile/tokenfile.go b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/token/tokenfile/tokenfile.go
new file mode 100644
index 0000000..57bb6c5
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/token/tokenfile/tokenfile.go
@@ -0,0 +1,97 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package tokenfile
+
+import (
+	"encoding/csv"
+	"fmt"
+	"io"
+	"os"
+	"strings"
+
+	"github.com/golang/glog"
+	"k8s.io/apiserver/pkg/authentication/user"
+)
+
+type TokenAuthenticator struct {
+	tokens map[string]*user.DefaultInfo
+}
+
+// New returns a TokenAuthenticator for a single token
+func New(tokens map[string]*user.DefaultInfo) *TokenAuthenticator {
+	return &TokenAuthenticator{
+		tokens: tokens,
+	}
+}
+
+// NewCSV returns a TokenAuthenticator, populated from a CSV file.
+// The CSV file must contain records in the format "token,username,useruid"
+func NewCSV(path string) (*TokenAuthenticator, error) {
+	file, err := os.Open(path)
+	if err != nil {
+		return nil, err
+	}
+	defer file.Close()
+
+	recordNum := 0
+	tokens := make(map[string]*user.DefaultInfo)
+	reader := csv.NewReader(file)
+	reader.FieldsPerRecord = -1
+	for {
+		record, err := reader.Read()
+		if err == io.EOF {
+			break
+		}
+		if err != nil {
+			return nil, err
+		}
+		if len(record) < 3 {
+			return nil, fmt.Errorf("token file '%s' must have at least 3 columns (token, user name, user uid), found %d", path, len(record))
+		}
+
+		recordNum++
+		if record[0] == "" {
+			glog.Warningf("empty token has been found in token file '%s', record number '%d'", path, recordNum)
+			continue
+		}
+
+		obj := &user.DefaultInfo{
+			Name: record[1],
+			UID:  record[2],
+		}
+		if _, exist := tokens[record[0]]; exist {
+			glog.Warningf("duplicate token has been found in token file '%s', record number '%d'", path, recordNum)
+		}
+		tokens[record[0]] = obj
+
+		if len(record) >= 4 {
+			obj.Groups = strings.Split(record[3], ",")
+		}
+	}
+
+	return &TokenAuthenticator{
+		tokens: tokens,
+	}, nil
+}
+
+func (a *TokenAuthenticator) AuthenticateToken(value string) (user.Info, bool, error) {
+	user, ok := a.tokens[value]
+	if !ok {
+		return nil, false, nil
+	}
+	return user, true, nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/user/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/user/doc.go
new file mode 100644
index 0000000..570c51a
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/user/doc.go
@@ -0,0 +1,19 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+// Package user contains utilities for dealing with simple user exchange in the auth
+// packages. The user.Info interface defines an interface for exchanging that info.
+package user
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/user/user.go b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/user/user.go
new file mode 100644
index 0000000..f02dc39
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/authentication/user/user.go
@@ -0,0 +1,83 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package user
+
+// Info describes a user that has been authenticated to the system.
+type Info interface {
+	// GetName returns the name that uniquely identifies this user among all
+	// other active users.
+	GetName() string
+	// GetUID returns a unique value for a particular user that will change
+	// if the user is removed from the system and another user is added with
+	// the same name.
+	GetUID() string
+	// GetGroups returns the names of the groups the user is a member of
+	GetGroups() []string
+
+	// GetExtra can contain any additional information that the authenticator
+	// thought was interesting.  One example would be scopes on a token.
+	// Keys in this map should be namespaced to the authenticator or
+	// authenticator/authorizer pair making use of them.
+	// For instance: "example.org/foo" instead of "foo"
+	// This is a map[string][]string because it needs to be serializeable into
+	// a SubjectAccessReviewSpec.authorization.k8s.io for proper authorization
+	// delegation flows
+	// In order to faithfully round-trip through an impersonation flow, these keys
+	// MUST be lowercase.
+	GetExtra() map[string][]string
+}
+
+// DefaultInfo provides a simple user information exchange object
+// for components that implement the UserInfo interface.
+type DefaultInfo struct {
+	Name   string
+	UID    string
+	Groups []string
+	Extra  map[string][]string
+}
+
+func (i *DefaultInfo) GetName() string {
+	return i.Name
+}
+
+func (i *DefaultInfo) GetUID() string {
+	return i.UID
+}
+
+func (i *DefaultInfo) GetGroups() []string {
+	return i.Groups
+}
+
+func (i *DefaultInfo) GetExtra() map[string][]string {
+	return i.Extra
+}
+
+// well-known user and group names
+const (
+	SystemPrivilegedGroup = "system:masters"
+	NodesGroup            = "system:nodes"
+	AllUnauthenticated    = "system:unauthenticated"
+	AllAuthenticated      = "system:authenticated"
+
+	Anonymous     = "system:anonymous"
+	APIServerUser = "system:apiserver"
+
+	// core kubernetes process identities
+	KubeProxy             = "system:kube-proxy"
+	KubeControllerManager = "system:kube-controller-manager"
+	KubeScheduler         = "system:kube-scheduler"
+)
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/authorization/authorizer/interfaces.go b/metrics-server/vendor/k8s.io/apiserver/pkg/authorization/authorizer/interfaces.go
new file mode 100644
index 0000000..95ade00
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/authorization/authorizer/interfaces.go
@@ -0,0 +1,158 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package authorizer
+
+import (
+	"net/http"
+
+	"k8s.io/apiserver/pkg/authentication/user"
+)
+
+// Attributes is an interface used by an Authorizer to get information about a request
+// that is used to make an authorization decision.
+type Attributes interface {
+	// GetUser returns the user.Info object to authorize
+	GetUser() user.Info
+
+	// GetVerb returns the kube verb associated with API requests (this includes get, list, watch, create, update, patch, delete, deletecollection, and proxy),
+	// or the lowercased HTTP verb associated with non-API requests (this includes get, put, post, patch, and delete)
+	GetVerb() string
+
+	// When IsReadOnly() == true, the request has no side effects, other than
+	// caching, logging, and other incidentals.
+	IsReadOnly() bool
+
+	// The namespace of the object, if a request is for a REST object.
+	GetNamespace() string
+
+	// The kind of object, if a request is for a REST object.
+	GetResource() string
+
+	// GetSubresource returns the subresource being requested, if present
+	GetSubresource() string
+
+	// GetName returns the name of the object as parsed off the request.  This will not be present for all request types, but
+	// will be present for: get, update, delete
+	GetName() string
+
+	// The group of the resource, if a request is for a REST object.
+	GetAPIGroup() string
+
+	// GetAPIVersion returns the version of the group requested, if a request is for a REST object.
+	GetAPIVersion() string
+
+	// IsResourceRequest returns true for requests to API resources, like /api/v1/nodes,
+	// and false for non-resource endpoints like /api, /healthz, and /swaggerapi
+	IsResourceRequest() bool
+
+	// GetPath returns the path of the request
+	GetPath() string
+}
+
+// Authorizer makes an authorization decision based on information gained by making
+// zero or more calls to methods of the Attributes interface.  It returns nil when an action is
+// authorized, otherwise it returns an error.
+type Authorizer interface {
+	Authorize(a Attributes) (authorized Decision, reason string, err error)
+}
+
+type AuthorizerFunc func(a Attributes) (Decision, string, error)
+
+func (f AuthorizerFunc) Authorize(a Attributes) (Decision, string, error) {
+	return f(a)
+}
+
+// RuleResolver provides a mechanism for resolving the list of rules that apply to a given user within a namespace.
+type RuleResolver interface {
+	// RulesFor get the list of cluster wide rules, the list of rules in the specific namespace, incomplete status and errors.
+	RulesFor(user user.Info, namespace string) ([]ResourceRuleInfo, []NonResourceRuleInfo, bool, error)
+}
+
+// RequestAttributesGetter provides a function that extracts Attributes from an http.Request
+type RequestAttributesGetter interface {
+	GetRequestAttributes(user.Info, *http.Request) Attributes
+}
+
+// AttributesRecord implements Attributes interface.
+type AttributesRecord struct {
+	User            user.Info
+	Verb            string
+	Namespace       string
+	APIGroup        string
+	APIVersion      string
+	Resource        string
+	Subresource     string
+	Name            string
+	ResourceRequest bool
+	Path            string
+}
+
+func (a AttributesRecord) GetUser() user.Info {
+	return a.User
+}
+
+func (a AttributesRecord) GetVerb() string {
+	return a.Verb
+}
+
+func (a AttributesRecord) IsReadOnly() bool {
+	return a.Verb == "get" || a.Verb == "list" || a.Verb == "watch"
+}
+
+func (a AttributesRecord) GetNamespace() string {
+	return a.Namespace
+}
+
+func (a AttributesRecord) GetResource() string {
+	return a.Resource
+}
+
+func (a AttributesRecord) GetSubresource() string {
+	return a.Subresource
+}
+
+func (a AttributesRecord) GetName() string {
+	return a.Name
+}
+
+func (a AttributesRecord) GetAPIGroup() string {
+	return a.APIGroup
+}
+
+func (a AttributesRecord) GetAPIVersion() string {
+	return a.APIVersion
+}
+
+func (a AttributesRecord) IsResourceRequest() bool {
+	return a.ResourceRequest
+}
+
+func (a AttributesRecord) GetPath() string {
+	return a.Path
+}
+
+type Decision int
+
+const (
+	// DecisionDeny means that an authorizer decided to deny the action.
+	DecisionDeny Decision = iota
+	// DecisionAllow means that an authorizer decided to allow the action.
+	DecisionAllow
+	// DecisionNoOpionion means that an authorizer has no opinion on whether
+	// to allow or deny an action.
+	DecisionNoOpinion
+)
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/authorization/authorizer/rule.go b/metrics-server/vendor/k8s.io/apiserver/pkg/authorization/authorizer/rule.go
new file mode 100644
index 0000000..8f7d9d9
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/authorization/authorizer/rule.go
@@ -0,0 +1,73 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package authorizer
+
+type ResourceRuleInfo interface {
+	// GetVerbs returns a list of kubernetes resource API verbs.
+	GetVerbs() []string
+	// GetAPIGroups return the names of the APIGroup that contains the resources.
+	GetAPIGroups() []string
+	// GetResources return a list of resources the rule applies to.
+	GetResources() []string
+	// GetResourceNames return a white list of names that the rule applies to.
+	GetResourceNames() []string
+}
+
+// DefaultResourceRuleInfo holds information that describes a rule for the resource
+type DefaultResourceRuleInfo struct {
+	Verbs         []string
+	APIGroups     []string
+	Resources     []string
+	ResourceNames []string
+}
+
+func (i *DefaultResourceRuleInfo) GetVerbs() []string {
+	return i.Verbs
+}
+
+func (i *DefaultResourceRuleInfo) GetAPIGroups() []string {
+	return i.APIGroups
+}
+
+func (i *DefaultResourceRuleInfo) GetResources() []string {
+	return i.Resources
+}
+
+func (i *DefaultResourceRuleInfo) GetResourceNames() []string {
+	return i.ResourceNames
+}
+
+type NonResourceRuleInfo interface {
+	// GetVerbs returns a list of kubernetes resource API verbs.
+	GetVerbs() []string
+	// GetNonResourceURLs return a set of partial urls that a user should have access to.
+	GetNonResourceURLs() []string
+}
+
+// DefaultNonResourceRuleInfo holds information that describes a rule for the non-resource
+type DefaultNonResourceRuleInfo struct {
+	Verbs           []string
+	NonResourceURLs []string
+}
+
+func (i *DefaultNonResourceRuleInfo) GetVerbs() []string {
+	return i.Verbs
+}
+
+func (i *DefaultNonResourceRuleInfo) GetNonResourceURLs() []string {
+	return i.NonResourceURLs
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/authorization/authorizerfactory/OWNERS b/metrics-server/vendor/k8s.io/apiserver/pkg/authorization/authorizerfactory/OWNERS
new file mode 100755
index 0000000..63cf972
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/authorization/authorizerfactory/OWNERS
@@ -0,0 +1,4 @@
+reviewers:
+- deads2k
+- dims
+- ericchiang
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/authorization/authorizerfactory/builtin.go b/metrics-server/vendor/k8s.io/apiserver/pkg/authorization/authorizerfactory/builtin.go
new file mode 100644
index 0000000..fc36bc0
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/authorization/authorizerfactory/builtin.go
@@ -0,0 +1,94 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package authorizerfactory
+
+import (
+	"errors"
+
+	"k8s.io/apiserver/pkg/authentication/user"
+	"k8s.io/apiserver/pkg/authorization/authorizer"
+)
+
+// alwaysAllowAuthorizer is an implementation of authorizer.Attributes
+// which always says yes to an authorization request.
+// It is useful in tests and when using kubernetes in an open manner.
+type alwaysAllowAuthorizer struct{}
+
+func (alwaysAllowAuthorizer) Authorize(a authorizer.Attributes) (authorized authorizer.Decision, reason string, err error) {
+	return authorizer.DecisionAllow, "", nil
+}
+
+func (alwaysAllowAuthorizer) RulesFor(user user.Info, namespace string) ([]authorizer.ResourceRuleInfo, []authorizer.NonResourceRuleInfo, bool, error) {
+	return []authorizer.ResourceRuleInfo{
+			&authorizer.DefaultResourceRuleInfo{
+				Verbs:     []string{"*"},
+				APIGroups: []string{"*"},
+				Resources: []string{"*"},
+			},
+		}, []authorizer.NonResourceRuleInfo{
+			&authorizer.DefaultNonResourceRuleInfo{
+				Verbs:           []string{"*"},
+				NonResourceURLs: []string{"*"},
+			},
+		}, false, nil
+}
+
+func NewAlwaysAllowAuthorizer() *alwaysAllowAuthorizer {
+	return new(alwaysAllowAuthorizer)
+}
+
+// alwaysDenyAuthorizer is an implementation of authorizer.Attributes
+// which always says no to an authorization request.
+// It is useful in unit tests to force an operation to be forbidden.
+type alwaysDenyAuthorizer struct{}
+
+func (alwaysDenyAuthorizer) Authorize(a authorizer.Attributes) (decision authorizer.Decision, reason string, err error) {
+	return authorizer.DecisionNoOpinion, "Everything is forbidden.", nil
+}
+
+func (alwaysDenyAuthorizer) RulesFor(user user.Info, namespace string) ([]authorizer.ResourceRuleInfo, []authorizer.NonResourceRuleInfo, bool, error) {
+	return []authorizer.ResourceRuleInfo{}, []authorizer.NonResourceRuleInfo{}, false, nil
+}
+
+func NewAlwaysDenyAuthorizer() *alwaysDenyAuthorizer {
+	return new(alwaysDenyAuthorizer)
+}
+
+type privilegedGroupAuthorizer struct {
+	groups []string
+}
+
+func (r *privilegedGroupAuthorizer) Authorize(attr authorizer.Attributes) (authorizer.Decision, string, error) {
+	if attr.GetUser() == nil {
+		return authorizer.DecisionNoOpinion, "Error", errors.New("no user on request.")
+	}
+	for _, attr_group := range attr.GetUser().GetGroups() {
+		for _, priv_group := range r.groups {
+			if priv_group == attr_group {
+				return authorizer.DecisionAllow, "", nil
+			}
+		}
+	}
+	return authorizer.DecisionNoOpinion, "", nil
+}
+
+// NewPrivilegedGroups is for use in loopback scenarios
+func NewPrivilegedGroups(groups ...string) *privilegedGroupAuthorizer {
+	return &privilegedGroupAuthorizer{
+		groups: groups,
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/authorization/authorizerfactory/delegating.go b/metrics-server/vendor/k8s.io/apiserver/pkg/authorization/authorizerfactory/delegating.go
new file mode 100644
index 0000000..25b5aa9
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/authorization/authorizerfactory/delegating.go
@@ -0,0 +1,47 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package authorizerfactory
+
+import (
+	"time"
+
+	"k8s.io/apiserver/pkg/authorization/authorizer"
+	authorizationclient "k8s.io/client-go/kubernetes/typed/authorization/v1beta1"
+
+	"k8s.io/apiserver/plugin/pkg/authorizer/webhook"
+)
+
+// DelegatingAuthorizerConfig is the minimal configuration needed to create an authenticator
+// built to delegate authorization to a kube API server
+type DelegatingAuthorizerConfig struct {
+	SubjectAccessReviewClient authorizationclient.SubjectAccessReviewInterface
+
+	// AllowCacheTTL is the length of time that a successful authorization response will be cached
+	AllowCacheTTL time.Duration
+
+	// DenyCacheTTL is the length of time that an unsuccessful authorization response will be cached.
+	// You generally want more responsive, "deny, try again" flows.
+	DenyCacheTTL time.Duration
+}
+
+func (c DelegatingAuthorizerConfig) New() (authorizer.Authorizer, error) {
+	return webhook.NewFromInterface(
+		c.SubjectAccessReviewClient,
+		c.AllowCacheTTL,
+		c.DenyCacheTTL,
+	)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/authorization/union/union.go b/metrics-server/vendor/k8s.io/apiserver/pkg/authorization/union/union.go
new file mode 100644
index 0000000..1575378
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/authorization/union/union.go
@@ -0,0 +1,105 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+// Package union implements an authorizer that combines multiple subauthorizer.
+// The union authorizer iterates over each subauthorizer and returns the first
+// decision that is either an Allow decision or a Deny decision. If a
+// subauthorizer returns a NoOpinion, then the union authorizer moves onto the
+// next authorizer or, if the subauthorizer was the last authorizer, returns
+// NoOpinion as the aggregate decision. I.e. union authorizer creates an
+// aggregate decision and supports short-circuit allows and denies from
+// subauthorizers.
+package union
+
+import (
+	"strings"
+
+	utilerrors "k8s.io/apimachinery/pkg/util/errors"
+	"k8s.io/apiserver/pkg/authentication/user"
+	"k8s.io/apiserver/pkg/authorization/authorizer"
+)
+
+// unionAuthzHandler authorizer against a chain of authorizer.Authorizer
+type unionAuthzHandler []authorizer.Authorizer
+
+// New returns an authorizer that authorizes against a chain of authorizer.Authorizer objects
+func New(authorizationHandlers ...authorizer.Authorizer) authorizer.Authorizer {
+	return unionAuthzHandler(authorizationHandlers)
+}
+
+// Authorizes against a chain of authorizer.Authorizer objects and returns nil if successful and returns error if unsuccessful
+func (authzHandler unionAuthzHandler) Authorize(a authorizer.Attributes) (authorizer.Decision, string, error) {
+	var (
+		errlist    []error
+		reasonlist []string
+	)
+
+	for _, currAuthzHandler := range authzHandler {
+		decision, reason, err := currAuthzHandler.Authorize(a)
+
+		if err != nil {
+			errlist = append(errlist, err)
+		}
+		if len(reason) != 0 {
+			reasonlist = append(reasonlist, reason)
+		}
+		switch decision {
+		case authorizer.DecisionAllow, authorizer.DecisionDeny:
+			return decision, reason, err
+		case authorizer.DecisionNoOpinion:
+			// continue to the next authorizer
+		}
+	}
+
+	return authorizer.DecisionNoOpinion, strings.Join(reasonlist, "\n"), utilerrors.NewAggregate(errlist)
+}
+
+// unionAuthzRulesHandler authorizer against a chain of authorizer.RuleResolver
+type unionAuthzRulesHandler []authorizer.RuleResolver
+
+// NewRuleResolvers returns an authorizer that authorizes against a chain of authorizer.Authorizer objects
+func NewRuleResolvers(authorizationHandlers ...authorizer.RuleResolver) authorizer.RuleResolver {
+	return unionAuthzRulesHandler(authorizationHandlers)
+}
+
+// RulesFor against a chain of authorizer.RuleResolver objects and returns nil if successful and returns error if unsuccessful
+func (authzHandler unionAuthzRulesHandler) RulesFor(user user.Info, namespace string) ([]authorizer.ResourceRuleInfo, []authorizer.NonResourceRuleInfo, bool, error) {
+	var (
+		errList              []error
+		resourceRulesList    []authorizer.ResourceRuleInfo
+		nonResourceRulesList []authorizer.NonResourceRuleInfo
+	)
+	incompleteStatus := false
+
+	for _, currAuthzHandler := range authzHandler {
+		resourceRules, nonResourceRules, incomplete, err := currAuthzHandler.RulesFor(user, namespace)
+
+		if incomplete == true {
+			incompleteStatus = true
+		}
+		if err != nil {
+			errList = append(errList, err)
+		}
+		if len(resourceRules) > 0 {
+			resourceRulesList = append(resourceRulesList, resourceRules...)
+		}
+		if len(nonResourceRules) > 0 {
+			nonResourceRulesList = append(nonResourceRulesList, nonResourceRules...)
+		}
+	}
+
+	return resourceRulesList, nonResourceRulesList, incompleteStatus, utilerrors.NewAggregate(errList)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/discovery/addresses.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/discovery/addresses.go
new file mode 100644
index 0000000..d175d15
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/discovery/addresses.go
@@ -0,0 +1,72 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package discovery
+
+import (
+	"net"
+
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+)
+
+type Addresses interface {
+	ServerAddressByClientCIDRs(net.IP) []metav1.ServerAddressByClientCIDR
+}
+
+// DefaultAddresses is a default implementation of Addresses that will work in most cases
+type DefaultAddresses struct {
+	// CIDRRules is a list of CIDRs and Addresses to use if a client is in the range
+	CIDRRules []CIDRRule
+
+	// DefaultAddress is the address (hostname or IP and port) that should be used in
+	// if no CIDR matches more specifically.
+	DefaultAddress string
+}
+
+// CIDRRule is a rule for adding an alternate path to the master based on matching CIDR
+type CIDRRule struct {
+	IPRange net.IPNet
+
+	// Address is the address (hostname or IP and port) that should be used in
+	// if this CIDR matches
+	Address string
+}
+
+func (d DefaultAddresses) ServerAddressByClientCIDRs(clientIP net.IP) []metav1.ServerAddressByClientCIDR {
+	addressCIDRMap := []metav1.ServerAddressByClientCIDR{
+		{
+			ClientCIDR:    "0.0.0.0/0",
+			ServerAddress: d.DefaultAddress,
+		},
+	}
+
+	for _, rule := range d.CIDRRules {
+		addressCIDRMap = append(addressCIDRMap, rule.ServerAddressByClientCIDRs(clientIP)...)
+	}
+	return addressCIDRMap
+}
+
+func (d CIDRRule) ServerAddressByClientCIDRs(clientIP net.IP) []metav1.ServerAddressByClientCIDR {
+	addressCIDRMap := []metav1.ServerAddressByClientCIDR{}
+
+	if d.IPRange.Contains(clientIP) {
+		addressCIDRMap = append(addressCIDRMap, metav1.ServerAddressByClientCIDR{
+			ClientCIDR:    d.IPRange.String(),
+			ServerAddress: d.Address,
+		})
+	}
+	return addressCIDRMap
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/discovery/group.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/discovery/group.go
new file mode 100644
index 0000000..02330e9
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/discovery/group.go
@@ -0,0 +1,73 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package discovery
+
+import (
+	"net/http"
+
+	"github.com/emicklei/go-restful"
+
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apiserver/pkg/endpoints/handlers/negotiation"
+	"k8s.io/apiserver/pkg/endpoints/handlers/responsewriters"
+)
+
+// APIGroupHandler creates a webservice serving the supported versions, preferred version, and name
+// of a group. E.g., such a web service will be registered at /apis/extensions.
+type APIGroupHandler struct {
+	serializer runtime.NegotiatedSerializer
+	group      metav1.APIGroup
+}
+
+func NewAPIGroupHandler(serializer runtime.NegotiatedSerializer, group metav1.APIGroup) *APIGroupHandler {
+	if keepUnversioned(group.Name) {
+		// Because in release 1.1, /apis/extensions returns response with empty
+		// APIVersion, we use stripVersionNegotiatedSerializer to keep the
+		// response backwards compatible.
+		serializer = stripVersionNegotiatedSerializer{serializer}
+	}
+
+	return &APIGroupHandler{
+		serializer: serializer,
+		group:      group,
+	}
+}
+
+func (s *APIGroupHandler) WebService() *restful.WebService {
+	mediaTypes, _ := negotiation.MediaTypesForSerializer(s.serializer)
+	ws := new(restful.WebService)
+	ws.Path(APIGroupPrefix + "/" + s.group.Name)
+	ws.Doc("get information of a group")
+	ws.Route(ws.GET("/").To(s.handle).
+		Doc("get information of a group").
+		Operation("getAPIGroup").
+		Produces(mediaTypes...).
+		Consumes(mediaTypes...).
+		Writes(metav1.APIGroup{}))
+	return ws
+}
+
+// handle returns a handler which will return the api.GroupAndVersion of the group.
+func (s *APIGroupHandler) handle(req *restful.Request, resp *restful.Response) {
+	s.ServeHTTP(resp.ResponseWriter, req.Request)
+}
+
+func (s *APIGroupHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
+	responsewriters.WriteObjectNegotiated(s.serializer, schema.GroupVersion{}, w, req, http.StatusOK, &s.group)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/discovery/legacy.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/discovery/legacy.go
new file mode 100644
index 0000000..fb648e5
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/discovery/legacy.go
@@ -0,0 +1,78 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package discovery
+
+import (
+	"net/http"
+
+	"github.com/emicklei/go-restful"
+
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	utilnet "k8s.io/apimachinery/pkg/util/net"
+	"k8s.io/apiserver/pkg/endpoints/handlers/negotiation"
+	"k8s.io/apiserver/pkg/endpoints/handlers/responsewriters"
+)
+
+// legacyRootAPIHandler creates a webservice serving api group discovery.
+type legacyRootAPIHandler struct {
+	// addresses is used to build cluster IPs for discovery.
+	addresses   Addresses
+	apiPrefix   string
+	serializer  runtime.NegotiatedSerializer
+	apiVersions []string
+}
+
+func NewLegacyRootAPIHandler(addresses Addresses, serializer runtime.NegotiatedSerializer, apiPrefix string, apiVersions []string) *legacyRootAPIHandler {
+	// Because in release 1.1, /apis returns response with empty APIVersion, we
+	// use stripVersionNegotiatedSerializer to keep the response backwards
+	// compatible.
+	serializer = stripVersionNegotiatedSerializer{serializer}
+
+	return &legacyRootAPIHandler{
+		addresses:   addresses,
+		apiPrefix:   apiPrefix,
+		serializer:  serializer,
+		apiVersions: apiVersions,
+	}
+}
+
+// AddApiWebService adds a service to return the supported api versions at the legacy /api.
+func (s *legacyRootAPIHandler) WebService() *restful.WebService {
+	mediaTypes, _ := negotiation.MediaTypesForSerializer(s.serializer)
+	ws := new(restful.WebService)
+	ws.Path(s.apiPrefix)
+	ws.Doc("get available API versions")
+	ws.Route(ws.GET("/").To(s.handle).
+		Doc("get available API versions").
+		Operation("getAPIVersions").
+		Produces(mediaTypes...).
+		Consumes(mediaTypes...).
+		Writes(metav1.APIVersions{}))
+	return ws
+}
+
+func (s *legacyRootAPIHandler) handle(req *restful.Request, resp *restful.Response) {
+	clientIP := utilnet.GetClientIP(req.Request)
+	apiVersions := &metav1.APIVersions{
+		ServerAddressByClientCIDRs: s.addresses.ServerAddressByClientCIDRs(clientIP),
+		Versions:                   s.apiVersions,
+	}
+
+	responsewriters.WriteObjectNegotiated(s.serializer, schema.GroupVersion{}, resp.ResponseWriter, req.Request, http.StatusOK, apiVersions)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/discovery/root.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/discovery/root.go
new file mode 100644
index 0000000..7ed64a9
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/discovery/root.go
@@ -0,0 +1,135 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package discovery
+
+import (
+	"net/http"
+	"sync"
+
+	restful "github.com/emicklei/go-restful"
+
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	utilnet "k8s.io/apimachinery/pkg/util/net"
+	"k8s.io/apiserver/pkg/endpoints/handlers/negotiation"
+	"k8s.io/apiserver/pkg/endpoints/handlers/responsewriters"
+)
+
+// GroupManager is an interface that allows dynamic mutation of the existing webservice to handle
+// API groups being added or removed.
+type GroupManager interface {
+	AddGroup(apiGroup metav1.APIGroup)
+	RemoveGroup(groupName string)
+
+	WebService() *restful.WebService
+}
+
+// rootAPIsHandler creates a webservice serving api group discovery.
+// The list of APIGroups may change while the server is running because additional resources
+// are registered or removed.  It is not safe to cache the values.
+type rootAPIsHandler struct {
+	// addresses is used to build cluster IPs for discovery.
+	addresses Addresses
+
+	serializer runtime.NegotiatedSerializer
+
+	// Map storing information about all groups to be exposed in discovery response.
+	// The map is from name to the group.
+	lock      sync.RWMutex
+	apiGroups map[string]metav1.APIGroup
+	// apiGroupNames preserves insertion order
+	apiGroupNames []string
+}
+
+func NewRootAPIsHandler(addresses Addresses, serializer runtime.NegotiatedSerializer) *rootAPIsHandler {
+	// Because in release 1.1, /apis returns response with empty APIVersion, we
+	// use stripVersionNegotiatedSerializer to keep the response backwards
+	// compatible.
+	serializer = stripVersionNegotiatedSerializer{serializer}
+
+	return &rootAPIsHandler{
+		addresses:  addresses,
+		serializer: serializer,
+		apiGroups:  map[string]metav1.APIGroup{},
+	}
+}
+
+func (s *rootAPIsHandler) AddGroup(apiGroup metav1.APIGroup) {
+	s.lock.Lock()
+	defer s.lock.Unlock()
+
+	_, alreadyExists := s.apiGroups[apiGroup.Name]
+
+	s.apiGroups[apiGroup.Name] = apiGroup
+	if !alreadyExists {
+		s.apiGroupNames = append(s.apiGroupNames, apiGroup.Name)
+	}
+}
+
+func (s *rootAPIsHandler) RemoveGroup(groupName string) {
+	s.lock.Lock()
+	defer s.lock.Unlock()
+
+	delete(s.apiGroups, groupName)
+	for i := range s.apiGroupNames {
+		if s.apiGroupNames[i] == groupName {
+			s.apiGroupNames = append(s.apiGroupNames[:i], s.apiGroupNames[i+1:]...)
+			break
+		}
+	}
+}
+
+func (s *rootAPIsHandler) ServeHTTP(resp http.ResponseWriter, req *http.Request) {
+	s.lock.RLock()
+	defer s.lock.RUnlock()
+
+	orderedGroups := []metav1.APIGroup{}
+	for _, groupName := range s.apiGroupNames {
+		orderedGroups = append(orderedGroups, s.apiGroups[groupName])
+	}
+
+	clientIP := utilnet.GetClientIP(req)
+	serverCIDR := s.addresses.ServerAddressByClientCIDRs(clientIP)
+	groups := make([]metav1.APIGroup, len(orderedGroups))
+	for i := range orderedGroups {
+		groups[i] = orderedGroups[i]
+		groups[i].ServerAddressByClientCIDRs = serverCIDR
+	}
+
+	responsewriters.WriteObjectNegotiated(s.serializer, schema.GroupVersion{}, resp, req, http.StatusOK, &metav1.APIGroupList{Groups: groups})
+}
+
+func (s *rootAPIsHandler) restfulHandle(req *restful.Request, resp *restful.Response) {
+	s.ServeHTTP(resp.ResponseWriter, req.Request)
+}
+
+// WebService returns a webservice serving api group discovery.
+// Note: during the server runtime apiGroups might change.
+func (s *rootAPIsHandler) WebService() *restful.WebService {
+	mediaTypes, _ := negotiation.MediaTypesForSerializer(s.serializer)
+	ws := new(restful.WebService)
+	ws.Path(APIGroupPrefix)
+	ws.Doc("get available API versions")
+	ws.Route(ws.GET("/").To(s.restfulHandle).
+		Doc("get available API versions").
+		Operation("getAPIVersions").
+		Produces(mediaTypes...).
+		Consumes(mediaTypes...).
+		Writes(metav1.APIGroupList{}))
+	return ws
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/discovery/util.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/discovery/util.go
new file mode 100644
index 0000000..81a13d6
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/discovery/util.go
@@ -0,0 +1,73 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package discovery
+
+import (
+	"bytes"
+	"fmt"
+	"io"
+
+	"k8s.io/apimachinery/pkg/runtime"
+)
+
+const APIGroupPrefix = "/apis"
+
+func keepUnversioned(group string) bool {
+	return group == "" || group == "extensions"
+}
+
+// stripVersionEncoder strips APIVersion field from the encoding output. It's
+// used to keep the responses at the discovery endpoints backward compatible
+// with release-1.1, when the responses have empty APIVersion.
+type stripVersionEncoder struct {
+	encoder    runtime.Encoder
+	serializer runtime.Serializer
+}
+
+func (c stripVersionEncoder) Encode(obj runtime.Object, w io.Writer) error {
+	buf := bytes.NewBuffer([]byte{})
+	err := c.encoder.Encode(obj, buf)
+	if err != nil {
+		return err
+	}
+	roundTrippedObj, gvk, err := c.serializer.Decode(buf.Bytes(), nil, nil)
+	if err != nil {
+		return err
+	}
+	gvk.Group = ""
+	gvk.Version = ""
+	roundTrippedObj.GetObjectKind().SetGroupVersionKind(*gvk)
+	return c.serializer.Encode(roundTrippedObj, w)
+}
+
+// stripVersionNegotiatedSerializer will return stripVersionEncoder when
+// EncoderForVersion is called. See comments for stripVersionEncoder.
+type stripVersionNegotiatedSerializer struct {
+	runtime.NegotiatedSerializer
+}
+
+func (n stripVersionNegotiatedSerializer) EncoderForVersion(encoder runtime.Encoder, gv runtime.GroupVersioner) runtime.Encoder {
+	serializer, ok := encoder.(runtime.Serializer)
+	if !ok {
+		// The stripVersionEncoder needs both an encoder and decoder, but is called from a context that doesn't have access to the
+		// decoder. We do a best effort cast here (since this code path is only for backwards compatibility) to get access to the caller's
+		// decoder.
+		panic(fmt.Sprintf("Unable to extract serializer from %#v", encoder))
+	}
+	versioned := n.NegotiatedSerializer.EncoderForVersion(encoder, gv)
+	return stripVersionEncoder{versioned, serializer}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/discovery/version.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/discovery/version.go
new file mode 100644
index 0000000..aadfc7a
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/discovery/version.go
@@ -0,0 +1,83 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package discovery
+
+import (
+	"net/http"
+
+	restful "github.com/emicklei/go-restful"
+
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apiserver/pkg/endpoints/handlers/negotiation"
+	"k8s.io/apiserver/pkg/endpoints/handlers/responsewriters"
+)
+
+type APIResourceLister interface {
+	ListAPIResources() []metav1.APIResource
+}
+
+type APIResourceListerFunc func() []metav1.APIResource
+
+func (f APIResourceListerFunc) ListAPIResources() []metav1.APIResource {
+	return f()
+}
+
+// APIVersionHandler creates a webservice serving the supported resources for the version
+// E.g., such a web service will be registered at /apis/extensions/v1beta1.
+type APIVersionHandler struct {
+	serializer runtime.NegotiatedSerializer
+
+	groupVersion      schema.GroupVersion
+	apiResourceLister APIResourceLister
+}
+
+func NewAPIVersionHandler(serializer runtime.NegotiatedSerializer, groupVersion schema.GroupVersion, apiResourceLister APIResourceLister) *APIVersionHandler {
+	if keepUnversioned(groupVersion.Group) {
+		// Because in release 1.1, /apis/extensions returns response with empty
+		// APIVersion, we use stripVersionNegotiatedSerializer to keep the
+		// response backwards compatible.
+		serializer = stripVersionNegotiatedSerializer{serializer}
+	}
+
+	return &APIVersionHandler{
+		serializer:        serializer,
+		groupVersion:      groupVersion,
+		apiResourceLister: apiResourceLister,
+	}
+}
+
+func (s *APIVersionHandler) AddToWebService(ws *restful.WebService) {
+	mediaTypes, _ := negotiation.MediaTypesForSerializer(s.serializer)
+	ws.Route(ws.GET("/").To(s.handle).
+		Doc("get available resources").
+		Operation("getAPIResources").
+		Produces(mediaTypes...).
+		Consumes(mediaTypes...).
+		Writes(metav1.APIResourceList{}))
+}
+
+// handle returns a handler which will return the api.VersionAndVersion of the group.
+func (s *APIVersionHandler) handle(req *restful.Request, resp *restful.Response) {
+	s.ServeHTTP(resp.ResponseWriter, req.Request)
+}
+
+func (s *APIVersionHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
+	responsewriters.WriteObjectNegotiated(s.serializer, schema.GroupVersion{}, w, req, http.StatusOK,
+		&metav1.APIResourceList{GroupVersion: s.groupVersion.String(), APIResources: s.apiResourceLister.ListAPIResources()})
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/doc.go
new file mode 100644
index 0000000..ef99114
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/doc.go
@@ -0,0 +1,18 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+// Package endpoints contains the generic code that provides a RESTful Kubernetes-style API service.
+package endpoints // import "k8s.io/apiserver/pkg/endpoints"
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/filters/OWNERS b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/filters/OWNERS
new file mode 100755
index 0000000..6f780ff
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/filters/OWNERS
@@ -0,0 +1,4 @@
+reviewers:
+- deads2k
+- sttts
+- soltysh
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/filters/audit.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/filters/audit.go
new file mode 100644
index 0000000..4946341
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/filters/audit.go
@@ -0,0 +1,248 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package filters
+
+import (
+	"bufio"
+	"errors"
+	"fmt"
+	"net"
+	"net/http"
+	"sync"
+	"time"
+
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
+	auditinternal "k8s.io/apiserver/pkg/apis/audit"
+	"k8s.io/apiserver/pkg/audit"
+	"k8s.io/apiserver/pkg/audit/policy"
+	"k8s.io/apiserver/pkg/endpoints/handlers/responsewriters"
+	"k8s.io/apiserver/pkg/endpoints/request"
+)
+
+// WithAudit decorates a http.Handler with audit logging information for all the
+// requests coming to the server. Audit level is decided according to requests'
+// attributes and audit policy. Logs are emitted to the audit sink to
+// process events. If sink or audit policy is nil, no decoration takes place.
+func WithAudit(handler http.Handler, sink audit.Sink, policy policy.Checker, longRunningCheck request.LongRunningRequestCheck) http.Handler {
+	if sink == nil || policy == nil {
+		return handler
+	}
+	return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
+		req, ev, omitStages, err := createAuditEventAndAttachToContext(req, policy)
+		if err != nil {
+			utilruntime.HandleError(fmt.Errorf("failed to create audit event: %v", err))
+			responsewriters.InternalError(w, req, errors.New("failed to create audit event"))
+			return
+		}
+		ctx := req.Context()
+		if ev == nil || ctx == nil {
+			handler.ServeHTTP(w, req)
+			return
+		}
+
+		ev.Stage = auditinternal.StageRequestReceived
+		processAuditEvent(sink, ev, omitStages)
+
+		// intercept the status code
+		var longRunningSink audit.Sink
+		if longRunningCheck != nil {
+			ri, _ := request.RequestInfoFrom(ctx)
+			if longRunningCheck(req, ri) {
+				longRunningSink = sink
+			}
+		}
+		respWriter := decorateResponseWriter(w, ev, longRunningSink, omitStages)
+
+		// send audit event when we leave this func, either via a panic or cleanly. In the case of long
+		// running requests, this will be the second audit event.
+		defer func() {
+			if r := recover(); r != nil {
+				defer panic(r)
+				ev.Stage = auditinternal.StagePanic
+				ev.ResponseStatus = &metav1.Status{
+					Code:    http.StatusInternalServerError,
+					Status:  metav1.StatusFailure,
+					Reason:  metav1.StatusReasonInternalError,
+					Message: fmt.Sprintf("APIServer panic'd: %v", r),
+				}
+				processAuditEvent(sink, ev, omitStages)
+				return
+			}
+
+			// if no StageResponseStarted event was sent b/c neither a status code nor a body was sent, fake it here
+			// But Audit-Id http header will only be sent when http.ResponseWriter.WriteHeader is called.
+			fakedSuccessStatus := &metav1.Status{
+				Code:    http.StatusOK,
+				Status:  metav1.StatusSuccess,
+				Message: "Connection closed early",
+			}
+			if ev.ResponseStatus == nil && longRunningSink != nil {
+				ev.ResponseStatus = fakedSuccessStatus
+				ev.Stage = auditinternal.StageResponseStarted
+				processAuditEvent(longRunningSink, ev, omitStages)
+			}
+
+			ev.Stage = auditinternal.StageResponseComplete
+			if ev.ResponseStatus == nil {
+				ev.ResponseStatus = fakedSuccessStatus
+			}
+			processAuditEvent(sink, ev, omitStages)
+		}()
+		handler.ServeHTTP(respWriter, req)
+	})
+}
+
+// createAuditEventAndAttachToContext is responsible for creating the audit event
+// and attaching it to the appropriate request context. It returns:
+// - context with audit event attached to it
+// - created audit event
+// - error if anything bad happened
+func createAuditEventAndAttachToContext(req *http.Request, policy policy.Checker) (*http.Request, *auditinternal.Event, []auditinternal.Stage, error) {
+	ctx := req.Context()
+
+	attribs, err := GetAuthorizerAttributes(ctx)
+	if err != nil {
+		return req, nil, nil, fmt.Errorf("failed to GetAuthorizerAttributes: %v", err)
+	}
+
+	level, omitStages := policy.LevelAndStages(attribs)
+	audit.ObservePolicyLevel(level)
+	if level == auditinternal.LevelNone {
+		// Don't audit.
+		return req, nil, nil, nil
+	}
+
+	ev, err := audit.NewEventFromRequest(req, level, attribs)
+	if err != nil {
+		return req, nil, nil, fmt.Errorf("failed to complete audit event from request: %v", err)
+	}
+
+	req = req.WithContext(request.WithAuditEvent(ctx, ev))
+
+	return req, ev, omitStages, nil
+}
+
+func processAuditEvent(sink audit.Sink, ev *auditinternal.Event, omitStages []auditinternal.Stage) {
+	for _, stage := range omitStages {
+		if ev.Stage == stage {
+			return
+		}
+	}
+
+	if ev.Stage == auditinternal.StageRequestReceived {
+		ev.StageTimestamp = metav1.NewMicroTime(ev.RequestReceivedTimestamp.Time)
+	} else {
+		ev.StageTimestamp = metav1.NewMicroTime(time.Now())
+	}
+	audit.ObserveEvent()
+	sink.ProcessEvents(ev)
+}
+
+func decorateResponseWriter(responseWriter http.ResponseWriter, ev *auditinternal.Event, sink audit.Sink, omitStages []auditinternal.Stage) http.ResponseWriter {
+	delegate := &auditResponseWriter{
+		ResponseWriter: responseWriter,
+		event:          ev,
+		sink:           sink,
+		omitStages:     omitStages,
+	}
+
+	// check if the ResponseWriter we're wrapping is the fancy one we need
+	// or if the basic is sufficient
+	_, cn := responseWriter.(http.CloseNotifier)
+	_, fl := responseWriter.(http.Flusher)
+	_, hj := responseWriter.(http.Hijacker)
+	if cn && fl && hj {
+		return &fancyResponseWriterDelegator{delegate}
+	}
+	return delegate
+}
+
+var _ http.ResponseWriter = &auditResponseWriter{}
+
+// auditResponseWriter intercepts WriteHeader, sets it in the event. If the sink is set, it will
+// create immediately an event (for long running requests).
+type auditResponseWriter struct {
+	http.ResponseWriter
+	event      *auditinternal.Event
+	once       sync.Once
+	sink       audit.Sink
+	omitStages []auditinternal.Stage
+}
+
+func (a *auditResponseWriter) setHttpHeader() {
+	a.ResponseWriter.Header().Set(auditinternal.HeaderAuditID, string(a.event.AuditID))
+}
+
+func (a *auditResponseWriter) processCode(code int) {
+	a.once.Do(func() {
+		if a.event.ResponseStatus == nil {
+			a.event.ResponseStatus = &metav1.Status{}
+		}
+		a.event.ResponseStatus.Code = int32(code)
+		a.event.Stage = auditinternal.StageResponseStarted
+
+		if a.sink != nil {
+			processAuditEvent(a.sink, a.event, a.omitStages)
+		}
+	})
+}
+
+func (a *auditResponseWriter) Write(bs []byte) (int, error) {
+	// the Go library calls WriteHeader internally if no code was written yet. But this will go unnoticed for us
+	a.processCode(http.StatusOK)
+	a.setHttpHeader()
+	return a.ResponseWriter.Write(bs)
+}
+
+func (a *auditResponseWriter) WriteHeader(code int) {
+	a.processCode(code)
+	a.setHttpHeader()
+	a.ResponseWriter.WriteHeader(code)
+}
+
+// fancyResponseWriterDelegator implements http.CloseNotifier, http.Flusher and
+// http.Hijacker which are needed to make certain http operation (e.g. watch, rsh, etc)
+// working.
+type fancyResponseWriterDelegator struct {
+	*auditResponseWriter
+}
+
+func (f *fancyResponseWriterDelegator) CloseNotify() <-chan bool {
+	return f.ResponseWriter.(http.CloseNotifier).CloseNotify()
+}
+
+func (f *fancyResponseWriterDelegator) Flush() {
+	f.ResponseWriter.(http.Flusher).Flush()
+}
+
+func (f *fancyResponseWriterDelegator) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+	// fake a response status before protocol switch happens
+	f.processCode(http.StatusSwitchingProtocols)
+
+	// This will be ignored if WriteHeader() function has already been called.
+	// It's not guaranteed Audit-ID http header is sent for all requests.
+	// For example, when user run "kubectl exec", apiserver uses a proxy handler
+	// to deal with the request, users can only get http headers returned by kubelet node.
+	f.setHttpHeader()
+
+	return f.ResponseWriter.(http.Hijacker).Hijack()
+}
+
+var _ http.CloseNotifier = &fancyResponseWriterDelegator{}
+var _ http.Flusher = &fancyResponseWriterDelegator{}
+var _ http.Hijacker = &fancyResponseWriterDelegator{}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/filters/authentication.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/filters/authentication.go
new file mode 100644
index 0000000..ba53fc6
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/filters/authentication.go
@@ -0,0 +1,116 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package filters
+
+import (
+	"errors"
+	"net/http"
+	"strings"
+
+	"github.com/golang/glog"
+	"github.com/prometheus/client_golang/prometheus"
+
+	apierrors "k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apiserver/pkg/authentication/authenticator"
+	"k8s.io/apiserver/pkg/endpoints/handlers/responsewriters"
+	genericapirequest "k8s.io/apiserver/pkg/endpoints/request"
+)
+
+var (
+	authenticatedUserCounter = prometheus.NewCounterVec(
+		prometheus.CounterOpts{
+			Name: "authenticated_user_requests",
+			Help: "Counter of authenticated requests broken out by username.",
+		},
+		[]string{"username"},
+	)
+)
+
+func init() {
+	prometheus.MustRegister(authenticatedUserCounter)
+}
+
+// WithAuthentication creates an http handler that tries to authenticate the given request as a user, and then
+// stores any such user found onto the provided context for the request. If authentication fails or returns an error
+// the failed handler is used. On success, "Authorization" header is removed from the request and handler
+// is invoked to serve the request.
+func WithAuthentication(handler http.Handler, auth authenticator.Request, failed http.Handler) http.Handler {
+	if auth == nil {
+		glog.Warningf("Authentication is disabled")
+		return handler
+	}
+	return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
+		user, ok, err := auth.AuthenticateRequest(req)
+		if err != nil || !ok {
+			if err != nil {
+				glog.Errorf("Unable to authenticate the request due to an error: %v", err)
+			}
+			failed.ServeHTTP(w, req)
+			return
+		}
+
+		// authorization header is not required anymore in case of a successful authentication.
+		req.Header.Del("Authorization")
+
+		req = req.WithContext(genericapirequest.WithUser(req.Context(), user))
+
+		authenticatedUserCounter.WithLabelValues(compressUsername(user.GetName())).Inc()
+
+		handler.ServeHTTP(w, req)
+	})
+}
+
+func Unauthorized(s runtime.NegotiatedSerializer, supportsBasicAuth bool) http.Handler {
+	return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
+		if supportsBasicAuth {
+			w.Header().Set("WWW-Authenticate", `Basic realm="kubernetes-master"`)
+		}
+		ctx := req.Context()
+		requestInfo, found := genericapirequest.RequestInfoFrom(ctx)
+		if !found {
+			responsewriters.InternalError(w, req, errors.New("no RequestInfo found in the context"))
+			return
+		}
+
+		gv := schema.GroupVersion{Group: requestInfo.APIGroup, Version: requestInfo.APIVersion}
+		responsewriters.ErrorNegotiated(apierrors.NewUnauthorized("Unauthorized"), s, gv, w, req)
+	})
+}
+
+// compressUsername maps all possible usernames onto a small set of categories
+// of usernames. This is done both to limit the cardinality of the
+// authorized_user_requests metric, and to avoid pushing actual usernames in the
+// metric.
+func compressUsername(username string) string {
+	switch {
+	// Known internal identities.
+	case username == "admin" ||
+		username == "client" ||
+		username == "kube_proxy" ||
+		username == "kubelet" ||
+		username == "system:serviceaccount:kube-system:default":
+		return username
+	// Probably an email address.
+	case strings.Contains(username, "@"):
+		return "email_id"
+	// Anything else (custom service accounts, custom external identities, etc.)
+	default:
+		return "other"
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/filters/authn_audit.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/filters/authn_audit.go
new file mode 100644
index 0000000..09d7db8
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/filters/authn_audit.go
@@ -0,0 +1,86 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package filters
+
+import (
+	"errors"
+	"fmt"
+	"net/http"
+	"strings"
+
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
+	auditinternal "k8s.io/apiserver/pkg/apis/audit"
+	"k8s.io/apiserver/pkg/audit"
+	"k8s.io/apiserver/pkg/audit/policy"
+	"k8s.io/apiserver/pkg/endpoints/handlers/responsewriters"
+)
+
+// WithFailedAuthenticationAudit decorates a failed http.Handler used in WithAuthentication handler.
+// It is meant to log only failed authentication requests.
+func WithFailedAuthenticationAudit(failedHandler http.Handler, sink audit.Sink, policy policy.Checker) http.Handler {
+	if sink == nil || policy == nil {
+		return failedHandler
+	}
+	return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
+		req, ev, omitStages, err := createAuditEventAndAttachToContext(req, policy)
+		if err != nil {
+			utilruntime.HandleError(fmt.Errorf("failed to create audit event: %v", err))
+			responsewriters.InternalError(w, req, errors.New("failed to create audit event"))
+			return
+		}
+		if ev == nil {
+			failedHandler.ServeHTTP(w, req)
+			return
+		}
+
+		ev.ResponseStatus = &metav1.Status{}
+		ev.ResponseStatus.Message = getAuthMethods(req)
+		ev.Stage = auditinternal.StageResponseStarted
+
+		rw := decorateResponseWriter(w, ev, sink, omitStages)
+		failedHandler.ServeHTTP(rw, req)
+	})
+}
+
+func getAuthMethods(req *http.Request) string {
+	authMethods := []string{}
+
+	if _, _, ok := req.BasicAuth(); ok {
+		authMethods = append(authMethods, "basic")
+	}
+
+	auth := strings.TrimSpace(req.Header.Get("Authorization"))
+	parts := strings.Split(auth, " ")
+	if len(parts) > 1 && strings.ToLower(parts[0]) == "bearer" {
+		authMethods = append(authMethods, "bearer")
+	}
+
+	token := strings.TrimSpace(req.URL.Query().Get("access_token"))
+	if len(token) > 0 {
+		authMethods = append(authMethods, "access_token")
+	}
+
+	if req.TLS != nil && len(req.TLS.PeerCertificates) > 0 {
+		authMethods = append(authMethods, "x509")
+	}
+
+	if len(authMethods) > 0 {
+		return fmt.Sprintf("Authentication failed, attempted: %s", strings.Join(authMethods, ", "))
+	}
+	return "Authentication failed, no credentials provided"
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/filters/authorization.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/filters/authorization.go
new file mode 100644
index 0000000..4c9f140
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/filters/authorization.go
@@ -0,0 +1,106 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package filters
+
+import (
+	"context"
+	"errors"
+	"net/http"
+
+	"github.com/golang/glog"
+
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apiserver/pkg/audit"
+	"k8s.io/apiserver/pkg/authorization/authorizer"
+	"k8s.io/apiserver/pkg/endpoints/handlers/responsewriters"
+	"k8s.io/apiserver/pkg/endpoints/request"
+)
+
+const (
+	// Annotation key names set in advanced audit
+	decisionAnnotationKey = "authorization.k8s.io/decision"
+	reasonAnnotationKey   = "authorization.k8s.io/reason"
+
+	// Annotation values set in advanced audit
+	decisionAllow  = "allow"
+	decisionForbid = "forbid"
+	reasonError    = "internal error"
+)
+
+// WithAuthorizationCheck passes all authorized requests on to handler, and returns a forbidden error otherwise.
+func WithAuthorization(handler http.Handler, a authorizer.Authorizer, s runtime.NegotiatedSerializer) http.Handler {
+	if a == nil {
+		glog.Warningf("Authorization is disabled")
+		return handler
+	}
+	return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
+		ctx := req.Context()
+		ae := request.AuditEventFrom(ctx)
+
+		attributes, err := GetAuthorizerAttributes(ctx)
+		if err != nil {
+			responsewriters.InternalError(w, req, err)
+			return
+		}
+		authorized, reason, err := a.Authorize(attributes)
+		// an authorizer like RBAC could encounter evaluation errors and still allow the request, so authorizer decision is checked before error here.
+		if authorized == authorizer.DecisionAllow {
+			audit.LogAnnotation(ae, decisionAnnotationKey, decisionAllow)
+			audit.LogAnnotation(ae, reasonAnnotationKey, reason)
+			handler.ServeHTTP(w, req)
+			return
+		}
+		if err != nil {
+			audit.LogAnnotation(ae, reasonAnnotationKey, reasonError)
+			responsewriters.InternalError(w, req, err)
+			return
+		}
+
+		glog.V(4).Infof("Forbidden: %#v, Reason: %q", req.RequestURI, reason)
+		audit.LogAnnotation(ae, decisionAnnotationKey, decisionForbid)
+		audit.LogAnnotation(ae, reasonAnnotationKey, reason)
+		responsewriters.Forbidden(ctx, attributes, w, req, reason, s)
+	})
+}
+
+func GetAuthorizerAttributes(ctx context.Context) (authorizer.Attributes, error) {
+	attribs := authorizer.AttributesRecord{}
+
+	user, ok := request.UserFrom(ctx)
+	if ok {
+		attribs.User = user
+	}
+
+	requestInfo, found := request.RequestInfoFrom(ctx)
+	if !found {
+		return nil, errors.New("no RequestInfo found in the context")
+	}
+
+	// Start with common attributes that apply to resource and non-resource requests
+	attribs.ResourceRequest = requestInfo.IsResourceRequest
+	attribs.Path = requestInfo.Path
+	attribs.Verb = requestInfo.Verb
+
+	attribs.APIGroup = requestInfo.APIGroup
+	attribs.APIVersion = requestInfo.APIVersion
+	attribs.Resource = requestInfo.Resource
+	attribs.Subresource = requestInfo.Subresource
+	attribs.Namespace = requestInfo.Namespace
+	attribs.Name = requestInfo.Name
+
+	return &attribs, nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/filters/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/filters/doc.go
new file mode 100644
index 0000000..a13125a
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/filters/doc.go
@@ -0,0 +1,21 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+// Package filters contains all the http handler chain filters which
+// _are_ api related, i.e. which are prerequisite for the API services
+// to work (in contrast to the filters in the server package which are
+// not part of the API contract).
+package filters // import "k8s.io/apiserver/pkg/endpoints/filters"
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/filters/impersonation.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/filters/impersonation.go
new file mode 100644
index 0000000..726cbe4
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/filters/impersonation.go
@@ -0,0 +1,210 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package filters
+
+import (
+	"errors"
+	"fmt"
+	"net/http"
+	"net/url"
+	"strings"
+
+	"github.com/golang/glog"
+
+	authenticationv1 "k8s.io/api/authentication/v1"
+	"k8s.io/api/core/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apiserver/pkg/audit"
+	"k8s.io/apiserver/pkg/authentication/serviceaccount"
+	"k8s.io/apiserver/pkg/authentication/user"
+	"k8s.io/apiserver/pkg/authorization/authorizer"
+	"k8s.io/apiserver/pkg/endpoints/handlers/responsewriters"
+	"k8s.io/apiserver/pkg/endpoints/request"
+	"k8s.io/apiserver/pkg/server/httplog"
+)
+
+// WithImpersonation is a filter that will inspect and check requests that attempt to change the user.Info for their requests
+func WithImpersonation(handler http.Handler, a authorizer.Authorizer, s runtime.NegotiatedSerializer) http.Handler {
+	return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
+		impersonationRequests, err := buildImpersonationRequests(req.Header)
+		if err != nil {
+			glog.V(4).Infof("%v", err)
+			responsewriters.InternalError(w, req, err)
+			return
+		}
+		if len(impersonationRequests) == 0 {
+			handler.ServeHTTP(w, req)
+			return
+		}
+
+		ctx := req.Context()
+		requestor, exists := request.UserFrom(ctx)
+		if !exists {
+			responsewriters.InternalError(w, req, errors.New("no user found for request"))
+			return
+		}
+
+		// if groups are not specified, then we need to look them up differently depending on the type of user
+		// if they are specified, then they are the authority (including the inclusion of system:authenticated/system:unauthenticated groups)
+		groupsSpecified := len(req.Header[authenticationv1.ImpersonateGroupHeader]) > 0
+
+		// make sure we're allowed to impersonate each thing we're requesting.  While we're iterating through, start building username
+		// and group information
+		username := ""
+		groups := []string{}
+		userExtra := map[string][]string{}
+		for _, impersonationRequest := range impersonationRequests {
+			actingAsAttributes := &authorizer.AttributesRecord{
+				User:            requestor,
+				Verb:            "impersonate",
+				APIGroup:        impersonationRequest.GetObjectKind().GroupVersionKind().Group,
+				Namespace:       impersonationRequest.Namespace,
+				Name:            impersonationRequest.Name,
+				ResourceRequest: true,
+			}
+
+			switch impersonationRequest.GetObjectKind().GroupVersionKind().GroupKind() {
+			case v1.SchemeGroupVersion.WithKind("ServiceAccount").GroupKind():
+				actingAsAttributes.Resource = "serviceaccounts"
+				username = serviceaccount.MakeUsername(impersonationRequest.Namespace, impersonationRequest.Name)
+				if !groupsSpecified {
+					// if groups aren't specified for a service account, we know the groups because its a fixed mapping.  Add them
+					groups = serviceaccount.MakeGroupNames(impersonationRequest.Namespace)
+				}
+
+			case v1.SchemeGroupVersion.WithKind("User").GroupKind():
+				actingAsAttributes.Resource = "users"
+				username = impersonationRequest.Name
+
+			case v1.SchemeGroupVersion.WithKind("Group").GroupKind():
+				actingAsAttributes.Resource = "groups"
+				groups = append(groups, impersonationRequest.Name)
+
+			case authenticationv1.SchemeGroupVersion.WithKind("UserExtra").GroupKind():
+				extraKey := impersonationRequest.FieldPath
+				extraValue := impersonationRequest.Name
+				actingAsAttributes.Resource = "userextras"
+				actingAsAttributes.Subresource = extraKey
+				userExtra[extraKey] = append(userExtra[extraKey], extraValue)
+
+			default:
+				glog.V(4).Infof("unknown impersonation request type: %v", impersonationRequest)
+				responsewriters.Forbidden(ctx, actingAsAttributes, w, req, fmt.Sprintf("unknown impersonation request type: %v", impersonationRequest), s)
+				return
+			}
+
+			decision, reason, err := a.Authorize(actingAsAttributes)
+			if err != nil || decision != authorizer.DecisionAllow {
+				glog.V(4).Infof("Forbidden: %#v, Reason: %s, Error: %v", req.RequestURI, reason, err)
+				responsewriters.Forbidden(ctx, actingAsAttributes, w, req, reason, s)
+				return
+			}
+		}
+
+		if !groupsSpecified && username != user.Anonymous {
+			// When impersonating a non-anonymous user, if no groups were specified
+			// include the system:authenticated group in the impersonated user info
+			groups = append(groups, user.AllAuthenticated)
+		}
+
+		newUser := &user.DefaultInfo{
+			Name:   username,
+			Groups: groups,
+			Extra:  userExtra,
+		}
+		req = req.WithContext(request.WithUser(ctx, newUser))
+
+		oldUser, _ := request.UserFrom(ctx)
+		httplog.LogOf(req, w).Addf("%v is acting as %v", oldUser, newUser)
+
+		ae := request.AuditEventFrom(ctx)
+		audit.LogImpersonatedUser(ae, newUser)
+
+		// clear all the impersonation headers from the request
+		req.Header.Del(authenticationv1.ImpersonateUserHeader)
+		req.Header.Del(authenticationv1.ImpersonateGroupHeader)
+		for headerName := range req.Header {
+			if strings.HasPrefix(headerName, authenticationv1.ImpersonateUserExtraHeaderPrefix) {
+				req.Header.Del(headerName)
+			}
+		}
+
+		handler.ServeHTTP(w, req)
+	})
+}
+
+func unescapeExtraKey(encodedKey string) string {
+	key, err := url.PathUnescape(encodedKey) // Decode %-encoded bytes.
+	if err != nil {
+		return encodedKey // Always record extra strings, even if malformed/unencoded.
+	}
+	return key
+}
+
+// buildImpersonationRequests returns a list of objectreferences that represent the different things we're requesting to impersonate.
+// Also includes a map[string][]string representing user.Info.Extra
+// Each request must be authorized against the current user before switching contexts.
+func buildImpersonationRequests(headers http.Header) ([]v1.ObjectReference, error) {
+	impersonationRequests := []v1.ObjectReference{}
+
+	requestedUser := headers.Get(authenticationv1.ImpersonateUserHeader)
+	hasUser := len(requestedUser) > 0
+	if hasUser {
+		if namespace, name, err := serviceaccount.SplitUsername(requestedUser); err == nil {
+			impersonationRequests = append(impersonationRequests, v1.ObjectReference{Kind: "ServiceAccount", Namespace: namespace, Name: name})
+		} else {
+			impersonationRequests = append(impersonationRequests, v1.ObjectReference{Kind: "User", Name: requestedUser})
+		}
+	}
+
+	hasGroups := false
+	for _, group := range headers[authenticationv1.ImpersonateGroupHeader] {
+		hasGroups = true
+		impersonationRequests = append(impersonationRequests, v1.ObjectReference{Kind: "Group", Name: group})
+	}
+
+	hasUserExtra := false
+	for headerName, values := range headers {
+		if !strings.HasPrefix(headerName, authenticationv1.ImpersonateUserExtraHeaderPrefix) {
+			continue
+		}
+
+		hasUserExtra = true
+		extraKey := unescapeExtraKey(strings.ToLower(headerName[len(authenticationv1.ImpersonateUserExtraHeaderPrefix):]))
+
+		// make a separate request for each extra value they're trying to set
+		for _, value := range values {
+			impersonationRequests = append(impersonationRequests,
+				v1.ObjectReference{
+					Kind: "UserExtra",
+					// we only parse out a group above, but the parsing will fail if there isn't SOME version
+					// using the internal version will help us fail if anyone starts using it
+					APIVersion: authenticationv1.SchemeGroupVersion.String(),
+					Name:       value,
+					// ObjectReference doesn't have a subresource field.  FieldPath is close and available, so we'll use that
+					// TODO fight the good fight for ObjectReference to refer to resources and subresources
+					FieldPath: extraKey,
+				})
+		}
+	}
+
+	if (hasGroups || hasUserExtra) && !hasUser {
+		return nil, fmt.Errorf("requested %v without impersonating a user", impersonationRequests)
+	}
+
+	return impersonationRequests, nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/filters/legacy_audit.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/filters/legacy_audit.go
new file mode 100644
index 0000000..bdf13c5
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/filters/legacy_audit.go
@@ -0,0 +1,161 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package filters
+
+import (
+	"bufio"
+	"fmt"
+	"io"
+	"net"
+	"net/http"
+	"strings"
+	"time"
+
+	"github.com/golang/glog"
+	"github.com/pborman/uuid"
+
+	authenticationapi "k8s.io/api/authentication/v1"
+	utilnet "k8s.io/apimachinery/pkg/util/net"
+	"k8s.io/apiserver/pkg/endpoints/handlers/responsewriters"
+)
+
+var _ http.ResponseWriter = &legacyAuditResponseWriter{}
+
+type legacyAuditResponseWriter struct {
+	http.ResponseWriter
+	out io.Writer
+	id  string
+}
+
+func (a *legacyAuditResponseWriter) printResponse(code int) {
+	line := fmt.Sprintf("%s AUDIT: id=%q response=\"%d\"\n", time.Now().Format(time.RFC3339Nano), a.id, code)
+	if _, err := fmt.Fprint(a.out, line); err != nil {
+		glog.Errorf("Unable to write audit log: %s, the error is: %v", line, err)
+	}
+}
+
+func (a *legacyAuditResponseWriter) WriteHeader(code int) {
+	a.printResponse(code)
+	a.ResponseWriter.WriteHeader(code)
+}
+
+// fancyLegacyResponseWriterDelegator implements http.CloseNotifier, http.Flusher and
+// http.Hijacker which are needed to make certain http operation (e.g. watch, rsh, etc)
+// working.
+type fancyLegacyResponseWriterDelegator struct {
+	*legacyAuditResponseWriter
+}
+
+func (f *fancyLegacyResponseWriterDelegator) CloseNotify() <-chan bool {
+	return f.ResponseWriter.(http.CloseNotifier).CloseNotify()
+}
+
+func (f *fancyLegacyResponseWriterDelegator) Flush() {
+	f.ResponseWriter.(http.Flusher).Flush()
+}
+
+func (f *fancyLegacyResponseWriterDelegator) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+	// fake a response status before protocol switch happens
+	f.printResponse(http.StatusSwitchingProtocols)
+	return f.ResponseWriter.(http.Hijacker).Hijack()
+}
+
+var _ http.CloseNotifier = &fancyLegacyResponseWriterDelegator{}
+var _ http.Flusher = &fancyLegacyResponseWriterDelegator{}
+var _ http.Hijacker = &fancyLegacyResponseWriterDelegator{}
+
+// WithLegacyAudit decorates a http.Handler with audit logging information for all the
+// requests coming to the server. If out is nil, no decoration takes place.
+// Each audit log contains two entries:
+// 1. the request line containing:
+//    - unique id allowing to match the response line (see 2)
+//    - source ip of the request
+//    - HTTP method being invoked
+//    - original user invoking the operation
+//    - original user's groups info
+//    - impersonated user for the operation
+//    - impersonated groups info
+//    - namespace of the request or <none>
+//    - uri is the full URI as requested
+// 2. the response line containing:
+//    - the unique id from 1
+//    - response code
+func WithLegacyAudit(handler http.Handler, out io.Writer) http.Handler {
+	if out == nil {
+		return handler
+	}
+	return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
+		ctx := req.Context()
+		attribs, err := GetAuthorizerAttributes(ctx)
+		if err != nil {
+			responsewriters.InternalError(w, req, err)
+			return
+		}
+
+		username := "<none>"
+		groups := "<none>"
+		if attribs.GetUser() != nil {
+			username = attribs.GetUser().GetName()
+			if userGroups := attribs.GetUser().GetGroups(); len(userGroups) > 0 {
+				groups = auditStringSlice(userGroups)
+			}
+		}
+		asuser := req.Header.Get(authenticationapi.ImpersonateUserHeader)
+		if len(asuser) == 0 {
+			asuser = "<self>"
+		}
+		asgroups := "<lookup>"
+		requestedGroups := req.Header[authenticationapi.ImpersonateGroupHeader]
+		if len(requestedGroups) > 0 {
+			asgroups = auditStringSlice(requestedGroups)
+		}
+		namespace := attribs.GetNamespace()
+		if len(namespace) == 0 {
+			namespace = "<none>"
+		}
+		id := uuid.NewRandom().String()
+
+		line := fmt.Sprintf("%s AUDIT: id=%q ip=%q method=%q user=%q groups=%q as=%q asgroups=%q namespace=%q uri=%q\n",
+			time.Now().Format(time.RFC3339Nano), id, utilnet.GetClientIP(req), req.Method, username, groups, asuser, asgroups, namespace, req.URL)
+		if _, err := fmt.Fprint(out, line); err != nil {
+			glog.Errorf("Unable to write audit log: %s, the error is: %v", line, err)
+		}
+		respWriter := legacyDecorateResponseWriter(w, out, id)
+		handler.ServeHTTP(respWriter, req)
+	})
+}
+
+func auditStringSlice(inList []string) string {
+	quotedElements := make([]string, len(inList))
+	for i, in := range inList {
+		quotedElements[i] = fmt.Sprintf("%q", in)
+	}
+	return strings.Join(quotedElements, ",")
+}
+
+func legacyDecorateResponseWriter(responseWriter http.ResponseWriter, out io.Writer, id string) http.ResponseWriter {
+	delegate := &legacyAuditResponseWriter{ResponseWriter: responseWriter, out: out, id: id}
+	// check if the ResponseWriter we're wrapping is the fancy one we need
+	// or if the basic is sufficient
+	_, cn := responseWriter.(http.CloseNotifier)
+	_, fl := responseWriter.(http.Flusher)
+	_, hj := responseWriter.(http.Hijacker)
+	if cn && fl && hj {
+		return &fancyLegacyResponseWriterDelegator{delegate}
+	}
+	return delegate
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/filters/requestinfo.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/filters/requestinfo.go
new file mode 100644
index 0000000..9cc524d
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/filters/requestinfo.go
@@ -0,0 +1,41 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package filters
+
+import (
+	"fmt"
+	"net/http"
+
+	"k8s.io/apiserver/pkg/endpoints/handlers/responsewriters"
+	"k8s.io/apiserver/pkg/endpoints/request"
+)
+
+// WithRequestInfo attaches a RequestInfo to the context.
+func WithRequestInfo(handler http.Handler, resolver request.RequestInfoResolver) http.Handler {
+	return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
+		ctx := req.Context()
+		info, err := resolver.NewRequestInfo(req)
+		if err != nil {
+			responsewriters.InternalError(w, req, fmt.Errorf("failed to create RequestInfo: %v", err))
+			return
+		}
+
+		req = req.WithContext(request.WithRequestInfo(ctx, info))
+
+		handler.ServeHTTP(w, req)
+	})
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/groupversion.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/groupversion.go
new file mode 100644
index 0000000..23d13ad
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/groupversion.go
@@ -0,0 +1,114 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package endpoints
+
+import (
+	"path"
+	"time"
+
+	"github.com/emicklei/go-restful"
+
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	utilerrors "k8s.io/apimachinery/pkg/util/errors"
+	"k8s.io/apimachinery/pkg/util/sets"
+	"k8s.io/apiserver/pkg/admission"
+	"k8s.io/apiserver/pkg/endpoints/discovery"
+	"k8s.io/apiserver/pkg/registry/rest"
+	openapicommon "k8s.io/kube-openapi/pkg/common"
+)
+
+// APIGroupVersion is a helper for exposing rest.Storage objects as http.Handlers via go-restful
+// It handles URLs of the form:
+// /${storage_key}[/${object_name}]
+// Where 'storage_key' points to a rest.Storage object stored in storage.
+// This object should contain all parameterization necessary for running a particular API version
+type APIGroupVersion struct {
+	Storage map[string]rest.Storage
+
+	Root string
+
+	// GroupVersion is the external group version
+	GroupVersion schema.GroupVersion
+
+	// OptionsExternalVersion controls the Kubernetes APIVersion used for common objects in the apiserver
+	// schema like api.Status, api.DeleteOptions, and metav1.ListOptions. Other implementors may
+	// define a version "v1beta1" but want to use the Kubernetes "v1" internal objects. If
+	// empty, defaults to GroupVersion.
+	OptionsExternalVersion *schema.GroupVersion
+	// MetaGroupVersion defaults to "meta.k8s.io/v1" and is the scheme group version used to decode
+	// common API implementations like ListOptions. Future changes will allow this to vary by group
+	// version (for when the inevitable meta/v2 group emerges).
+	MetaGroupVersion *schema.GroupVersion
+
+	// RootScopedKinds are the root scoped kinds for the primary GroupVersion
+	RootScopedKinds sets.String
+
+	// Serializer is used to determine how to convert responses from API methods into bytes to send over
+	// the wire.
+	Serializer     runtime.NegotiatedSerializer
+	ParameterCodec runtime.ParameterCodec
+
+	Typer           runtime.ObjectTyper
+	Creater         runtime.ObjectCreater
+	Convertor       runtime.ObjectConvertor
+	Defaulter       runtime.ObjectDefaulter
+	Linker          runtime.SelfLinker
+	UnsafeConvertor runtime.ObjectConvertor
+
+	Admit admission.Interface
+
+	MinRequestTimeout time.Duration
+
+	// EnableAPIResponseCompression indicates whether API Responses should support compression
+	// if the client requests it via Accept-Encoding
+	EnableAPIResponseCompression bool
+
+	// OpenAPIConfig lets the individual handlers build a subset of the OpenAPI schema before they are installed.
+	OpenAPIConfig *openapicommon.Config
+}
+
+// InstallREST registers the REST handlers (storage, watch, proxy and redirect) into a restful Container.
+// It is expected that the provided path root prefix will serve all operations. Root MUST NOT end
+// in a slash.
+func (g *APIGroupVersion) InstallREST(container *restful.Container) error {
+	prefix := path.Join(g.Root, g.GroupVersion.Group, g.GroupVersion.Version)
+	installer := &APIInstaller{
+		group:                        g,
+		prefix:                       prefix,
+		minRequestTimeout:            g.MinRequestTimeout,
+		enableAPIResponseCompression: g.EnableAPIResponseCompression,
+	}
+
+	apiResources, ws, registrationErrors := installer.Install()
+	versionDiscoveryHandler := discovery.NewAPIVersionHandler(g.Serializer, g.GroupVersion, staticLister{apiResources})
+	versionDiscoveryHandler.AddToWebService(ws)
+	container.Add(ws)
+	return utilerrors.NewAggregate(registrationErrors)
+}
+
+// staticLister implements the APIResourceLister interface
+type staticLister struct {
+	list []metav1.APIResource
+}
+
+func (s staticLister) ListAPIResources() []metav1.APIResource {
+	return s.list
+}
+
+var _ discovery.APIResourceLister = &staticLister{}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/create.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/create.go
new file mode 100644
index 0000000..5427600
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/create.go
@@ -0,0 +1,175 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package handlers
+
+import (
+	"context"
+	"fmt"
+	"net/http"
+	"time"
+
+	"k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/api/meta"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apiserver/pkg/admission"
+	"k8s.io/apiserver/pkg/audit"
+	"k8s.io/apiserver/pkg/endpoints/handlers/negotiation"
+	"k8s.io/apiserver/pkg/endpoints/request"
+	"k8s.io/apiserver/pkg/registry/rest"
+	utiltrace "k8s.io/apiserver/pkg/util/trace"
+)
+
+func createHandler(r rest.NamedCreater, scope RequestScope, admit admission.Interface, includeName bool) http.HandlerFunc {
+	return func(w http.ResponseWriter, req *http.Request) {
+		// For performance tracking purposes.
+		trace := utiltrace.New("Create " + req.URL.Path)
+		defer trace.LogIfLong(500 * time.Millisecond)
+
+		if isDryRun(req.URL) {
+			scope.err(errors.NewBadRequest("dryRun is not supported yet"), w, req)
+			return
+		}
+
+		// TODO: we either want to remove timeout or document it (if we document, move timeout out of this function and declare it in api_installer)
+		timeout := parseTimeout(req.URL.Query().Get("timeout"))
+
+		var (
+			namespace, name string
+			err             error
+		)
+		if includeName {
+			namespace, name, err = scope.Namer.Name(req)
+		} else {
+			namespace, err = scope.Namer.Namespace(req)
+		}
+		if err != nil {
+			scope.err(err, w, req)
+			return
+		}
+
+		ctx := req.Context()
+		ctx = request.WithNamespace(ctx, namespace)
+
+		gv := scope.Kind.GroupVersion()
+		s, err := negotiation.NegotiateInputSerializer(req, false, scope.Serializer)
+		if err != nil {
+			scope.err(err, w, req)
+			return
+		}
+		decoder := scope.Serializer.DecoderToVersion(s.Serializer, schema.GroupVersion{Group: gv.Group, Version: runtime.APIVersionInternal})
+
+		body, err := readBody(req)
+		if err != nil {
+			scope.err(err, w, req)
+			return
+		}
+
+		defaultGVK := scope.Kind
+		original := r.New()
+		trace.Step("About to convert to expected version")
+		obj, gvk, err := decoder.Decode(body, &defaultGVK, original)
+		if err != nil {
+			err = transformDecodeError(scope.Typer, err, original, gvk, body)
+			scope.err(err, w, req)
+			return
+		}
+		if gvk.GroupVersion() != gv {
+			err = errors.NewBadRequest(fmt.Sprintf("the API version in the data (%s) does not match the expected API version (%v)", gvk.GroupVersion().String(), gv.String()))
+			scope.err(err, w, req)
+			return
+		}
+		trace.Step("Conversion done")
+
+		ae := request.AuditEventFrom(ctx)
+		admit = admission.WithAudit(admit, ae)
+		audit.LogRequestObject(ae, obj, scope.Resource, scope.Subresource, scope.Serializer)
+
+		userInfo, _ := request.UserFrom(ctx)
+		admissionAttributes := admission.NewAttributesRecord(obj, nil, scope.Kind, namespace, name, scope.Resource, scope.Subresource, admission.Create, userInfo)
+		if mutatingAdmission, ok := admit.(admission.MutationInterface); ok && mutatingAdmission.Handles(admission.Create) {
+			err = mutatingAdmission.Admit(admissionAttributes)
+			if err != nil {
+				scope.err(err, w, req)
+				return
+			}
+		}
+
+		// TODO: replace with content type negotiation?
+		includeUninitialized := req.URL.Query().Get("includeUninitialized") == "1"
+
+		trace.Step("About to store object in database")
+		result, err := finishRequest(timeout, func() (runtime.Object, error) {
+			return r.Create(
+				ctx,
+				name,
+				obj,
+				rest.AdmissionToValidateObjectFunc(admit, admissionAttributes),
+				includeUninitialized,
+			)
+		})
+		if err != nil {
+			scope.err(err, w, req)
+			return
+		}
+		trace.Step("Object stored in database")
+
+		requestInfo, ok := request.RequestInfoFrom(ctx)
+		if !ok {
+			scope.err(fmt.Errorf("missing requestInfo"), w, req)
+			return
+		}
+		if err := setSelfLink(result, requestInfo, scope.Namer); err != nil {
+			scope.err(err, w, req)
+			return
+		}
+		trace.Step("Self-link added")
+
+		// If the object is partially initialized, always indicate it via StatusAccepted
+		code := http.StatusCreated
+		if accessor, err := meta.Accessor(result); err == nil {
+			if accessor.GetInitializers() != nil {
+				code = http.StatusAccepted
+			}
+		}
+		status, ok := result.(*metav1.Status)
+		if ok && err == nil && status.Code == 0 {
+			status.Code = int32(code)
+		}
+
+		transformResponseObject(ctx, scope, req, w, code, result)
+	}
+}
+
+// CreateNamedResource returns a function that will handle a resource creation with name.
+func CreateNamedResource(r rest.NamedCreater, scope RequestScope, admission admission.Interface) http.HandlerFunc {
+	return createHandler(r, scope, admission, true)
+}
+
+// CreateResource returns a function that will handle a resource creation.
+func CreateResource(r rest.Creater, scope RequestScope, admission admission.Interface) http.HandlerFunc {
+	return createHandler(&namedCreaterAdapter{r}, scope, admission, false)
+}
+
+type namedCreaterAdapter struct {
+	rest.Creater
+}
+
+func (c *namedCreaterAdapter) Create(ctx context.Context, name string, obj runtime.Object, createValidatingAdmission rest.ValidateObjectFunc, includeUninitialized bool) (runtime.Object, error) {
+	return c.Creater.Create(ctx, obj, createValidatingAdmission, includeUninitialized)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/delete.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/delete.go
new file mode 100644
index 0000000..03576d7
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/delete.go
@@ -0,0 +1,296 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package handlers
+
+import (
+	"fmt"
+	"net/http"
+	"time"
+
+	"k8s.io/apimachinery/pkg/api/errors"
+	metainternalversion "k8s.io/apimachinery/pkg/apis/meta/internalversion"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apiserver/pkg/admission"
+	"k8s.io/apiserver/pkg/audit"
+	"k8s.io/apiserver/pkg/endpoints/handlers/negotiation"
+	"k8s.io/apiserver/pkg/endpoints/request"
+	"k8s.io/apiserver/pkg/registry/rest"
+	utiltrace "k8s.io/apiserver/pkg/util/trace"
+)
+
+// DeleteResource returns a function that will handle a resource deletion
+// TODO admission here becomes solely validating admission
+func DeleteResource(r rest.GracefulDeleter, allowsOptions bool, scope RequestScope, admit admission.Interface) http.HandlerFunc {
+	return func(w http.ResponseWriter, req *http.Request) {
+		// For performance tracking purposes.
+		trace := utiltrace.New("Delete " + req.URL.Path)
+		defer trace.LogIfLong(500 * time.Millisecond)
+
+		if isDryRun(req.URL) {
+			scope.err(errors.NewBadRequest("dryRun is not supported yet"), w, req)
+			return
+		}
+
+		// TODO: we either want to remove timeout or document it (if we document, move timeout out of this function and declare it in api_installer)
+		timeout := parseTimeout(req.URL.Query().Get("timeout"))
+
+		namespace, name, err := scope.Namer.Name(req)
+		if err != nil {
+			scope.err(err, w, req)
+			return
+		}
+		ctx := req.Context()
+		ctx = request.WithNamespace(ctx, namespace)
+		ae := request.AuditEventFrom(ctx)
+		admit = admission.WithAudit(admit, ae)
+
+		options := &metav1.DeleteOptions{}
+		if allowsOptions {
+			body, err := readBody(req)
+			if err != nil {
+				scope.err(err, w, req)
+				return
+			}
+			if len(body) > 0 {
+				s, err := negotiation.NegotiateInputSerializer(req, false, metainternalversion.Codecs)
+				if err != nil {
+					scope.err(err, w, req)
+					return
+				}
+				// For backwards compatibility, we need to allow existing clients to submit per group DeleteOptions
+				// It is also allowed to pass a body with meta.k8s.io/v1.DeleteOptions
+				defaultGVK := scope.MetaGroupVersion.WithKind("DeleteOptions")
+				obj, _, err := metainternalversion.Codecs.DecoderToVersion(s.Serializer, defaultGVK.GroupVersion()).Decode(body, &defaultGVK, options)
+				if err != nil {
+					scope.err(err, w, req)
+					return
+				}
+				if obj != options {
+					scope.err(fmt.Errorf("decoded object cannot be converted to DeleteOptions"), w, req)
+					return
+				}
+				trace.Step("Decoded delete options")
+
+				ae := request.AuditEventFrom(ctx)
+				audit.LogRequestObject(ae, obj, scope.Resource, scope.Subresource, scope.Serializer)
+				trace.Step("Recorded the audit event")
+			} else {
+				if values := req.URL.Query(); len(values) > 0 {
+					if err := metainternalversion.ParameterCodec.DecodeParameters(values, scope.MetaGroupVersion, options); err != nil {
+						err = errors.NewBadRequest(err.Error())
+						scope.err(err, w, req)
+						return
+					}
+				}
+			}
+		}
+
+		trace.Step("About to check admission control")
+		if admit != nil && admit.Handles(admission.Delete) {
+			userInfo, _ := request.UserFrom(ctx)
+			attrs := admission.NewAttributesRecord(nil, nil, scope.Kind, namespace, name, scope.Resource, scope.Subresource, admission.Delete, userInfo)
+			if mutatingAdmission, ok := admit.(admission.MutationInterface); ok {
+				if err := mutatingAdmission.Admit(attrs); err != nil {
+					scope.err(err, w, req)
+					return
+				}
+			}
+			if validatingAdmission, ok := admit.(admission.ValidationInterface); ok {
+				if err := validatingAdmission.Validate(attrs); err != nil {
+					scope.err(err, w, req)
+					return
+				}
+			}
+		}
+
+		trace.Step("About to delete object from database")
+		wasDeleted := true
+		result, err := finishRequest(timeout, func() (runtime.Object, error) {
+			obj, deleted, err := r.Delete(ctx, name, options)
+			wasDeleted = deleted
+			return obj, err
+		})
+		if err != nil {
+			scope.err(err, w, req)
+			return
+		}
+		trace.Step("Object deleted from database")
+
+		status := http.StatusOK
+		// Return http.StatusAccepted if the resource was not deleted immediately and
+		// user requested cascading deletion by setting OrphanDependents=false.
+		// Note: We want to do this always if resource was not deleted immediately, but
+		// that will break existing clients.
+		// Other cases where resource is not instantly deleted are: namespace deletion
+		// and pod graceful deletion.
+		if !wasDeleted && options.OrphanDependents != nil && *options.OrphanDependents == false {
+			status = http.StatusAccepted
+		}
+		// if the rest.Deleter returns a nil object, fill out a status. Callers may return a valid
+		// object with the response.
+		if result == nil {
+			result = &metav1.Status{
+				Status: metav1.StatusSuccess,
+				Code:   int32(status),
+				Details: &metav1.StatusDetails{
+					Name: name,
+					Kind: scope.Kind.Kind,
+				},
+			}
+		} else {
+			// when a non-status response is returned, set the self link
+			requestInfo, ok := request.RequestInfoFrom(ctx)
+			if !ok {
+				scope.err(fmt.Errorf("missing requestInfo"), w, req)
+				return
+			}
+			if _, ok := result.(*metav1.Status); !ok {
+				if err := setSelfLink(result, requestInfo, scope.Namer); err != nil {
+					scope.err(err, w, req)
+					return
+				}
+			}
+		}
+
+		transformResponseObject(ctx, scope, req, w, status, result)
+	}
+}
+
+// DeleteCollection returns a function that will handle a collection deletion
+func DeleteCollection(r rest.CollectionDeleter, checkBody bool, scope RequestScope, admit admission.Interface) http.HandlerFunc {
+	return func(w http.ResponseWriter, req *http.Request) {
+		if isDryRun(req.URL) {
+			scope.err(errors.NewBadRequest("dryRun is not supported yet"), w, req)
+			return
+		}
+
+		// TODO: we either want to remove timeout or document it (if we document, move timeout out of this function and declare it in api_installer)
+		timeout := parseTimeout(req.URL.Query().Get("timeout"))
+
+		namespace, err := scope.Namer.Namespace(req)
+		if err != nil {
+			scope.err(err, w, req)
+			return
+		}
+
+		ctx := req.Context()
+		ctx = request.WithNamespace(ctx, namespace)
+		ae := request.AuditEventFrom(ctx)
+		admit = admission.WithAudit(admit, ae)
+
+		if admit != nil && admit.Handles(admission.Delete) {
+			userInfo, _ := request.UserFrom(ctx)
+			attrs := admission.NewAttributesRecord(nil, nil, scope.Kind, namespace, "", scope.Resource, scope.Subresource, admission.Delete, userInfo)
+			if mutatingAdmission, ok := admit.(admission.MutationInterface); ok {
+				err = mutatingAdmission.Admit(attrs)
+				if err != nil {
+					scope.err(err, w, req)
+					return
+				}
+			}
+
+			if validatingAdmission, ok := admit.(admission.ValidationInterface); ok {
+				err = validatingAdmission.Validate(attrs)
+				if err != nil {
+					scope.err(err, w, req)
+					return
+				}
+			}
+		}
+
+		listOptions := metainternalversion.ListOptions{}
+		if err := metainternalversion.ParameterCodec.DecodeParameters(req.URL.Query(), scope.MetaGroupVersion, &listOptions); err != nil {
+			err = errors.NewBadRequest(err.Error())
+			scope.err(err, w, req)
+			return
+		}
+
+		// transform fields
+		// TODO: DecodeParametersInto should do this.
+		if listOptions.FieldSelector != nil {
+			fn := func(label, value string) (newLabel, newValue string, err error) {
+				return scope.Convertor.ConvertFieldLabel(scope.Kind.GroupVersion().String(), scope.Kind.Kind, label, value)
+			}
+			if listOptions.FieldSelector, err = listOptions.FieldSelector.Transform(fn); err != nil {
+				// TODO: allow bad request to set field causes based on query parameters
+				err = errors.NewBadRequest(err.Error())
+				scope.err(err, w, req)
+				return
+			}
+		}
+
+		options := &metav1.DeleteOptions{}
+		if checkBody {
+			body, err := readBody(req)
+			if err != nil {
+				scope.err(err, w, req)
+				return
+			}
+			if len(body) > 0 {
+				s, err := negotiation.NegotiateInputSerializer(req, false, scope.Serializer)
+				if err != nil {
+					scope.err(err, w, req)
+					return
+				}
+				defaultGVK := scope.Kind.GroupVersion().WithKind("DeleteOptions")
+				obj, _, err := scope.Serializer.DecoderToVersion(s.Serializer, defaultGVK.GroupVersion()).Decode(body, &defaultGVK, options)
+				if err != nil {
+					scope.err(err, w, req)
+					return
+				}
+				if obj != options {
+					scope.err(fmt.Errorf("decoded object cannot be converted to DeleteOptions"), w, req)
+					return
+				}
+
+				ae := request.AuditEventFrom(ctx)
+				audit.LogRequestObject(ae, obj, scope.Resource, scope.Subresource, scope.Serializer)
+			}
+		}
+
+		result, err := finishRequest(timeout, func() (runtime.Object, error) {
+			return r.DeleteCollection(ctx, options, &listOptions)
+		})
+		if err != nil {
+			scope.err(err, w, req)
+			return
+		}
+
+		// if the rest.Deleter returns a nil object, fill out a status. Callers may return a valid
+		// object with the response.
+		if result == nil {
+			result = &metav1.Status{
+				Status: metav1.StatusSuccess,
+				Code:   http.StatusOK,
+				Details: &metav1.StatusDetails{
+					Kind: scope.Kind.Kind,
+				},
+			}
+		} else {
+			// when a non-status response is returned, set the self link
+			if _, ok := result.(*metav1.Status); !ok {
+				if _, err := setListSelfLink(result, ctx, req, scope.Namer); err != nil {
+					scope.err(err, w, req)
+					return
+				}
+			}
+		}
+
+		transformResponseObject(ctx, scope, req, w, http.StatusOK, result)
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/doc.go
new file mode 100644
index 0000000..d398338
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/doc.go
@@ -0,0 +1,18 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+// Package handlers contains HTTP handlers to implement the apiserver APIs.
+package handlers // import "k8s.io/apiserver/pkg/endpoints/handlers"
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/get.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/get.go
new file mode 100644
index 0000000..7672859
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/get.go
@@ -0,0 +1,285 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package handlers
+
+import (
+	"context"
+	"fmt"
+	"math/rand"
+	"net/http"
+	"net/url"
+	"strings"
+	"time"
+
+	"github.com/golang/glog"
+
+	"k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/api/meta"
+	metainternalversion "k8s.io/apimachinery/pkg/apis/meta/internalversion"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/fields"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apiserver/pkg/endpoints/metrics"
+	"k8s.io/apiserver/pkg/endpoints/request"
+	"k8s.io/apiserver/pkg/registry/rest"
+	utiltrace "k8s.io/apiserver/pkg/util/trace"
+)
+
+// getterFunc performs a get request with the given context and object name. The request
+// may be used to deserialize an options object to pass to the getter.
+type getterFunc func(ctx context.Context, name string, req *http.Request, trace *utiltrace.Trace) (runtime.Object, error)
+
+// getResourceHandler is an HTTP handler function for get requests. It delegates to the
+// passed-in getterFunc to perform the actual get.
+func getResourceHandler(scope RequestScope, getter getterFunc) http.HandlerFunc {
+	return func(w http.ResponseWriter, req *http.Request) {
+		trace := utiltrace.New("Get " + req.URL.Path)
+		defer trace.LogIfLong(500 * time.Millisecond)
+
+		namespace, name, err := scope.Namer.Name(req)
+		if err != nil {
+			scope.err(err, w, req)
+			return
+		}
+		ctx := req.Context()
+		ctx = request.WithNamespace(ctx, namespace)
+
+		result, err := getter(ctx, name, req, trace)
+		if err != nil {
+			scope.err(err, w, req)
+			return
+		}
+		requestInfo, ok := request.RequestInfoFrom(ctx)
+		if !ok {
+			scope.err(fmt.Errorf("missing requestInfo"), w, req)
+			return
+		}
+		if err := setSelfLink(result, requestInfo, scope.Namer); err != nil {
+			scope.err(err, w, req)
+			return
+		}
+
+		trace.Step("About to write a response")
+		transformResponseObject(ctx, scope, req, w, http.StatusOK, result)
+	}
+}
+
+// GetResource returns a function that handles retrieving a single resource from a rest.Storage object.
+func GetResource(r rest.Getter, e rest.Exporter, scope RequestScope) http.HandlerFunc {
+	return getResourceHandler(scope,
+		func(ctx context.Context, name string, req *http.Request, trace *utiltrace.Trace) (runtime.Object, error) {
+			// check for export
+			options := metav1.GetOptions{}
+			if values := req.URL.Query(); len(values) > 0 {
+				exports := metav1.ExportOptions{}
+				if err := metainternalversion.ParameterCodec.DecodeParameters(values, scope.MetaGroupVersion, &exports); err != nil {
+					err = errors.NewBadRequest(err.Error())
+					return nil, err
+				}
+				if exports.Export {
+					if e == nil {
+						return nil, errors.NewBadRequest(fmt.Sprintf("export of %q is not supported", scope.Resource.Resource))
+					}
+					return e.Export(ctx, name, exports)
+				}
+				if err := metainternalversion.ParameterCodec.DecodeParameters(values, scope.MetaGroupVersion, &options); err != nil {
+					err = errors.NewBadRequest(err.Error())
+					return nil, err
+				}
+			}
+			if trace != nil {
+				trace.Step("About to Get from storage")
+			}
+			return r.Get(ctx, name, &options)
+		})
+}
+
+// GetResourceWithOptions returns a function that handles retrieving a single resource from a rest.Storage object.
+func GetResourceWithOptions(r rest.GetterWithOptions, scope RequestScope, isSubresource bool) http.HandlerFunc {
+	return getResourceHandler(scope,
+		func(ctx context.Context, name string, req *http.Request, trace *utiltrace.Trace) (runtime.Object, error) {
+			opts, subpath, subpathKey := r.NewGetOptions()
+			trace.Step("About to process Get options")
+			if err := getRequestOptions(req, scope, opts, subpath, subpathKey, isSubresource); err != nil {
+				err = errors.NewBadRequest(err.Error())
+				return nil, err
+			}
+			if trace != nil {
+				trace.Step("About to Get from storage")
+			}
+			return r.Get(ctx, name, opts)
+		})
+}
+
+// getRequestOptions parses out options and can include path information.  The path information shouldn't include the subresource.
+func getRequestOptions(req *http.Request, scope RequestScope, into runtime.Object, subpath bool, subpathKey string, isSubresource bool) error {
+	if into == nil {
+		return nil
+	}
+
+	query := req.URL.Query()
+	if subpath {
+		newQuery := make(url.Values)
+		for k, v := range query {
+			newQuery[k] = v
+		}
+
+		ctx := req.Context()
+		requestInfo, _ := request.RequestInfoFrom(ctx)
+		startingIndex := 2
+		if isSubresource {
+			startingIndex = 3
+		}
+
+		p := strings.Join(requestInfo.Parts[startingIndex:], "/")
+
+		// ensure non-empty subpaths correctly reflect a leading slash
+		if len(p) > 0 && !strings.HasPrefix(p, "/") {
+			p = "/" + p
+		}
+
+		// ensure subpaths correctly reflect the presence of a trailing slash on the original request
+		if strings.HasSuffix(requestInfo.Path, "/") && !strings.HasSuffix(p, "/") {
+			p += "/"
+		}
+
+		newQuery[subpathKey] = []string{p}
+		query = newQuery
+	}
+	return scope.ParameterCodec.DecodeParameters(query, scope.Kind.GroupVersion(), into)
+}
+
+func ListResource(r rest.Lister, rw rest.Watcher, scope RequestScope, forceWatch bool, minRequestTimeout time.Duration) http.HandlerFunc {
+	return func(w http.ResponseWriter, req *http.Request) {
+		// For performance tracking purposes.
+		trace := utiltrace.New("List " + req.URL.Path)
+
+		namespace, err := scope.Namer.Namespace(req)
+		if err != nil {
+			scope.err(err, w, req)
+			return
+		}
+
+		// Watches for single objects are routed to this function.
+		// Treat a name parameter the same as a field selector entry.
+		hasName := true
+		_, name, err := scope.Namer.Name(req)
+		if err != nil {
+			hasName = false
+		}
+
+		ctx := req.Context()
+		ctx = request.WithNamespace(ctx, namespace)
+
+		opts := metainternalversion.ListOptions{}
+		if err := metainternalversion.ParameterCodec.DecodeParameters(req.URL.Query(), scope.MetaGroupVersion, &opts); err != nil {
+			err = errors.NewBadRequest(err.Error())
+			scope.err(err, w, req)
+			return
+		}
+
+		// transform fields
+		// TODO: DecodeParametersInto should do this.
+		if opts.FieldSelector != nil {
+			fn := func(label, value string) (newLabel, newValue string, err error) {
+				return scope.Convertor.ConvertFieldLabel(scope.Kind.GroupVersion().String(), scope.Kind.Kind, label, value)
+			}
+			if opts.FieldSelector, err = opts.FieldSelector.Transform(fn); err != nil {
+				// TODO: allow bad request to set field causes based on query parameters
+				err = errors.NewBadRequest(err.Error())
+				scope.err(err, w, req)
+				return
+			}
+		}
+
+		if hasName {
+			// metadata.name is the canonical internal name.
+			// SelectionPredicate will notice that this is a request for
+			// a single object and optimize the storage query accordingly.
+			nameSelector := fields.OneTermEqualSelector("metadata.name", name)
+
+			// Note that fieldSelector setting explicitly the "metadata.name"
+			// will result in reaching this branch (as the value of that field
+			// is propagated to requestInfo as the name parameter.
+			// That said, the allowed field selectors in this branch are:
+			// nil, fields.Everything and field selector matching metadata.name
+			// for our name.
+			if opts.FieldSelector != nil && !opts.FieldSelector.Empty() {
+				selectedName, ok := opts.FieldSelector.RequiresExactMatch("metadata.name")
+				if !ok || name != selectedName {
+					scope.err(errors.NewBadRequest("fieldSelector metadata.name doesn't match requested name"), w, req)
+					return
+				}
+			} else {
+				opts.FieldSelector = nameSelector
+			}
+		}
+
+		if opts.Watch || forceWatch {
+			if rw == nil {
+				scope.err(errors.NewMethodNotSupported(scope.Resource.GroupResource(), "watch"), w, req)
+				return
+			}
+			// TODO: Currently we explicitly ignore ?timeout= and use only ?timeoutSeconds=.
+			timeout := time.Duration(0)
+			if opts.TimeoutSeconds != nil {
+				timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
+			}
+			if timeout == 0 && minRequestTimeout > 0 {
+				timeout = time.Duration(float64(minRequestTimeout) * (rand.Float64() + 1.0))
+			}
+			glog.V(2).Infof("Starting watch for %s, rv=%s labels=%s fields=%s timeout=%s", req.URL.Path, opts.ResourceVersion, opts.LabelSelector, opts.FieldSelector, timeout)
+
+			watcher, err := rw.Watch(ctx, &opts)
+			if err != nil {
+				scope.err(err, w, req)
+				return
+			}
+			requestInfo, _ := request.RequestInfoFrom(ctx)
+			metrics.RecordLongRunning(req, requestInfo, func() {
+				serveWatch(watcher, scope, req, w, timeout)
+			})
+			return
+		}
+
+		// Log only long List requests (ignore Watch).
+		defer trace.LogIfLong(500 * time.Millisecond)
+		trace.Step("About to List from storage")
+		result, err := r.List(ctx, &opts)
+		if err != nil {
+			scope.err(err, w, req)
+			return
+		}
+		trace.Step("Listing from storage done")
+		numberOfItems, err := setListSelfLink(result, ctx, req, scope.Namer)
+		if err != nil {
+			scope.err(err, w, req)
+			return
+		}
+		trace.Step("Self-linking done")
+		// Ensure empty lists return a non-nil items slice
+		if numberOfItems == 0 && meta.IsListType(result) {
+			if err := meta.SetList(result, []runtime.Object{}); err != nil {
+				scope.err(err, w, req)
+				return
+			}
+		}
+
+		transformResponseObject(ctx, scope, req, w, http.StatusOK, result)
+		trace.Step(fmt.Sprintf("Writing http response done (%d items)", numberOfItems))
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/namer.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/namer.go
new file mode 100644
index 0000000..16b4199
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/namer.go
@@ -0,0 +1,135 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package handlers
+
+import (
+	"fmt"
+	"net/http"
+	"net/url"
+
+	"k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apiserver/pkg/endpoints/request"
+)
+
+// ScopeNamer handles accessing names from requests and objects
+type ScopeNamer interface {
+	// Namespace returns the appropriate namespace value from the request (may be empty) or an
+	// error.
+	Namespace(req *http.Request) (namespace string, err error)
+	// Name returns the name from the request, and an optional namespace value if this is a namespace
+	// scoped call. An error is returned if the name is not available.
+	Name(req *http.Request) (namespace, name string, err error)
+	// ObjectName returns the namespace and name from an object if they exist, or an error if the object
+	// does not support names.
+	ObjectName(obj runtime.Object) (namespace, name string, err error)
+	// SetSelfLink sets the provided URL onto the object. The method should return nil if the object
+	// does not support selfLinks.
+	SetSelfLink(obj runtime.Object, url string) error
+	// GenerateLink creates an encoded URI for a given runtime object that represents the canonical path
+	// and query.
+	GenerateLink(requestInfo *request.RequestInfo, obj runtime.Object) (uri string, err error)
+	// GenerateListLink creates an encoded URI for a list that represents the canonical path and query.
+	GenerateListLink(req *http.Request) (uri string, err error)
+}
+
+type ContextBasedNaming struct {
+	SelfLinker    runtime.SelfLinker
+	ClusterScoped bool
+
+	SelfLinkPathPrefix string
+	SelfLinkPathSuffix string
+}
+
+// ContextBasedNaming implements ScopeNamer
+var _ ScopeNamer = ContextBasedNaming{}
+
+func (n ContextBasedNaming) SetSelfLink(obj runtime.Object, url string) error {
+	return n.SelfLinker.SetSelfLink(obj, url)
+}
+
+func (n ContextBasedNaming) Namespace(req *http.Request) (namespace string, err error) {
+	requestInfo, ok := request.RequestInfoFrom(req.Context())
+	if !ok {
+		return "", fmt.Errorf("missing requestInfo")
+	}
+	return requestInfo.Namespace, nil
+}
+
+func (n ContextBasedNaming) Name(req *http.Request) (namespace, name string, err error) {
+	requestInfo, ok := request.RequestInfoFrom(req.Context())
+	if !ok {
+		return "", "", fmt.Errorf("missing requestInfo")
+	}
+	ns, err := n.Namespace(req)
+	if err != nil {
+		return "", "", err
+	}
+
+	if len(requestInfo.Name) == 0 {
+		return "", "", errEmptyName
+	}
+	return ns, requestInfo.Name, nil
+}
+
+func (n ContextBasedNaming) GenerateLink(requestInfo *request.RequestInfo, obj runtime.Object) (uri string, err error) {
+	namespace, name, err := n.ObjectName(obj)
+	if err == errEmptyName && len(requestInfo.Name) > 0 {
+		name = requestInfo.Name
+	} else if err != nil {
+		return "", err
+	}
+	if len(namespace) == 0 && len(requestInfo.Namespace) > 0 {
+		namespace = requestInfo.Namespace
+	}
+
+	if n.ClusterScoped {
+		return n.SelfLinkPathPrefix + url.QueryEscape(name) + n.SelfLinkPathSuffix, nil
+	}
+
+	return n.SelfLinkPathPrefix +
+			url.QueryEscape(namespace) +
+			"/" + url.QueryEscape(requestInfo.Resource) + "/" +
+			url.QueryEscape(name) +
+			n.SelfLinkPathSuffix,
+		nil
+}
+
+func (n ContextBasedNaming) GenerateListLink(req *http.Request) (uri string, err error) {
+	if len(req.URL.RawPath) > 0 {
+		return req.URL.RawPath, nil
+	}
+	return req.URL.EscapedPath(), nil
+}
+
+func (n ContextBasedNaming) ObjectName(obj runtime.Object) (namespace, name string, err error) {
+	name, err = n.SelfLinker.Name(obj)
+	if err != nil {
+		return "", "", err
+	}
+	if len(name) == 0 {
+		return "", "", errEmptyName
+	}
+	namespace, err = n.SelfLinker.Namespace(obj)
+	if err != nil {
+		return "", "", err
+	}
+	return namespace, name, err
+}
+
+// errEmptyName is returned when API requests do not fill the name section of the path.
+var errEmptyName = errors.NewBadRequest("name must be provided")
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/negotiation/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/negotiation/doc.go
new file mode 100644
index 0000000..80f4feb
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/negotiation/doc.go
@@ -0,0 +1,18 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+// Package negotiation contains media type negotiation logic.
+package negotiation // import "k8s.io/apiserver/pkg/endpoints/handlers/negotiation"
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/negotiation/errors.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/negotiation/errors.go
new file mode 100644
index 0000000..93b17cf
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/negotiation/errors.go
@@ -0,0 +1,69 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package negotiation
+
+import (
+	"fmt"
+	"net/http"
+	"strings"
+
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+)
+
+// errNotAcceptable indicates Accept negotiation has failed
+type errNotAcceptable struct {
+	accepted []string
+}
+
+func NewNotAcceptableError(accepted []string) error {
+	return errNotAcceptable{accepted}
+}
+
+func (e errNotAcceptable) Error() string {
+	return fmt.Sprintf("only the following media types are accepted: %v", strings.Join(e.accepted, ", "))
+}
+
+func (e errNotAcceptable) Status() metav1.Status {
+	return metav1.Status{
+		Status:  metav1.StatusFailure,
+		Code:    http.StatusNotAcceptable,
+		Reason:  metav1.StatusReasonNotAcceptable,
+		Message: e.Error(),
+	}
+}
+
+// errUnsupportedMediaType indicates Content-Type is not recognized
+type errUnsupportedMediaType struct {
+	accepted []string
+}
+
+func NewUnsupportedMediaTypeError(accepted []string) error {
+	return errUnsupportedMediaType{accepted}
+}
+
+func (e errUnsupportedMediaType) Error() string {
+	return fmt.Sprintf("the body of the request was in an unknown format - accepted media types include: %v", strings.Join(e.accepted, ", "))
+}
+
+func (e errUnsupportedMediaType) Status() metav1.Status {
+	return metav1.Status{
+		Status:  metav1.StatusFailure,
+		Code:    http.StatusUnsupportedMediaType,
+		Reason:  metav1.StatusReasonUnsupportedMediaType,
+		Message: e.Error(),
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/negotiation/negotiate.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/negotiation/negotiate.go
new file mode 100644
index 0000000..f9bb47b
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/negotiation/negotiate.go
@@ -0,0 +1,305 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+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.
+*/
+
+package negotiation
+
+import (
+	"mime"
+	"net/http"
+	"strconv"
+	"strings"
+
+	"bitbucket.org/ww/goautoneg"
+
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+)
+
+// MediaTypesForSerializer returns a list of media and stream media types for the server.
+func MediaTypesForSerializer(ns runtime.NegotiatedSerializer) (mediaTypes, streamMediaTypes []string) {
+	for _, info := range ns.SupportedMediaTypes() {
+		mediaTypes = append(mediaTypes, info.MediaType)
+		if info.StreamSerializer != nil {
+			// stream=watch is the existing mime-type parameter for watch
+			streamMediaTypes = append(streamMediaTypes, info.MediaType+";stream=watch")
+		}
+	}
+	return mediaTypes, streamMediaTypes
+}
+
+// NegotiateOutputMediaType negotiates the output structured media type and a serializer, or
+// returns an error.
+func NegotiateOutputMediaType(req *http.Request, ns runtime.NegotiatedSerializer, restrictions EndpointRestrictions) (MediaTypeOptions, runtime.SerializerInfo, error) {
+	mediaType, ok := NegotiateMediaTypeOptions(req.Header.Get("Accept"), AcceptedMediaTypesForEndpoint(ns), restrictions)
+	if !ok {
+		supported, _ := MediaTypesForSerializer(ns)
+		return mediaType, runtime.SerializerInfo{}, NewNotAcceptableError(supported)
+	}
+	// TODO: move into resthandler
+	info := mediaType.Accepted.Serializer
+	if (mediaType.Pretty || isPrettyPrint(req)) && info.PrettySerializer != nil {
+		info.Serializer = info.PrettySerializer
+	}
+	return mediaType, info, nil
+}
+
+// NegotiateOutputSerializer returns a serializer for the output.
+func NegotiateOutputSerializer(req *http.Request, ns runtime.NegotiatedSerializer) (runtime.SerializerInfo, error) {
+	_, info, err := NegotiateOutputMediaType(req, ns, DefaultEndpointRestrictions)
+	return info, err
+}
+
+// NegotiateOutputStreamSerializer returns a stream serializer for the given request.
+func NegotiateOutputStreamSerializer(req *http.Request, ns runtime.NegotiatedSerializer) (runtime.SerializerInfo, error) {
+	mediaType, ok := NegotiateMediaTypeOptions(req.Header.Get("Accept"), AcceptedMediaTypesForEndpoint(ns), DefaultEndpointRestrictions)
+	if !ok || mediaType.Accepted.Serializer.StreamSerializer == nil {
+		_, supported := MediaTypesForSerializer(ns)
+		return runtime.SerializerInfo{}, NewNotAcceptableError(supported)
+	}
+	return mediaType.Accepted.Serializer, nil
+}
+
+// NegotiateInputSerializer returns the input serializer for the provided request.
+func NegotiateInputSerializer(req *http.Request, streaming bool, ns runtime.NegotiatedSerializer) (runtime.SerializerInfo, error) {
+	mediaType := req.Header.Get("Content-Type")
+	return NegotiateInputSerializerForMediaType(mediaType, streaming, ns)
+}
+
+// NegotiateInputSerializerForMediaType returns the appropriate serializer for the given media type or an error.
+func NegotiateInputSerializerForMediaType(mediaType string, streaming bool, ns runtime.NegotiatedSerializer) (runtime.SerializerInfo, error) {
+	mediaTypes := ns.SupportedMediaTypes()
+	if len(mediaType) == 0 {
+		mediaType = mediaTypes[0].MediaType
+	}
+	if mediaType, _, err := mime.ParseMediaType(mediaType); err == nil {
+		for _, info := range mediaTypes {
+			if info.MediaType != mediaType {
+				continue
+			}
+			return info, nil
+		}
+	}
+
+	supported, streamingSupported := MediaTypesForSerializer(ns)
+	if streaming {
+		return runtime.SerializerInfo{}, NewUnsupportedMediaTypeError(streamingSupported)
+	}
+	return runtime.SerializerInfo{}, NewUnsupportedMediaTypeError(supported)
+}
+
+// isPrettyPrint returns true if the "pretty" query parameter is true or if the User-Agent
+// matches known "human" clients.
+func isPrettyPrint(req *http.Request) bool {
+	// DEPRECATED: should be part of the content type
+	if req.URL != nil {
+		pp := req.URL.Query().Get("pretty")
+		if len(pp) > 0 {
+			pretty, _ := strconv.ParseBool(pp)
+			return pretty
+		}
+	}
+	userAgent := req.UserAgent()
+	// This covers basic all browsers and cli http tools
+	if strings.HasPrefix(userAgent, "curl") || strings.HasPrefix(userAgent, "Wget") || strings.HasPrefix(userAgent, "Mozilla/5.0") {
+		return true
+	}
+	return false
+}
+
+// EndpointRestrictions is an interface that allows content-type negotiation
+// to verify server support for specific options
+type EndpointRestrictions interface {
+	// AllowsConversion should return true if the specified group version kind
+	// is an allowed target object.
+	AllowsConversion(schema.GroupVersionKind) bool
+	// AllowsServerVersion should return true if the specified version is valid
+	// for the server group.
+	AllowsServerVersion(version string) bool
+	// AllowsStreamSchema should return true if the specified stream schema is
+	// valid for the server group.
+	AllowsStreamSchema(schema string) bool
+}
+
+var DefaultEndpointRestrictions = emptyEndpointRestrictions{}
+
+type emptyEndpointRestrictions struct{}
+
+func (emptyEndpointRestrictions) AllowsConversion(schema.GroupVersionKind) bool { return false }
+func (emptyEndpointRestrictions) AllowsServerVersion(string) bool               { return false }
+func (emptyEndpointRestrictions) AllowsStreamSchema(s string) bool              { return s == "watch" }
+
+// AcceptedMediaType contains information about a valid media type that the
+// server can serialize.
+type AcceptedMediaType struct {
+	// Type is the first part of the media type ("application")
+	Type string
+	// SubType is the second part of the media type ("json")
+	SubType string
+	// Serializer is the serialization info this object accepts
+	Serializer runtime.SerializerInfo
+}
+
+// MediaTypeOptions describes information for a given media type that may alter
+// the server response
+type MediaTypeOptions struct {
+	// pretty is true if the requested representation should be formatted for human
+	// viewing
+	Pretty bool
+
+	// stream, if set, indicates that a streaming protocol variant of this encoding
+	// is desired. The only currently supported value is watch which returns versioned
+	// events. In the future, this may refer to other stream protocols.
+	Stream string
+
+	// convert is a request to alter the type of object returned by the server from the
+	// normal response
+	Convert *schema.GroupVersionKind
+	// useServerVersion is an optional version for the server group
+	UseServerVersion string
+
+	// export is true if the representation requested should exclude fields the server
+	// has set
+	Export bool
+
+	// unrecognized is a list of all unrecognized keys
+	Unrecognized []string
+
+	// the accepted media type from the client
+	Accepted *AcceptedMediaType
+}
+
+// acceptMediaTypeOptions returns an options object that matches the provided media type params. If
+// it returns false, the provided options are not allowed and the media type must be skipped.  These
+// parameters are unversioned and may not be changed.
+func acceptMediaTypeOptions(params map[string]string, accepts *AcceptedMediaType, endpoint EndpointRestrictions) (MediaTypeOptions, bool) {
+	var options MediaTypeOptions
+
+	// extract all known parameters
+	for k, v := range params {
+		switch k {
+
+		// controls transformation of the object when returned
+		case "as":
+			if options.Convert == nil {
+				options.Convert = &schema.GroupVersionKind{}
+			}
+			options.Convert.Kind = v
+		case "g":
+			if options.Convert == nil {
+				options.Convert = &schema.GroupVersionKind{}
+			}
+			options.Convert.Group = v
+		case "v":
+			if options.Convert == nil {
+				options.Convert = &schema.GroupVersionKind{}
+			}
+			options.Convert.Version = v
+
+		// controls the streaming schema
+		case "stream":
+			if len(v) > 0 && (accepts.Serializer.StreamSerializer == nil || !endpoint.AllowsStreamSchema(v)) {
+				return MediaTypeOptions{}, false
+			}
+			options.Stream = v
+
+		// controls the version of the server API group used
+		// for generic output
+		case "sv":
+			if len(v) > 0 && !endpoint.AllowsServerVersion(v) {
+				return MediaTypeOptions{}, false
+			}
+			options.UseServerVersion = v
+
+		// if specified, the server should transform the returned
+		// output and remove fields that are always server specified,
+		// or which fit the default behavior.
+		case "export":
+			options.Export = v == "1"
+
+		// if specified, the pretty serializer will be used
+		case "pretty":
+			options.Pretty = v == "1"
+
+		default:
+			options.Unrecognized = append(options.Unrecognized, k)
+		}
+	}
+
+	if options.Convert != nil && !endpoint.AllowsConversion(*options.Convert) {
+		return MediaTypeOptions{}, false
+	}
+
+	options.Accepted = accepts
+	return options, true
+}
+
+type candidateMediaType struct {
+	accepted *AcceptedMediaType
+	clauses  goautoneg.Accept
+}
+
+type candidateMediaTypeSlice []candidateMediaType
+
+// NegotiateMediaTypeOptions returns the most appropriate content type given the accept header and
+// a list of alternatives along with the accepted media type parameters.
+func NegotiateMediaTypeOptions(header string, accepted []AcceptedMediaType, endpoint EndpointRestrictions) (MediaTypeOptions, bool) {
+	if len(header) == 0 && len(accepted) > 0 {
+		return MediaTypeOptions{
+			Accepted: &accepted[0],
+		}, true
+	}
+
+	var candidates candidateMediaTypeSlice
+	clauses := goautoneg.ParseAccept(header)
+	for _, clause := range clauses {
+		for i := range accepted {
+			accepts := &accepted[i]
+			switch {
+			case clause.Type == accepts.Type && clause.SubType == accepts.SubType,
+				clause.Type == accepts.Type && clause.SubType == "*",
+				clause.Type == "*" && clause.SubType == "*":
+				candidates = append(candidates, candidateMediaType{accepted: accepts, clauses: clause})
+			}
+		}
+	}
+
+	for _, v := range candidates {
+		if retVal, ret := acceptMediaTypeOptions(v.clauses.Params, v.accepted, endpoint); ret {
+			return retVal, true
+		}
+	}
+
+	return MediaTypeOptions{}, false
+}
+
+// AcceptedMediaTypesForEndpoint returns an array of structs that are used to efficiently check which
+// allowed media types the server exposes.
+func AcceptedMediaTypesForEndpoint(ns runtime.NegotiatedSerializer) []AcceptedMediaType {
+	var acceptedMediaTypes []AcceptedMediaType
+	for _, info := range ns.SupportedMediaTypes() {
+		segments := strings.SplitN(info.MediaType, "/", 2)
+		if len(segments) == 1 {
+			segments = append(segments, "*")
+		}
+		t := AcceptedMediaType{
+			Type:       segments[0],
+			SubType:    segments[1],
+			Serializer: info,
+		}
+		acceptedMediaTypes = append(acceptedMediaTypes, t)
+	}
+	return acceptedMediaTypes
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/patch.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/patch.go
new file mode 100644
index 0000000..0801dce
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/patch.go
@@ -0,0 +1,400 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package handlers
+
+import (
+	"context"
+	"fmt"
+	"net/http"
+	"strings"
+	"time"
+
+	"github.com/evanphx/json-patch"
+
+	"k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apimachinery/pkg/types"
+	"k8s.io/apimachinery/pkg/util/json"
+	"k8s.io/apimachinery/pkg/util/mergepatch"
+	"k8s.io/apimachinery/pkg/util/sets"
+	"k8s.io/apimachinery/pkg/util/strategicpatch"
+	"k8s.io/apiserver/pkg/admission"
+	"k8s.io/apiserver/pkg/audit"
+	"k8s.io/apiserver/pkg/endpoints/handlers/negotiation"
+	"k8s.io/apiserver/pkg/endpoints/request"
+	"k8s.io/apiserver/pkg/registry/rest"
+	utiltrace "k8s.io/apiserver/pkg/util/trace"
+)
+
+// PatchResource returns a function that will handle a resource patch.
+func PatchResource(r rest.Patcher, scope RequestScope, admit admission.Interface, patchTypes []string) http.HandlerFunc {
+	return func(w http.ResponseWriter, req *http.Request) {
+		// For performance tracking purposes.
+		trace := utiltrace.New("Patch " + req.URL.Path)
+		defer trace.LogIfLong(500 * time.Millisecond)
+
+		if isDryRun(req.URL) {
+			scope.err(errors.NewBadRequest("dryRun is not supported yet"), w, req)
+			return
+		}
+
+		// Do this first, otherwise name extraction can fail for unrecognized content types
+		// TODO: handle this in negotiation
+		contentType := req.Header.Get("Content-Type")
+		// Remove "; charset=" if included in header.
+		if idx := strings.Index(contentType, ";"); idx > 0 {
+			contentType = contentType[:idx]
+		}
+		patchType := types.PatchType(contentType)
+
+		// Ensure the patchType is one we support
+		if !sets.NewString(patchTypes...).Has(contentType) {
+			scope.err(negotiation.NewUnsupportedMediaTypeError(patchTypes), w, req)
+			return
+		}
+
+		// TODO: we either want to remove timeout or document it (if we
+		// document, move timeout out of this function and declare it in
+		// api_installer)
+		timeout := parseTimeout(req.URL.Query().Get("timeout"))
+
+		namespace, name, err := scope.Namer.Name(req)
+		if err != nil {
+			scope.err(err, w, req)
+			return
+		}
+
+		ctx := req.Context()
+		ctx = request.WithNamespace(ctx, namespace)
+
+		patchJS, err := readBody(req)
+		if err != nil {
+			scope.err(err, w, req)
+			return
+		}
+
+		ae := request.AuditEventFrom(ctx)
+		admit = admission.WithAudit(admit, ae)
+
+		audit.LogRequestPatch(ae, patchJS)
+		trace.Step("Recorded the audit event")
+
+		s, ok := runtime.SerializerInfoForMediaType(scope.Serializer.SupportedMediaTypes(), runtime.ContentTypeJSON)
+		if !ok {
+			scope.err(fmt.Errorf("no serializer defined for JSON"), w, req)
+			return
+		}
+		gv := scope.Kind.GroupVersion()
+		codec := runtime.NewCodec(
+			scope.Serializer.EncoderForVersion(s.Serializer, gv),
+			scope.Serializer.DecoderToVersion(s.Serializer, schema.GroupVersion{Group: gv.Group, Version: runtime.APIVersionInternal}),
+		)
+
+		userInfo, _ := request.UserFrom(ctx)
+		staticAdmissionAttributes := admission.NewAttributesRecord(nil, nil, scope.Kind, namespace, name, scope.Resource, scope.Subresource, admission.Update, userInfo)
+		admissionCheck := func(updatedObject runtime.Object, currentObject runtime.Object) error {
+			if mutatingAdmission, ok := admit.(admission.MutationInterface); ok && admit.Handles(admission.Update) {
+				return mutatingAdmission.Admit(admission.NewAttributesRecord(updatedObject, currentObject, scope.Kind, namespace, name, scope.Resource, scope.Subresource, admission.Update, userInfo))
+			}
+			return nil
+		}
+
+		p := patcher{
+			namer:           scope.Namer,
+			creater:         scope.Creater,
+			defaulter:       scope.Defaulter,
+			unsafeConvertor: scope.UnsafeConvertor,
+			kind:            scope.Kind,
+			resource:        scope.Resource,
+
+			createValidation: rest.AdmissionToValidateObjectFunc(admit, staticAdmissionAttributes),
+			updateValidation: rest.AdmissionToValidateObjectUpdateFunc(admit, staticAdmissionAttributes),
+			admissionCheck:   admissionCheck,
+
+			codec: codec,
+
+			timeout: timeout,
+
+			restPatcher: r,
+			name:        name,
+			patchType:   patchType,
+			patchJS:     patchJS,
+
+			trace: trace,
+		}
+
+		result, err := p.patchResource(ctx)
+		if err != nil {
+			scope.err(err, w, req)
+			return
+		}
+		trace.Step("Object stored in database")
+
+		requestInfo, ok := request.RequestInfoFrom(ctx)
+		if !ok {
+			scope.err(fmt.Errorf("missing requestInfo"), w, req)
+			return
+		}
+		if err := setSelfLink(result, requestInfo, scope.Namer); err != nil {
+			scope.err(err, w, req)
+			return
+		}
+		trace.Step("Self-link added")
+
+		transformResponseObject(ctx, scope, req, w, http.StatusOK, result)
+	}
+}
+
+type mutateObjectUpdateFunc func(obj, old runtime.Object) error
+
+// patcher breaks the process of patch application and retries into smaller
+// pieces of functionality.
+// TODO: Use builder pattern to construct this object?
+// TODO: As part of that effort, some aspects of PatchResource above could be
+// moved into this type.
+type patcher struct {
+	// Pieces of RequestScope
+	namer           ScopeNamer
+	creater         runtime.ObjectCreater
+	defaulter       runtime.ObjectDefaulter
+	unsafeConvertor runtime.ObjectConvertor
+	resource        schema.GroupVersionResource
+	kind            schema.GroupVersionKind
+
+	// Validation functions
+	createValidation rest.ValidateObjectFunc
+	updateValidation rest.ValidateObjectUpdateFunc
+	admissionCheck   mutateObjectUpdateFunc
+
+	codec runtime.Codec
+
+	timeout time.Duration
+
+	// Operation information
+	restPatcher rest.Patcher
+	name        string
+	patchType   types.PatchType
+	patchJS     []byte
+
+	trace *utiltrace.Trace
+
+	// Set at invocation-time (by applyPatch) and immutable thereafter
+	namespace         string
+	updatedObjectInfo rest.UpdatedObjectInfo
+	mechanism         patchMechanism
+}
+
+func (p *patcher) toUnversioned(versionedObj runtime.Object) (runtime.Object, error) {
+	gvk := p.kind.GroupKind().WithVersion(runtime.APIVersionInternal)
+	return p.unsafeConvertor.ConvertToVersion(versionedObj, gvk.GroupVersion())
+}
+
+type patchMechanism interface {
+	applyPatchToCurrentObject(currentObject runtime.Object) (runtime.Object, error)
+}
+
+type jsonPatcher struct {
+	*patcher
+}
+
+func (p *jsonPatcher) applyPatchToCurrentObject(currentObject runtime.Object) (runtime.Object, error) {
+	// Encode will convert & return a versioned object in JSON.
+	currentObjJS, err := runtime.Encode(p.codec, currentObject)
+	if err != nil {
+		return nil, err
+	}
+
+	// Apply the patch.
+	patchedObjJS, err := p.applyJSPatch(currentObjJS)
+	if err != nil {
+		return nil, interpretPatchError(err)
+	}
+
+	// Construct the resulting typed, unversioned object.
+	objToUpdate := p.restPatcher.New()
+	if err := runtime.DecodeInto(p.codec, patchedObjJS, objToUpdate); err != nil {
+		return nil, err
+	}
+
+	return objToUpdate, nil
+}
+
+// patchJS applies the patch. Input and output objects must both have
+// the external version, since that is what the patch must have been constructed against.
+func (p *jsonPatcher) applyJSPatch(versionedJS []byte) (patchedJS []byte, retErr error) {
+	switch p.patchType {
+	case types.JSONPatchType:
+		patchObj, err := jsonpatch.DecodePatch(p.patchJS)
+		if err != nil {
+			return nil, err
+		}
+		return patchObj.Apply(versionedJS)
+	case types.MergePatchType:
+		return jsonpatch.MergePatch(versionedJS, p.patchJS)
+	default:
+		// only here as a safety net - go-restful filters content-type
+		return nil, fmt.Errorf("unknown Content-Type header for patch: %v", p.patchType)
+	}
+}
+
+type smpPatcher struct {
+	*patcher
+
+	// Schema
+	schemaReferenceObj runtime.Object
+}
+
+func (p *smpPatcher) applyPatchToCurrentObject(currentObject runtime.Object) (runtime.Object, error) {
+	// Since the patch is applied on versioned objects, we need to convert the
+	// current object to versioned representation first.
+	currentVersionedObject, err := p.unsafeConvertor.ConvertToVersion(currentObject, p.kind.GroupVersion())
+	if err != nil {
+		return nil, err
+	}
+	versionedObjToUpdate, err := p.creater.New(p.kind)
+	if err != nil {
+		return nil, err
+	}
+	if err := strategicPatchObject(p.codec, p.defaulter, currentVersionedObject, p.patchJS, versionedObjToUpdate, p.schemaReferenceObj); err != nil {
+		return nil, err
+	}
+	// Convert the object back to unversioned (aka internal version).
+	unversionedObjToUpdate, err := p.toUnversioned(versionedObjToUpdate)
+	if err != nil {
+		return nil, err
+	}
+
+	return unversionedObjToUpdate, nil
+}
+
+// strategicPatchObject applies a strategic merge patch of <patchJS> to
+// <originalObject> and stores the result in <objToUpdate>.
+// It additionally returns the map[string]interface{} representation of the
+// <originalObject> and <patchJS>.
+// NOTE: Both <originalObject> and <objToUpdate> are supposed to be versioned.
+func strategicPatchObject(
+	codec runtime.Codec,
+	defaulter runtime.ObjectDefaulter,
+	originalObject runtime.Object,
+	patchJS []byte,
+	objToUpdate runtime.Object,
+	schemaReferenceObj runtime.Object,
+) error {
+	originalObjMap, err := runtime.DefaultUnstructuredConverter.ToUnstructured(originalObject)
+	if err != nil {
+		return err
+	}
+
+	patchMap := make(map[string]interface{})
+	if err := json.Unmarshal(patchJS, &patchMap); err != nil {
+		return errors.NewBadRequest(err.Error())
+	}
+
+	if err := applyPatchToObject(codec, defaulter, originalObjMap, patchMap, objToUpdate, schemaReferenceObj); err != nil {
+		return err
+	}
+	return nil
+}
+
+// applyPatch is called every time GuaranteedUpdate asks for the updated object,
+// and is given the currently persisted object as input.
+func (p *patcher) applyPatch(_ context.Context, _, currentObject runtime.Object) (runtime.Object, error) {
+	// Make sure we actually have a persisted currentObject
+	p.trace.Step("About to apply patch")
+	if hasUID, err := hasUID(currentObject); err != nil {
+		return nil, err
+	} else if !hasUID {
+		return nil, errors.NewNotFound(p.resource.GroupResource(), p.name)
+	}
+
+	objToUpdate, err := p.mechanism.applyPatchToCurrentObject(currentObject)
+	if err != nil {
+		return nil, err
+	}
+	if err := checkName(objToUpdate, p.name, p.namespace, p.namer); err != nil {
+		return nil, err
+	}
+	return objToUpdate, nil
+}
+
+// applyAdmission is called every time GuaranteedUpdate asks for the updated object,
+// and is given the currently persisted object and the patched object as input.
+func (p *patcher) applyAdmission(ctx context.Context, patchedObject runtime.Object, currentObject runtime.Object) (runtime.Object, error) {
+	p.trace.Step("About to check admission control")
+	return patchedObject, p.admissionCheck(patchedObject, currentObject)
+}
+
+// patchResource divides PatchResource for easier unit testing
+func (p *patcher) patchResource(ctx context.Context) (runtime.Object, error) {
+	p.namespace = request.NamespaceValue(ctx)
+	switch p.patchType {
+	case types.JSONPatchType, types.MergePatchType:
+		p.mechanism = &jsonPatcher{patcher: p}
+	case types.StrategicMergePatchType:
+		schemaReferenceObj, err := p.unsafeConvertor.ConvertToVersion(p.restPatcher.New(), p.kind.GroupVersion())
+		if err != nil {
+			return nil, err
+		}
+		p.mechanism = &smpPatcher{patcher: p, schemaReferenceObj: schemaReferenceObj}
+	default:
+		return nil, fmt.Errorf("%v: unimplemented patch type", p.patchType)
+	}
+	p.updatedObjectInfo = rest.DefaultUpdatedObjectInfo(nil, p.applyPatch, p.applyAdmission)
+	return finishRequest(p.timeout, func() (runtime.Object, error) {
+		updateObject, _, updateErr := p.restPatcher.Update(ctx, p.name, p.updatedObjectInfo, p.createValidation, p.updateValidation)
+		return updateObject, updateErr
+	})
+}
+
+// applyPatchToObject applies a strategic merge patch of <patchMap> to
+// <originalMap> and stores the result in <objToUpdate>.
+// NOTE: <objToUpdate> must be a versioned object.
+func applyPatchToObject(
+	codec runtime.Codec,
+	defaulter runtime.ObjectDefaulter,
+	originalMap map[string]interface{},
+	patchMap map[string]interface{},
+	objToUpdate runtime.Object,
+	schemaReferenceObj runtime.Object,
+) error {
+	patchedObjMap, err := strategicpatch.StrategicMergeMapPatch(originalMap, patchMap, schemaReferenceObj)
+	if err != nil {
+		return interpretPatchError(err)
+	}
+
+	// Rather than serialize the patched map to JSON, then decode it to an object, we go directly from a map to an object
+	if err := runtime.DefaultUnstructuredConverter.FromUnstructured(patchedObjMap, objToUpdate); err != nil {
+		return err
+	}
+	// Decoding from JSON to a versioned object would apply defaults, so we do the same here
+	defaulter.Default(objToUpdate)
+
+	return nil
+}
+
+// interpretPatchError interprets the error type and returns an error with appropriate HTTP code.
+func interpretPatchError(err error) error {
+	switch err {
+	case mergepatch.ErrBadJSONDoc, mergepatch.ErrBadPatchFormatForPrimitiveList, mergepatch.ErrBadPatchFormatForRetainKeys, mergepatch.ErrBadPatchFormatForSetElementOrderList, mergepatch.ErrUnsupportedStrategicMergePatchFormat:
+		return errors.NewBadRequest(err.Error())
+	case mergepatch.ErrNoListOfLists, mergepatch.ErrPatchContentNotMatchRetainKeys:
+		return errors.NewGenericServerResponse(http.StatusUnprocessableEntity, "", schema.GroupResource{}, "", err.Error(), 0, false)
+	default:
+		return err
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/response.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/response.go
new file mode 100644
index 0000000..8cee470
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/response.go
@@ -0,0 +1,195 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package handlers
+
+import (
+	"context"
+	"fmt"
+	"net/http"
+
+	"k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/api/meta"
+	metainternalversion "k8s.io/apimachinery/pkg/apis/meta/internalversion"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	metav1beta1 "k8s.io/apimachinery/pkg/apis/meta/v1beta1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apiserver/pkg/endpoints/handlers/negotiation"
+	"k8s.io/apiserver/pkg/endpoints/handlers/responsewriters"
+)
+
+// transformResponseObject takes an object loaded from storage and performs any necessary transformations.
+// Will write the complete response object.
+func transformResponseObject(ctx context.Context, scope RequestScope, req *http.Request, w http.ResponseWriter, statusCode int, result runtime.Object) {
+	// TODO: fetch the media type much earlier in request processing and pass it into this method.
+	mediaType, _, err := negotiation.NegotiateOutputMediaType(req, scope.Serializer, &scope)
+	if err != nil {
+		status := responsewriters.ErrorToAPIStatus(err)
+		responsewriters.WriteRawJSON(int(status.Code), status, w)
+		return
+	}
+
+	// If conversion was allowed by the scope, perform it before writing the response
+	if target := mediaType.Convert; target != nil {
+		switch {
+
+		case target.Kind == "PartialObjectMetadata" && target.GroupVersion() == metav1beta1.SchemeGroupVersion:
+			if meta.IsListType(result) {
+				// TODO: this should be calculated earlier
+				err = newNotAcceptableError(fmt.Sprintf("you requested PartialObjectMetadata, but the requested object is a list (%T)", result))
+				scope.err(err, w, req)
+				return
+			}
+			m, err := meta.Accessor(result)
+			if err != nil {
+				scope.err(err, w, req)
+				return
+			}
+			partial := meta.AsPartialObjectMetadata(m)
+			partial.GetObjectKind().SetGroupVersionKind(metav1beta1.SchemeGroupVersion.WithKind("PartialObjectMetadata"))
+
+			// renegotiate under the internal version
+			_, info, err := negotiation.NegotiateOutputMediaType(req, metainternalversion.Codecs, &scope)
+			if err != nil {
+				scope.err(err, w, req)
+				return
+			}
+			encoder := metainternalversion.Codecs.EncoderForVersion(info.Serializer, metav1beta1.SchemeGroupVersion)
+			responsewriters.SerializeObject(info.MediaType, encoder, w, req, statusCode, partial)
+			return
+
+		case target.Kind == "PartialObjectMetadataList" && target.GroupVersion() == metav1beta1.SchemeGroupVersion:
+			if !meta.IsListType(result) {
+				// TODO: this should be calculated earlier
+				err = newNotAcceptableError(fmt.Sprintf("you requested PartialObjectMetadataList, but the requested object is not a list (%T)", result))
+				scope.err(err, w, req)
+				return
+			}
+			list := &metav1beta1.PartialObjectMetadataList{}
+			err := meta.EachListItem(result, func(obj runtime.Object) error {
+				m, err := meta.Accessor(obj)
+				if err != nil {
+					return err
+				}
+				partial := meta.AsPartialObjectMetadata(m)
+				partial.GetObjectKind().SetGroupVersionKind(metav1beta1.SchemeGroupVersion.WithKind("PartialObjectMetadata"))
+				list.Items = append(list.Items, partial)
+				return nil
+			})
+			if err != nil {
+				scope.err(err, w, req)
+				return
+			}
+
+			// renegotiate under the internal version
+			_, info, err := negotiation.NegotiateOutputMediaType(req, metainternalversion.Codecs, &scope)
+			if err != nil {
+				scope.err(err, w, req)
+				return
+			}
+			encoder := metainternalversion.Codecs.EncoderForVersion(info.Serializer, metav1beta1.SchemeGroupVersion)
+			responsewriters.SerializeObject(info.MediaType, encoder, w, req, statusCode, list)
+			return
+
+		case target.Kind == "Table" && target.GroupVersion() == metav1beta1.SchemeGroupVersion:
+			// TODO: relax the version abstraction
+			// TODO: skip if this is a status response (delete without body)?
+
+			opts := &metav1beta1.TableOptions{}
+			if err := metav1beta1.ParameterCodec.DecodeParameters(req.URL.Query(), metav1beta1.SchemeGroupVersion, opts); err != nil {
+				scope.err(err, w, req)
+				return
+			}
+
+			table, err := scope.TableConvertor.ConvertToTable(ctx, result, opts)
+			if err != nil {
+				scope.err(err, w, req)
+				return
+			}
+
+			for i := range table.Rows {
+				item := &table.Rows[i]
+				switch opts.IncludeObject {
+				case metav1beta1.IncludeObject:
+					item.Object.Object, err = scope.Convertor.ConvertToVersion(item.Object.Object, scope.Kind.GroupVersion())
+					if err != nil {
+						scope.err(err, w, req)
+						return
+					}
+				// TODO: rely on defaulting for the value here?
+				case metav1beta1.IncludeMetadata, "":
+					m, err := meta.Accessor(item.Object.Object)
+					if err != nil {
+						scope.err(err, w, req)
+						return
+					}
+					// TODO: turn this into an internal type and do conversion in order to get object kind automatically set?
+					partial := meta.AsPartialObjectMetadata(m)
+					partial.GetObjectKind().SetGroupVersionKind(metav1beta1.SchemeGroupVersion.WithKind("PartialObjectMetadata"))
+					item.Object.Object = partial
+				case metav1beta1.IncludeNone:
+					item.Object.Object = nil
+				default:
+					// TODO: move this to validation on the table options?
+					err = errors.NewBadRequest(fmt.Sprintf("unrecognized includeObject value: %q", opts.IncludeObject))
+					scope.err(err, w, req)
+				}
+			}
+
+			// renegotiate under the internal version
+			_, info, err := negotiation.NegotiateOutputMediaType(req, metainternalversion.Codecs, &scope)
+			if err != nil {
+				scope.err(err, w, req)
+				return
+			}
+			encoder := metainternalversion.Codecs.EncoderForVersion(info.Serializer, metav1beta1.SchemeGroupVersion)
+			responsewriters.SerializeObject(info.MediaType, encoder, w, req, statusCode, table)
+			return
+
+		default:
+			// this block should only be hit if scope AllowsConversion is incorrect
+			accepted, _ := negotiation.MediaTypesForSerializer(metainternalversion.Codecs)
+			err := negotiation.NewNotAcceptableError(accepted)
+			status := responsewriters.ErrorToAPIStatus(err)
+			responsewriters.WriteRawJSON(int(status.Code), status, w)
+			return
+		}
+	}
+
+	responsewriters.WriteObject(statusCode, scope.Kind.GroupVersion(), scope.Serializer, result, w, req)
+}
+
+// errNotAcceptable indicates Accept negotiation has failed
+type errNotAcceptable struct {
+	message string
+}
+
+func newNotAcceptableError(message string) error {
+	return errNotAcceptable{message}
+}
+
+func (e errNotAcceptable) Error() string {
+	return e.message
+}
+
+func (e errNotAcceptable) Status() metav1.Status {
+	return metav1.Status{
+		Status:  metav1.StatusFailure,
+		Code:    http.StatusNotAcceptable,
+		Reason:  metav1.StatusReason("NotAcceptable"),
+		Message: e.Error(),
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/doc.go
new file mode 100644
index 0000000..b76758b
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/doc.go
@@ -0,0 +1,18 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+// Package responsewriters containers helpers to write responses in HTTP handlers.
+package responsewriters // import "k8s.io/apiserver/pkg/endpoints/handlers/responsewriters"
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/errors.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/errors.go
new file mode 100644
index 0000000..007efe9
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/errors.go
@@ -0,0 +1,97 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package responsewriters
+
+import (
+	"context"
+	"fmt"
+	"net/http"
+	"strings"
+
+	apierrors "k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
+	"k8s.io/apiserver/pkg/authorization/authorizer"
+)
+
+// Avoid emitting errors that look like valid HTML. Quotes are okay.
+var sanitizer = strings.NewReplacer(`&`, "&amp;", `<`, "&lt;", `>`, "&gt;")
+
+// BadGatewayError renders a simple bad gateway error.
+func BadGatewayError(w http.ResponseWriter, req *http.Request) {
+	w.Header().Set("Content-Type", "text/plain")
+	w.Header().Set("X-Content-Type-Options", "nosniff")
+	w.WriteHeader(http.StatusBadGateway)
+	fmt.Fprintf(w, "Bad Gateway: %q", sanitizer.Replace(req.RequestURI))
+}
+
+// Forbidden renders a simple forbidden error
+func Forbidden(ctx context.Context, attributes authorizer.Attributes, w http.ResponseWriter, req *http.Request, reason string, s runtime.NegotiatedSerializer) {
+	msg := sanitizer.Replace(forbiddenMessage(attributes))
+	w.Header().Set("X-Content-Type-Options", "nosniff")
+
+	var errMsg string
+	if len(reason) == 0 {
+		errMsg = fmt.Sprintf("%s", msg)
+	} else {
+		errMsg = fmt.Sprintf("%s: %s", msg, reason)
+	}
+	gv := schema.GroupVersion{Group: attributes.GetAPIGroup(), Version: attributes.GetAPIVersion()}
+	gr := schema.GroupResource{Group: attributes.GetAPIGroup(), Resource: attributes.GetResource()}
+	ErrorNegotiated(apierrors.NewForbidden(gr, attributes.GetName(), fmt.Errorf(errMsg)), s, gv, w, req)
+}
+
+func forbiddenMessage(attributes authorizer.Attributes) string {
+	username := ""
+	if user := attributes.GetUser(); user != nil {
+		username = user.GetName()
+	}
+
+	if !attributes.IsResourceRequest() {
+		return fmt.Sprintf("User %q cannot %s path %q", username, attributes.GetVerb(), attributes.GetPath())
+	}
+
+	resource := attributes.GetResource()
+	if group := attributes.GetAPIGroup(); len(group) > 0 {
+		resource = resource + "." + group
+	}
+	if subresource := attributes.GetSubresource(); len(subresource) > 0 {
+		resource = resource + "/" + subresource
+	}
+
+	if ns := attributes.GetNamespace(); len(ns) > 0 {
+		return fmt.Sprintf("User %q cannot %s %s in the namespace %q", username, attributes.GetVerb(), resource, ns)
+	}
+
+	return fmt.Sprintf("User %q cannot %s %s at the cluster scope", username, attributes.GetVerb(), resource)
+}
+
+// InternalError renders a simple internal error
+func InternalError(w http.ResponseWriter, req *http.Request, err error) {
+	w.Header().Set("Content-Type", "text/plain")
+	w.Header().Set("X-Content-Type-Options", "nosniff")
+	w.WriteHeader(http.StatusInternalServerError)
+	fmt.Fprintf(w, "Internal Server Error: %q: %v", sanitizer.Replace(req.RequestURI), err)
+	utilruntime.HandleError(err)
+}
+
+// NotFound renders a simple not found error.
+func NotFound(w http.ResponseWriter, req *http.Request) {
+	w.WriteHeader(http.StatusNotFound)
+	fmt.Fprintf(w, "Not Found: %q", sanitizer.Replace(req.RequestURI))
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/status.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/status.go
new file mode 100755
index 0000000..9967307
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/status.go
@@ -0,0 +1,76 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package responsewriters
+
+import (
+	"fmt"
+	"net/http"
+
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/util/runtime"
+	"k8s.io/apiserver/pkg/storage"
+)
+
+// statusError is an object that can be converted into an metav1.Status
+type statusError interface {
+	Status() metav1.Status
+}
+
+// ErrorToAPIStatus converts an error to an metav1.Status object.
+func ErrorToAPIStatus(err error) *metav1.Status {
+	switch t := err.(type) {
+	case statusError:
+		status := t.Status()
+		if len(status.Status) == 0 {
+			status.Status = metav1.StatusFailure
+		}
+		if status.Code == 0 {
+			switch status.Status {
+			case metav1.StatusSuccess:
+				status.Code = http.StatusOK
+			case metav1.StatusFailure:
+				status.Code = http.StatusInternalServerError
+			}
+		}
+		status.Kind = "Status"
+		status.APIVersion = "v1"
+		//TODO: check for invalid responses
+		return &status
+	default:
+		status := http.StatusInternalServerError
+		switch {
+		//TODO: replace me with NewConflictErr
+		case storage.IsConflict(err):
+			status = http.StatusConflict
+		}
+		// Log errors that were not converted to an error status
+		// by REST storage - these typically indicate programmer
+		// error by not using pkg/api/errors, or unexpected failure
+		// cases.
+		runtime.HandleError(fmt.Errorf("apiserver received an error that is not an metav1.Status: %#+v", err))
+		return &metav1.Status{
+			TypeMeta: metav1.TypeMeta{
+				Kind:       "Status",
+				APIVersion: "v1",
+			},
+			Status:  metav1.StatusFailure,
+			Code:    int32(status),
+			Reason:  metav1.StatusReasonUnknown,
+			Message: err.Error(),
+		}
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/writers.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/writers.go
new file mode 100644
index 0000000..0add873
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/writers.go
@@ -0,0 +1,174 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package responsewriters
+
+import (
+	"encoding/json"
+	"fmt"
+	"io"
+	"net/http"
+	"strconv"
+
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
+	"k8s.io/apiserver/pkg/audit"
+	"k8s.io/apiserver/pkg/endpoints/handlers/negotiation"
+	"k8s.io/apiserver/pkg/endpoints/metrics"
+	"k8s.io/apiserver/pkg/endpoints/request"
+	"k8s.io/apiserver/pkg/registry/rest"
+	"k8s.io/apiserver/pkg/util/flushwriter"
+	"k8s.io/apiserver/pkg/util/wsstream"
+)
+
+// WriteObject renders a returned runtime.Object to the response as a stream or an encoded object. If the object
+// returned by the response implements rest.ResourceStreamer that interface will be used to render the
+// response. The Accept header and current API version will be passed in, and the output will be copied
+// directly to the response body. If content type is returned it is used, otherwise the content type will
+// be "application/octet-stream". All other objects are sent to standard JSON serialization.
+func WriteObject(statusCode int, gv schema.GroupVersion, s runtime.NegotiatedSerializer, object runtime.Object, w http.ResponseWriter, req *http.Request) {
+	stream, ok := object.(rest.ResourceStreamer)
+	if ok {
+		requestInfo, _ := request.RequestInfoFrom(req.Context())
+		metrics.RecordLongRunning(req, requestInfo, func() {
+			StreamObject(statusCode, gv, s, stream, w, req)
+		})
+		return
+	}
+	WriteObjectNegotiated(s, gv, w, req, statusCode, object)
+}
+
+// StreamObject performs input stream negotiation from a ResourceStreamer and writes that to the response.
+// If the client requests a websocket upgrade, negotiate for a websocket reader protocol (because many
+// browser clients cannot easily handle binary streaming protocols).
+func StreamObject(statusCode int, gv schema.GroupVersion, s runtime.NegotiatedSerializer, stream rest.ResourceStreamer, w http.ResponseWriter, req *http.Request) {
+	out, flush, contentType, err := stream.InputStream(gv.String(), req.Header.Get("Accept"))
+	if err != nil {
+		ErrorNegotiated(err, s, gv, w, req)
+		return
+	}
+	if out == nil {
+		// No output provided - return StatusNoContent
+		w.WriteHeader(http.StatusNoContent)
+		return
+	}
+	defer out.Close()
+
+	if wsstream.IsWebSocketRequest(req) {
+		r := wsstream.NewReader(out, true, wsstream.NewDefaultReaderProtocols())
+		if err := r.Copy(w, req); err != nil {
+			utilruntime.HandleError(fmt.Errorf("error encountered while streaming results via websocket: %v", err))
+		}
+		return
+	}
+
+	if len(contentType) == 0 {
+		contentType = "application/octet-stream"
+	}
+	w.Header().Set("Content-Type", contentType)
+	w.WriteHeader(statusCode)
+	writer := w.(io.Writer)
+	if flush {
+		writer = flushwriter.Wrap(w)
+	}
+	io.Copy(writer, out)
+}
+
+// SerializeObject renders an object in the content type negotiated by the client using the provided encoder.
+// The context is optional and can be nil.
+func SerializeObject(mediaType string, encoder runtime.Encoder, w http.ResponseWriter, req *http.Request, statusCode int, object runtime.Object) {
+	w.Header().Set("Content-Type", mediaType)
+	w.WriteHeader(statusCode)
+
+	if err := encoder.Encode(object, w); err != nil {
+		errorJSONFatal(err, encoder, w)
+	}
+}
+
+// WriteObjectNegotiated renders an object in the content type negotiated by the client.
+// The context is optional and can be nil.
+func WriteObjectNegotiated(s runtime.NegotiatedSerializer, gv schema.GroupVersion, w http.ResponseWriter, req *http.Request, statusCode int, object runtime.Object) {
+	serializer, err := negotiation.NegotiateOutputSerializer(req, s)
+	if err != nil {
+		// if original statusCode was not successful we need to return the original error
+		// we cannot hide it behind negotiation problems
+		if statusCode < http.StatusOK || statusCode >= http.StatusBadRequest {
+			WriteRawJSON(int(statusCode), object, w)
+			return
+		}
+		status := ErrorToAPIStatus(err)
+		WriteRawJSON(int(status.Code), status, w)
+		return
+	}
+
+	if ae := request.AuditEventFrom(req.Context()); ae != nil {
+		audit.LogResponseObject(ae, object, gv, s)
+	}
+
+	encoder := s.EncoderForVersion(serializer.Serializer, gv)
+	SerializeObject(serializer.MediaType, encoder, w, req, statusCode, object)
+}
+
+// ErrorNegotiated renders an error to the response. Returns the HTTP status code of the error.
+// The context is optional and may be nil.
+func ErrorNegotiated(err error, s runtime.NegotiatedSerializer, gv schema.GroupVersion, w http.ResponseWriter, req *http.Request) int {
+	status := ErrorToAPIStatus(err)
+	code := int(status.Code)
+	// when writing an error, check to see if the status indicates a retry after period
+	if status.Details != nil && status.Details.RetryAfterSeconds > 0 {
+		delay := strconv.Itoa(int(status.Details.RetryAfterSeconds))
+		w.Header().Set("Retry-After", delay)
+	}
+
+	if code == http.StatusNoContent {
+		w.WriteHeader(code)
+		return code
+	}
+
+	WriteObjectNegotiated(s, gv, w, req, code, status)
+	return code
+}
+
+// errorJSONFatal renders an error to the response, and if codec fails will render plaintext.
+// Returns the HTTP status code of the error.
+func errorJSONFatal(err error, codec runtime.Encoder, w http.ResponseWriter) int {
+	utilruntime.HandleError(fmt.Errorf("apiserver was unable to write a JSON response: %v", err))
+	status := ErrorToAPIStatus(err)
+	code := int(status.Code)
+	output, err := runtime.Encode(codec, status)
+	if err != nil {
+		w.WriteHeader(code)
+		fmt.Fprintf(w, "%s: %s", status.Reason, status.Message)
+		return code
+	}
+	w.Header().Set("Content-Type", "application/json")
+	w.WriteHeader(code)
+	w.Write(output)
+	return code
+}
+
+// WriteRawJSON writes a non-API object in JSON.
+func WriteRawJSON(statusCode int, object interface{}, w http.ResponseWriter) {
+	output, err := json.MarshalIndent(object, "", "  ")
+	if err != nil {
+		http.Error(w, err.Error(), http.StatusInternalServerError)
+		return
+	}
+	w.Header().Set("Content-Type", "application/json")
+	w.WriteHeader(statusCode)
+	w.Write(output)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/rest.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/rest.go
new file mode 100644
index 0000000..d42c019
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/rest.go
@@ -0,0 +1,330 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package handlers
+
+import (
+	"context"
+	"encoding/hex"
+	"fmt"
+	"io/ioutil"
+	"net/http"
+	"net/url"
+	"time"
+
+	"github.com/golang/glog"
+
+	"k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/api/meta"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	metav1beta1 "k8s.io/apimachinery/pkg/apis/meta/v1beta1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
+	"k8s.io/apiserver/pkg/admission"
+	"k8s.io/apiserver/pkg/endpoints/handlers/responsewriters"
+	"k8s.io/apiserver/pkg/endpoints/metrics"
+	"k8s.io/apiserver/pkg/endpoints/request"
+	"k8s.io/apiserver/pkg/registry/rest"
+	openapiproto "k8s.io/kube-openapi/pkg/util/proto"
+)
+
+// RequestScope encapsulates common fields across all RESTful handler methods.
+type RequestScope struct {
+	Namer ScopeNamer
+
+	Serializer runtime.NegotiatedSerializer
+	runtime.ParameterCodec
+
+	Creater         runtime.ObjectCreater
+	Convertor       runtime.ObjectConvertor
+	Defaulter       runtime.ObjectDefaulter
+	Typer           runtime.ObjectTyper
+	UnsafeConvertor runtime.ObjectConvertor
+
+	TableConvertor rest.TableConvertor
+	OpenAPISchema  openapiproto.Schema
+
+	Resource    schema.GroupVersionResource
+	Kind        schema.GroupVersionKind
+	Subresource string
+
+	MetaGroupVersion schema.GroupVersion
+}
+
+func (scope *RequestScope) err(err error, w http.ResponseWriter, req *http.Request) {
+	responsewriters.ErrorNegotiated(err, scope.Serializer, scope.Kind.GroupVersion(), w, req)
+}
+
+func (scope *RequestScope) AllowsConversion(gvk schema.GroupVersionKind) bool {
+	// TODO: this is temporary, replace with an abstraction calculated at endpoint installation time
+	if gvk.GroupVersion() == metav1beta1.SchemeGroupVersion {
+		switch gvk.Kind {
+		case "Table":
+			return scope.TableConvertor != nil
+		case "PartialObjectMetadata", "PartialObjectMetadataList":
+			// TODO: should delineate between lists and non-list endpoints
+			return true
+		default:
+			return false
+		}
+	}
+	return false
+}
+
+func (scope *RequestScope) AllowsServerVersion(version string) bool {
+	return version == scope.MetaGroupVersion.Version
+}
+
+func (scope *RequestScope) AllowsStreamSchema(s string) bool {
+	return s == "watch"
+}
+
+// ConnectResource returns a function that handles a connect request on a rest.Storage object.
+func ConnectResource(connecter rest.Connecter, scope RequestScope, admit admission.Interface, restPath string, isSubresource bool) http.HandlerFunc {
+	return func(w http.ResponseWriter, req *http.Request) {
+		namespace, name, err := scope.Namer.Name(req)
+		if err != nil {
+			scope.err(err, w, req)
+			return
+		}
+		ctx := req.Context()
+		ctx = request.WithNamespace(ctx, namespace)
+		ae := request.AuditEventFrom(ctx)
+		admit = admission.WithAudit(admit, ae)
+
+		opts, subpath, subpathKey := connecter.NewConnectOptions()
+		if err := getRequestOptions(req, scope, opts, subpath, subpathKey, isSubresource); err != nil {
+			err = errors.NewBadRequest(err.Error())
+			scope.err(err, w, req)
+			return
+		}
+		if admit != nil && admit.Handles(admission.Connect) {
+			connectRequest := &rest.ConnectRequest{
+				Name:         name,
+				Options:      opts,
+				ResourcePath: restPath,
+			}
+			userInfo, _ := request.UserFrom(ctx)
+			// TODO: remove the mutating admission here as soon as we have ported all plugin that handle CONNECT
+			if mutatingAdmission, ok := admit.(admission.MutationInterface); ok {
+				err = mutatingAdmission.Admit(admission.NewAttributesRecord(connectRequest, nil, scope.Kind, namespace, name, scope.Resource, scope.Subresource, admission.Connect, userInfo))
+				if err != nil {
+					scope.err(err, w, req)
+					return
+				}
+			}
+			if validatingAdmission, ok := admit.(admission.ValidationInterface); ok {
+				err = validatingAdmission.Validate(admission.NewAttributesRecord(connectRequest, nil, scope.Kind, namespace, name, scope.Resource, scope.Subresource, admission.Connect, userInfo))
+				if err != nil {
+					scope.err(err, w, req)
+					return
+				}
+			}
+		}
+		requestInfo, _ := request.RequestInfoFrom(ctx)
+		metrics.RecordLongRunning(req, requestInfo, func() {
+			handler, err := connecter.Connect(ctx, name, opts, &responder{scope: scope, req: req, w: w})
+			if err != nil {
+				scope.err(err, w, req)
+				return
+			}
+			handler.ServeHTTP(w, req)
+		})
+	}
+}
+
+// responder implements rest.Responder for assisting a connector in writing objects or errors.
+type responder struct {
+	scope RequestScope
+	req   *http.Request
+	w     http.ResponseWriter
+}
+
+func (r *responder) Object(statusCode int, obj runtime.Object) {
+	responsewriters.WriteObject(statusCode, r.scope.Kind.GroupVersion(), r.scope.Serializer, obj, r.w, r.req)
+}
+
+func (r *responder) Error(err error) {
+	r.scope.err(err, r.w, r.req)
+}
+
+// resultFunc is a function that returns a rest result and can be run in a goroutine
+type resultFunc func() (runtime.Object, error)
+
+// finishRequest makes a given resultFunc asynchronous and handles errors returned by the response.
+// An api.Status object with status != success is considered an "error", which interrupts the normal response flow.
+func finishRequest(timeout time.Duration, fn resultFunc) (result runtime.Object, err error) {
+	// these channels need to be buffered to prevent the goroutine below from hanging indefinitely
+	// when the select statement reads something other than the one the goroutine sends on.
+	ch := make(chan runtime.Object, 1)
+	errCh := make(chan error, 1)
+	panicCh := make(chan interface{}, 1)
+	go func() {
+		// panics don't cross goroutine boundaries, so we have to handle ourselves
+		defer utilruntime.HandleCrash(func(panicReason interface{}) {
+			// Propagate to parent goroutine
+			panicCh <- panicReason
+		})
+
+		if result, err := fn(); err != nil {
+			errCh <- err
+		} else {
+			ch <- result
+		}
+	}()
+
+	select {
+	case result = <-ch:
+		if status, ok := result.(*metav1.Status); ok {
+			if status.Status != metav1.StatusSuccess {
+				return nil, errors.FromObject(status)
+			}
+		}
+		return result, nil
+	case err = <-errCh:
+		return nil, err
+	case p := <-panicCh:
+		panic(p)
+	case <-time.After(timeout):
+		return nil, errors.NewTimeoutError("request did not complete within allowed duration", 0)
+	}
+}
+
+// transformDecodeError adds additional information when a decode fails.
+func transformDecodeError(typer runtime.ObjectTyper, baseErr error, into runtime.Object, gvk *schema.GroupVersionKind, body []byte) error {
+	objGVKs, _, err := typer.ObjectKinds(into)
+	if err != nil {
+		return err
+	}
+	objGVK := objGVKs[0]
+	if gvk != nil && len(gvk.Kind) > 0 {
+		return errors.NewBadRequest(fmt.Sprintf("%s in version %q cannot be handled as a %s: %v", gvk.Kind, gvk.Version, objGVK.Kind, baseErr))
+	}
+	summary := summarizeData(body, 30)
+	return errors.NewBadRequest(fmt.Sprintf("the object provided is unrecognized (must be of type %s): %v (%s)", objGVK.Kind, baseErr, summary))
+}
+
+// setSelfLink sets the self link of an object (or the child items in a list) to the base URL of the request
+// plus the path and query generated by the provided linkFunc
+func setSelfLink(obj runtime.Object, requestInfo *request.RequestInfo, namer ScopeNamer) error {
+	// TODO: SelfLink generation should return a full URL?
+	uri, err := namer.GenerateLink(requestInfo, obj)
+	if err != nil {
+		return nil
+	}
+
+	return namer.SetSelfLink(obj, uri)
+}
+
+func hasUID(obj runtime.Object) (bool, error) {
+	if obj == nil {
+		return false, nil
+	}
+	accessor, err := meta.Accessor(obj)
+	if err != nil {
+		return false, errors.NewInternalError(err)
+	}
+	if len(accessor.GetUID()) == 0 {
+		return false, nil
+	}
+	return true, nil
+}
+
+// checkName checks the provided name against the request
+func checkName(obj runtime.Object, name, namespace string, namer ScopeNamer) error {
+	objNamespace, objName, err := namer.ObjectName(obj)
+	if err != nil {
+		return errors.NewBadRequest(fmt.Sprintf(
+			"the name of the object (%s based on URL) was undeterminable: %v", name, err))
+	}
+	if objName != name {
+		return errors.NewBadRequest(fmt.Sprintf(
+			"the name of the object (%s) does not match the name on the URL (%s)", objName, name))
+	}
+	if len(namespace) > 0 {
+		if len(objNamespace) > 0 && objNamespace != namespace {
+			return errors.NewBadRequest(fmt.Sprintf(
+				"the namespace of the object (%s) does not match the namespace on the request (%s)", objNamespace, namespace))
+		}
+	}
+
+	return nil
+}
+
+// setListSelfLink sets the self link of a list to the base URL, then sets the self links
+// on all child objects returned. Returns the number of items in the list.
+func setListSelfLink(obj runtime.Object, ctx context.Context, req *http.Request, namer ScopeNamer) (int, error) {
+	if !meta.IsListType(obj) {
+		return 0, nil
+	}
+
+	uri, err := namer.GenerateListLink(req)
+	if err != nil {
+		return 0, err
+	}
+	if err := namer.SetSelfLink(obj, uri); err != nil {
+		glog.V(4).Infof("Unable to set self link on object: %v", err)
+	}
+	requestInfo, ok := request.RequestInfoFrom(ctx)
+	if !ok {
+		return 0, fmt.Errorf("missing requestInfo")
+	}
+
+	count := 0
+	err = meta.EachListItem(obj, func(obj runtime.Object) error {
+		count++
+		return setSelfLink(obj, requestInfo, namer)
+	})
+	return count, err
+}
+
+func summarizeData(data []byte, maxLength int) string {
+	switch {
+	case len(data) == 0:
+		return "<empty>"
+	case data[0] == '{':
+		if len(data) > maxLength {
+			return string(data[:maxLength]) + " ..."
+		}
+		return string(data)
+	default:
+		if len(data) > maxLength {
+			return hex.EncodeToString(data[:maxLength]) + " ..."
+		}
+		return hex.EncodeToString(data)
+	}
+}
+
+func readBody(req *http.Request) ([]byte, error) {
+	defer req.Body.Close()
+	return ioutil.ReadAll(req.Body)
+}
+
+func parseTimeout(str string) time.Duration {
+	if str != "" {
+		timeout, err := time.ParseDuration(str)
+		if err == nil {
+			return timeout
+		}
+		glog.Errorf("Failed to parse %q: %v", str, err)
+	}
+	return 30 * time.Second
+}
+
+func isDryRun(url *url.URL) bool {
+	return len(url.Query()["dryRun"]) != 0
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/update.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/update.go
new file mode 100644
index 0000000..de24277
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/update.go
@@ -0,0 +1,142 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package handlers
+
+import (
+	"context"
+	"fmt"
+	"net/http"
+	"time"
+
+	"k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apiserver/pkg/admission"
+	"k8s.io/apiserver/pkg/audit"
+	"k8s.io/apiserver/pkg/endpoints/handlers/negotiation"
+	"k8s.io/apiserver/pkg/endpoints/request"
+	"k8s.io/apiserver/pkg/registry/rest"
+	utiltrace "k8s.io/apiserver/pkg/util/trace"
+)
+
+// UpdateResource returns a function that will handle a resource update
+func UpdateResource(r rest.Updater, scope RequestScope, admit admission.Interface) http.HandlerFunc {
+	return func(w http.ResponseWriter, req *http.Request) {
+		// For performance tracking purposes.
+		trace := utiltrace.New("Update " + req.URL.Path)
+		defer trace.LogIfLong(500 * time.Millisecond)
+
+		if isDryRun(req.URL) {
+			scope.err(errors.NewBadRequest("dryRun is not supported yet"), w, req)
+			return
+		}
+
+		// TODO: we either want to remove timeout or document it (if we document, move timeout out of this function and declare it in api_installer)
+		timeout := parseTimeout(req.URL.Query().Get("timeout"))
+
+		namespace, name, err := scope.Namer.Name(req)
+		if err != nil {
+			scope.err(err, w, req)
+			return
+		}
+		ctx := req.Context()
+		ctx = request.WithNamespace(ctx, namespace)
+
+		body, err := readBody(req)
+		if err != nil {
+			scope.err(err, w, req)
+			return
+		}
+
+		s, err := negotiation.NegotiateInputSerializer(req, false, scope.Serializer)
+		if err != nil {
+			scope.err(err, w, req)
+			return
+		}
+		defaultGVK := scope.Kind
+		original := r.New()
+		trace.Step("About to convert to expected version")
+		decoder := scope.Serializer.DecoderToVersion(s.Serializer, schema.GroupVersion{Group: defaultGVK.Group, Version: runtime.APIVersionInternal})
+		obj, gvk, err := decoder.Decode(body, &defaultGVK, original)
+		if err != nil {
+			err = transformDecodeError(scope.Typer, err, original, gvk, body)
+			scope.err(err, w, req)
+			return
+		}
+		if gvk.GroupVersion() != defaultGVK.GroupVersion() {
+			err = errors.NewBadRequest(fmt.Sprintf("the API version in the data (%s) does not match the expected API version (%s)", gvk.GroupVersion(), defaultGVK.GroupVersion()))
+			scope.err(err, w, req)
+			return
+		}
+		trace.Step("Conversion done")
+
+		ae := request.AuditEventFrom(ctx)
+		audit.LogRequestObject(ae, obj, scope.Resource, scope.Subresource, scope.Serializer)
+		admit = admission.WithAudit(admit, ae)
+
+		if err := checkName(obj, name, namespace, scope.Namer); err != nil {
+			scope.err(err, w, req)
+			return
+		}
+
+		userInfo, _ := request.UserFrom(ctx)
+		staticAdmissionAttributes := admission.NewAttributesRecord(nil, nil, scope.Kind, namespace, name, scope.Resource, scope.Subresource, admission.Update, userInfo)
+		var transformers []rest.TransformFunc
+		if mutatingAdmission, ok := admit.(admission.MutationInterface); ok && mutatingAdmission.Handles(admission.Update) {
+			transformers = append(transformers, func(ctx context.Context, newObj, oldObj runtime.Object) (runtime.Object, error) {
+				return newObj, mutatingAdmission.Admit(admission.NewAttributesRecord(newObj, oldObj, scope.Kind, namespace, name, scope.Resource, scope.Subresource, admission.Update, userInfo))
+			})
+		}
+
+		trace.Step("About to store object in database")
+		wasCreated := false
+		result, err := finishRequest(timeout, func() (runtime.Object, error) {
+			obj, created, err := r.Update(
+				ctx,
+				name,
+				rest.DefaultUpdatedObjectInfo(obj, transformers...),
+				rest.AdmissionToValidateObjectFunc(admit, staticAdmissionAttributes),
+				rest.AdmissionToValidateObjectUpdateFunc(admit, staticAdmissionAttributes),
+			)
+			wasCreated = created
+			return obj, err
+		})
+		if err != nil {
+			scope.err(err, w, req)
+			return
+		}
+		trace.Step("Object stored in database")
+
+		requestInfo, ok := request.RequestInfoFrom(ctx)
+		if !ok {
+			scope.err(fmt.Errorf("missing requestInfo"), w, req)
+			return
+		}
+		if err := setSelfLink(result, requestInfo, scope.Namer); err != nil {
+			scope.err(err, w, req)
+			return
+		}
+		trace.Step("Self-link added")
+
+		status := http.StatusOK
+		if wasCreated {
+			status = http.StatusCreated
+		}
+
+		transformResponseObject(ctx, scope, req, w, status, result)
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/watch.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/watch.go
new file mode 100755
index 0000000..c1bc984
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/handlers/watch.go
@@ -0,0 +1,324 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package handlers
+
+import (
+	"bytes"
+	"fmt"
+	"net/http"
+	"reflect"
+	"time"
+
+	"k8s.io/apimachinery/pkg/api/errors"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/serializer/streaming"
+	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
+	"k8s.io/apimachinery/pkg/watch"
+	"k8s.io/apiserver/pkg/endpoints/handlers/negotiation"
+	"k8s.io/apiserver/pkg/endpoints/metrics"
+	"k8s.io/apiserver/pkg/endpoints/request"
+	"k8s.io/apiserver/pkg/server/httplog"
+	"k8s.io/apiserver/pkg/util/wsstream"
+
+	"golang.org/x/net/websocket"
+)
+
+// nothing will ever be sent down this channel
+var neverExitWatch <-chan time.Time = make(chan time.Time)
+
+// timeoutFactory abstracts watch timeout logic for testing
+type TimeoutFactory interface {
+	TimeoutCh() (<-chan time.Time, func() bool)
+}
+
+// realTimeoutFactory implements timeoutFactory
+type realTimeoutFactory struct {
+	timeout time.Duration
+}
+
+// TimeoutCh returns a channel which will receive something when the watch times out,
+// and a cleanup function to call when this happens.
+func (w *realTimeoutFactory) TimeoutCh() (<-chan time.Time, func() bool) {
+	if w.timeout == 0 {
+		return neverExitWatch, func() bool { return false }
+	}
+	t := time.NewTimer(w.timeout)
+	return t.C, t.Stop
+}
+
+// serveWatch handles serving requests to the server
+// TODO: the functionality in this method and in WatchServer.Serve is not cleanly decoupled.
+func serveWatch(watcher watch.Interface, scope RequestScope, req *http.Request, w http.ResponseWriter, timeout time.Duration) {
+	// negotiate for the stream serializer
+	serializer, err := negotiation.NegotiateOutputStreamSerializer(req, scope.Serializer)
+	if err != nil {
+		scope.err(err, w, req)
+		return
+	}
+	framer := serializer.StreamSerializer.Framer
+	streamSerializer := serializer.StreamSerializer.Serializer
+	embedded := serializer.Serializer
+	if framer == nil {
+		scope.err(fmt.Errorf("no framer defined for %q available for embedded encoding", serializer.MediaType), w, req)
+		return
+	}
+	encoder := scope.Serializer.EncoderForVersion(streamSerializer, scope.Kind.GroupVersion())
+
+	useTextFraming := serializer.EncodesAsText
+
+	// find the embedded serializer matching the media type
+	embeddedEncoder := scope.Serializer.EncoderForVersion(embedded, scope.Kind.GroupVersion())
+
+	// TODO: next step, get back mediaTypeOptions from negotiate and return the exact value here
+	mediaType := serializer.MediaType
+	if mediaType != runtime.ContentTypeJSON {
+		mediaType += ";stream=watch"
+	}
+
+	ctx := req.Context()
+	requestInfo, ok := request.RequestInfoFrom(ctx)
+	if !ok {
+		scope.err(fmt.Errorf("missing requestInfo"), w, req)
+		return
+	}
+
+	server := &WatchServer{
+		Watching: watcher,
+		Scope:    scope,
+
+		UseTextFraming:  useTextFraming,
+		MediaType:       mediaType,
+		Framer:          framer,
+		Encoder:         encoder,
+		EmbeddedEncoder: embeddedEncoder,
+		Fixup: func(obj runtime.Object) {
+			if err := setSelfLink(obj, requestInfo, scope.Namer); err != nil {
+				utilruntime.HandleError(fmt.Errorf("failed to set link for object %v: %v", reflect.TypeOf(obj), err))
+			}
+		},
+
+		TimeoutFactory: &realTimeoutFactory{timeout},
+	}
+
+	server.ServeHTTP(w, req)
+}
+
+// WatchServer serves a watch.Interface over a websocket or vanilla HTTP.
+type WatchServer struct {
+	Watching watch.Interface
+	Scope    RequestScope
+
+	// true if websocket messages should use text framing (as opposed to binary framing)
+	UseTextFraming bool
+	// the media type this watch is being served with
+	MediaType string
+	// used to frame the watch stream
+	Framer runtime.Framer
+	// used to encode the watch stream event itself
+	Encoder runtime.Encoder
+	// used to encode the nested object in the watch stream
+	EmbeddedEncoder runtime.Encoder
+	Fixup           func(runtime.Object)
+
+	TimeoutFactory TimeoutFactory
+}
+
+// ServeHTTP serves a series of encoded events via HTTP with Transfer-Encoding: chunked
+// or over a websocket connection.
+func (s *WatchServer) ServeHTTP(w http.ResponseWriter, req *http.Request) {
+	kind := s.Scope.Kind
+	metrics.RegisteredWatchers.WithLabelValues(kind.Group, kind.Version, kind.Kind).Inc()
+	defer metrics.RegisteredWatchers.WithLabelValues(kind.Group, kind.Version, kind.Kind).Dec()
+
+	w = httplog.Unlogged(w)
+
+	if wsstream.IsWebSocketRequest(req) {
+		w.Header().Set("Content-Type", s.MediaType)
+		websocket.Handler(s.HandleWS).ServeHTTP(w, req)
+		return
+	}
+
+	cn, ok := w.(http.CloseNotifier)
+	if !ok {
+		err := fmt.Errorf("unable to start watch - can't get http.CloseNotifier: %#v", w)
+		utilruntime.HandleError(err)
+		s.Scope.err(errors.NewInternalError(err), w, req)
+		return
+	}
+	flusher, ok := w.(http.Flusher)
+	if !ok {
+		err := fmt.Errorf("unable to start watch - can't get http.Flusher: %#v", w)
+		utilruntime.HandleError(err)
+		s.Scope.err(errors.NewInternalError(err), w, req)
+		return
+	}
+
+	framer := s.Framer.NewFrameWriter(w)
+	if framer == nil {
+		// programmer error
+		err := fmt.Errorf("no stream framing support is available for media type %q", s.MediaType)
+		utilruntime.HandleError(err)
+		s.Scope.err(errors.NewBadRequest(err.Error()), w, req)
+		return
+	}
+	e := streaming.NewEncoder(framer, s.Encoder)
+
+	// ensure the connection times out
+	timeoutCh, cleanup := s.TimeoutFactory.TimeoutCh()
+	defer cleanup()
+	defer s.Watching.Stop()
+
+	// begin the stream
+	w.Header().Set("Content-Type", s.MediaType)
+	w.Header().Set("Transfer-Encoding", "chunked")
+	w.WriteHeader(http.StatusOK)
+	flusher.Flush()
+
+	var unknown runtime.Unknown
+	internalEvent := &metav1.InternalEvent{}
+	buf := &bytes.Buffer{}
+	ch := s.Watching.ResultChan()
+	for {
+		select {
+		case <-cn.CloseNotify():
+			return
+		case <-timeoutCh:
+			return
+		case event, ok := <-ch:
+			if !ok {
+				// End of results.
+				return
+			}
+
+			obj := event.Object
+			s.Fixup(obj)
+			if err := s.EmbeddedEncoder.Encode(obj, buf); err != nil {
+				// unexpected error
+				utilruntime.HandleError(fmt.Errorf("unable to encode watch object: %v", err))
+				return
+			}
+
+			// ContentType is not required here because we are defaulting to the serializer
+			// type
+			unknown.Raw = buf.Bytes()
+			event.Object = &unknown
+
+			// create the external type directly and encode it.  Clients will only recognize the serialization we provide.
+			// The internal event is being reused, not reallocated so its just a few extra assignments to do it this way
+			// and we get the benefit of using conversion functions which already have to stay in sync
+			outEvent := &metav1.WatchEvent{}
+			*internalEvent = metav1.InternalEvent(event)
+			err := metav1.Convert_versioned_InternalEvent_to_versioned_Event(internalEvent, outEvent, nil)
+			if err != nil {
+				utilruntime.HandleError(fmt.Errorf("unable to convert watch object: %v", err))
+				// client disconnect.
+				return
+			}
+			if err := e.Encode(outEvent); err != nil {
+				utilruntime.HandleError(fmt.Errorf("unable to encode watch object: %v (%#v)", err, e))
+				// client disconnect.
+				return
+			}
+			if len(ch) == 0 {
+				flusher.Flush()
+			}
+
+			buf.Reset()
+		}
+	}
+}
+
+// HandleWS implements a websocket handler.
+func (s *WatchServer) HandleWS(ws *websocket.Conn) {
+	defer ws.Close()
+	done := make(chan struct{})
+
+	go func() {
+		defer utilruntime.HandleCrash()
+		// This blocks until the connection is closed.
+		// Client should not send anything.
+		wsstream.IgnoreReceives(ws, 0)
+		// Once the client closes, we should also close
+		close(done)
+	}()
+
+	var unknown runtime.Unknown
+	internalEvent := &metav1.InternalEvent{}
+	buf := &bytes.Buffer{}
+	streamBuf := &bytes.Buffer{}
+	ch := s.Watching.ResultChan()
+	for {
+		select {
+		case <-done:
+			s.Watching.Stop()
+			return
+		case event, ok := <-ch:
+			if !ok {
+				// End of results.
+				return
+			}
+			obj := event.Object
+			s.Fixup(obj)
+			if err := s.EmbeddedEncoder.Encode(obj, buf); err != nil {
+				// unexpected error
+				utilruntime.HandleError(fmt.Errorf("unable to encode watch object: %v", err))
+				return
+			}
+
+			// ContentType is not required here because we are defaulting to the serializer
+			// type
+			unknown.Raw = buf.Bytes()
+			event.Object = &unknown
+
+			// the internal event will be versioned by the encoder
+			// create the external type directly and encode it.  Clients will only recognize the serialization we provide.
+			// The internal event is being reused, not reallocated so its just a few extra assignments to do it this way
+			// and we get the benefit of using conversion functions which already have to stay in sync
+			outEvent := &metav1.WatchEvent{}
+			*internalEvent = metav1.InternalEvent(event)
+			err := metav1.Convert_versioned_InternalEvent_to_versioned_Event(internalEvent, outEvent, nil)
+			if err != nil {
+				utilruntime.HandleError(fmt.Errorf("unable to convert watch object: %v", err))
+				// client disconnect.
+				s.Watching.Stop()
+				return
+			}
+			if err := s.Encoder.Encode(outEvent, streamBuf); err != nil {
+				// encoding error
+				utilruntime.HandleError(fmt.Errorf("unable to encode event: %v", err))
+				s.Watching.Stop()
+				return
+			}
+			if s.UseTextFraming {
+				if err := websocket.Message.Send(ws, streamBuf.String()); err != nil {
+					// Client disconnect.
+					s.Watching.Stop()
+					return
+				}
+			} else {
+				if err := websocket.Message.Send(ws, streamBuf.Bytes()); err != nil {
+					// Client disconnect.
+					s.Watching.Stop()
+					return
+				}
+			}
+			buf.Reset()
+			streamBuf.Reset()
+		}
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/installer.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/installer.go
new file mode 100644
index 0000000..3edd09d
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/installer.go
@@ -0,0 +1,1064 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+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.
+*/
+
+package endpoints
+
+import (
+	"fmt"
+	"net/http"
+	gpath "path"
+	"reflect"
+	"sort"
+	"strings"
+	"time"
+	"unicode"
+
+	restful "github.com/emicklei/go-restful"
+
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/conversion"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apimachinery/pkg/types"
+	"k8s.io/apiserver/pkg/admission"
+	"k8s.io/apiserver/pkg/endpoints/handlers"
+	"k8s.io/apiserver/pkg/endpoints/handlers/negotiation"
+	"k8s.io/apiserver/pkg/endpoints/metrics"
+	"k8s.io/apiserver/pkg/registry/rest"
+	genericfilters "k8s.io/apiserver/pkg/server/filters"
+	utilopenapi "k8s.io/apiserver/pkg/util/openapi"
+	openapibuilder "k8s.io/kube-openapi/pkg/builder"
+)
+
+const (
+	ROUTE_META_GVK    = "x-kubernetes-group-version-kind"
+	ROUTE_META_ACTION = "x-kubernetes-action"
+)
+
+type APIInstaller struct {
+	group                        *APIGroupVersion
+	prefix                       string // Path prefix where API resources are to be registered.
+	minRequestTimeout            time.Duration
+	enableAPIResponseCompression bool
+}
+
+// Struct capturing information about an action ("GET", "POST", "WATCH", "PROXY", etc).
+type action struct {
+	Verb          string               // Verb identifying the action ("GET", "POST", "WATCH", "PROXY", etc).
+	Path          string               // The path of the action
+	Params        []*restful.Parameter // List of parameters associated with the action.
+	Namer         handlers.ScopeNamer
+	AllNamespaces bool // true iff the action is namespaced but works on aggregate result for all namespaces
+}
+
+// An interface to see if one storage supports override its default verb for monitoring
+type StorageMetricsOverride interface {
+	// OverrideMetricsVerb gives a storage object an opportunity to override the verb reported to the metrics endpoint
+	OverrideMetricsVerb(oldVerb string) (newVerb string)
+}
+
+// An interface to see if an object supports swagger documentation as a method
+type documentable interface {
+	SwaggerDoc() map[string]string
+}
+
+// toDiscoveryKubeVerb maps an action.Verb to the logical kube verb, used for discovery
+var toDiscoveryKubeVerb = map[string]string{
+	"CONNECT":          "", // do not list in discovery.
+	"DELETE":           "delete",
+	"DELETECOLLECTION": "deletecollection",
+	"GET":              "get",
+	"LIST":             "list",
+	"PATCH":            "patch",
+	"POST":             "create",
+	"PROXY":            "proxy",
+	"PUT":              "update",
+	"WATCH":            "watch",
+	"WATCHLIST":        "watch",
+}
+
+// Install handlers for API resources.
+func (a *APIInstaller) Install() ([]metav1.APIResource, *restful.WebService, []error) {
+	var apiResources []metav1.APIResource
+	var errors []error
+	ws := a.newWebService()
+
+	// Register the paths in a deterministic (sorted) order to get a deterministic swagger spec.
+	paths := make([]string, len(a.group.Storage))
+	var i int = 0
+	for path := range a.group.Storage {
+		paths[i] = path
+		i++
+	}
+	sort.Strings(paths)
+	for _, path := range paths {
+		apiResource, err := a.registerResourceHandlers(path, a.group.Storage[path], ws)
+		if err != nil {
+			errors = append(errors, fmt.Errorf("error in registering resource: %s, %v", path, err))
+		}
+		if apiResource != nil {
+			apiResources = append(apiResources, *apiResource)
+		}
+	}
+	return apiResources, ws, errors
+}
+
+// newWebService creates a new restful webservice with the api installer's prefix and version.
+func (a *APIInstaller) newWebService() *restful.WebService {
+	ws := new(restful.WebService)
+	ws.Path(a.prefix)
+	// a.prefix contains "prefix/group/version"
+	ws.Doc("API at " + a.prefix)
+	// Backwards compatibility, we accepted objects with empty content-type at V1.
+	// If we stop using go-restful, we can default empty content-type to application/json on an
+	// endpoint by endpoint basis
+	ws.Consumes("*/*")
+	mediaTypes, streamMediaTypes := negotiation.MediaTypesForSerializer(a.group.Serializer)
+	ws.Produces(append(mediaTypes, streamMediaTypes...)...)
+	ws.ApiVersion(a.group.GroupVersion.String())
+
+	return ws
+}
+
+// getResourceKind returns the external group version kind registered for the given storage
+// object. If the storage object is a subresource and has an override supplied for it, it returns
+// the group version kind supplied in the override.
+func (a *APIInstaller) getResourceKind(path string, storage rest.Storage) (schema.GroupVersionKind, error) {
+	// Let the storage tell us exactly what GVK it has
+	if gvkProvider, ok := storage.(rest.GroupVersionKindProvider); ok {
+		return gvkProvider.GroupVersionKind(a.group.GroupVersion), nil
+	}
+
+	object := storage.New()
+	fqKinds, _, err := a.group.Typer.ObjectKinds(object)
+	if err != nil {
+		return schema.GroupVersionKind{}, err
+	}
+
+	// a given go type can have multiple potential fully qualified kinds.  Find the one that corresponds with the group
+	// we're trying to register here
+	fqKindToRegister := schema.GroupVersionKind{}
+	for _, fqKind := range fqKinds {
+		if fqKind.Group == a.group.GroupVersion.Group {
+			fqKindToRegister = a.group.GroupVersion.WithKind(fqKind.Kind)
+			break
+		}
+	}
+	if fqKindToRegister.Empty() {
+		return schema.GroupVersionKind{}, fmt.Errorf("unable to locate fully qualified kind for %v: found %v when registering for %v", reflect.TypeOf(object), fqKinds, a.group.GroupVersion)
+	}
+
+	// group is guaranteed to match based on the check above
+	return fqKindToRegister, nil
+}
+
+func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storage, ws *restful.WebService) (*metav1.APIResource, error) {
+	admit := a.group.Admit
+
+	optionsExternalVersion := a.group.GroupVersion
+	if a.group.OptionsExternalVersion != nil {
+		optionsExternalVersion = *a.group.OptionsExternalVersion
+	}
+
+	resource, subresource, err := splitSubresource(path)
+	if err != nil {
+		return nil, err
+	}
+
+	fqKindToRegister, err := a.getResourceKind(path, storage)
+	if err != nil {
+		return nil, err
+	}
+
+	versionedPtr, err := a.group.Creater.New(fqKindToRegister)
+	if err != nil {
+		return nil, err
+	}
+	defaultVersionedObject := indirectArbitraryPointer(versionedPtr)
+	kind := fqKindToRegister.Kind
+	isSubresource := len(subresource) > 0
+
+	// If there is a subresource, namespace scoping is defined by the parent resource
+	namespaceScoped := true
+	if isSubresource {
+		parentStorage, ok := a.group.Storage[resource]
+		if !ok {
+			return nil, fmt.Errorf("missing parent storage: %q", resource)
+		}
+		scoper, ok := parentStorage.(rest.Scoper)
+		if !ok {
+			return nil, fmt.Errorf("%q must implement scoper", resource)
+		}
+		namespaceScoped = scoper.NamespaceScoped()
+
+	} else {
+		scoper, ok := storage.(rest.Scoper)
+		if !ok {
+			return nil, fmt.Errorf("%q must implement scoper", resource)
+		}
+		namespaceScoped = scoper.NamespaceScoped()
+	}
+
+	// what verbs are supported by the storage, used to know what verbs we support per path
+	creater, isCreater := storage.(rest.Creater)
+	namedCreater, isNamedCreater := storage.(rest.NamedCreater)
+	lister, isLister := storage.(rest.Lister)
+	getter, isGetter := storage.(rest.Getter)
+	getterWithOptions, isGetterWithOptions := storage.(rest.GetterWithOptions)
+	gracefulDeleter, isGracefulDeleter := storage.(rest.GracefulDeleter)
+	collectionDeleter, isCollectionDeleter := storage.(rest.CollectionDeleter)
+	updater, isUpdater := storage.(rest.Updater)
+	patcher, isPatcher := storage.(rest.Patcher)
+	watcher, isWatcher := storage.(rest.Watcher)
+	connecter, isConnecter := storage.(rest.Connecter)
+	storageMeta, isMetadata := storage.(rest.StorageMetadata)
+	if !isMetadata {
+		storageMeta = defaultStorageMetadata{}
+	}
+	exporter, isExporter := storage.(rest.Exporter)
+	if !isExporter {
+		exporter = nil
+	}
+
+	versionedExportOptions, err := a.group.Creater.New(optionsExternalVersion.WithKind("ExportOptions"))
+	if err != nil {
+		return nil, err
+	}
+
+	if isNamedCreater {
+		isCreater = true
+	}
+
+	var versionedList interface{}
+	if isLister {
+		list := lister.NewList()
+		listGVKs, _, err := a.group.Typer.ObjectKinds(list)
+		if err != nil {
+			return nil, err
+		}
+		versionedListPtr, err := a.group.Creater.New(a.group.GroupVersion.WithKind(listGVKs[0].Kind))
+		if err != nil {
+			return nil, err
+		}
+		versionedList = indirectArbitraryPointer(versionedListPtr)
+	}
+
+	versionedListOptions, err := a.group.Creater.New(optionsExternalVersion.WithKind("ListOptions"))
+	if err != nil {
+		return nil, err
+	}
+
+	var versionedDeleteOptions runtime.Object
+	var versionedDeleterObject interface{}
+	if isGracefulDeleter {
+		versionedDeleteOptions, err = a.group.Creater.New(optionsExternalVersion.WithKind("DeleteOptions"))
+		if err != nil {
+			return nil, err
+		}
+		versionedDeleterObject = indirectArbitraryPointer(versionedDeleteOptions)
+	}
+
+	versionedStatusPtr, err := a.group.Creater.New(optionsExternalVersion.WithKind("Status"))
+	if err != nil {
+		return nil, err
+	}
+	versionedStatus := indirectArbitraryPointer(versionedStatusPtr)
+	var (
+		getOptions             runtime.Object
+		versionedGetOptions    runtime.Object
+		getOptionsInternalKind schema.GroupVersionKind
+		getSubpath             bool
+	)
+	if isGetterWithOptions {
+		getOptions, getSubpath, _ = getterWithOptions.NewGetOptions()
+		getOptionsInternalKinds, _, err := a.group.Typer.ObjectKinds(getOptions)
+		if err != nil {
+			return nil, err
+		}
+		getOptionsInternalKind = getOptionsInternalKinds[0]
+		versionedGetOptions, err = a.group.Creater.New(a.group.GroupVersion.WithKind(getOptionsInternalKind.Kind))
+		if err != nil {
+			versionedGetOptions, err = a.group.Creater.New(optionsExternalVersion.WithKind(getOptionsInternalKind.Kind))
+			if err != nil {
+				return nil, err
+			}
+		}
+		isGetter = true
+	}
+
+	var versionedWatchEvent interface{}
+	if isWatcher {
+		versionedWatchEventPtr, err := a.group.Creater.New(a.group.GroupVersion.WithKind("WatchEvent"))
+		if err != nil {
+			return nil, err
+		}
+		versionedWatchEvent = indirectArbitraryPointer(versionedWatchEventPtr)
+	}
+
+	var (
+		connectOptions             runtime.Object
+		versionedConnectOptions    runtime.Object
+		connectOptionsInternalKind schema.GroupVersionKind
+		connectSubpath             bool
+	)
+	if isConnecter {
+		connectOptions, connectSubpath, _ = connecter.NewConnectOptions()
+		if connectOptions != nil {
+			connectOptionsInternalKinds, _, err := a.group.Typer.ObjectKinds(connectOptions)
+			if err != nil {
+				return nil, err
+			}
+
+			connectOptionsInternalKind = connectOptionsInternalKinds[0]
+			versionedConnectOptions, err = a.group.Creater.New(a.group.GroupVersion.WithKind(connectOptionsInternalKind.Kind))
+			if err != nil {
+				versionedConnectOptions, err = a.group.Creater.New(optionsExternalVersion.WithKind(connectOptionsInternalKind.Kind))
+				if err != nil {
+					return nil, err
+				}
+			}
+		}
+	}
+
+	allowWatchList := isWatcher && isLister // watching on lists is allowed only for kinds that support both watch and list.
+	nameParam := ws.PathParameter("name", "name of the "+kind).DataType("string")
+	pathParam := ws.PathParameter("path", "path to the resource").DataType("string")
+
+	params := []*restful.Parameter{}
+	actions := []action{}
+
+	var resourceKind string
+	kindProvider, ok := storage.(rest.KindProvider)
+	if ok {
+		resourceKind = kindProvider.Kind()
+	} else {
+		resourceKind = kind
+	}
+
+	tableProvider, _ := storage.(rest.TableConvertor)
+
+	var apiResource metav1.APIResource
+	// Get the list of actions for the given scope.
+	switch {
+	case !namespaceScoped:
+		// Handle non-namespace scoped resources like nodes.
+		resourcePath := resource
+		resourceParams := params
+		itemPath := resourcePath + "/{name}"
+		nameParams := append(params, nameParam)
+		proxyParams := append(nameParams, pathParam)
+		suffix := ""
+		if isSubresource {
+			suffix = "/" + subresource
+			itemPath = itemPath + suffix
+			resourcePath = itemPath
+			resourceParams = nameParams
+		}
+		apiResource.Name = path
+		apiResource.Namespaced = false
+		apiResource.Kind = resourceKind
+		namer := handlers.ContextBasedNaming{
+			SelfLinker:         a.group.Linker,
+			ClusterScoped:      true,
+			SelfLinkPathPrefix: gpath.Join(a.prefix, resource) + "/",
+			SelfLinkPathSuffix: suffix,
+		}
+
+		// Handler for standard REST verbs (GET, PUT, POST and DELETE).
+		// Add actions at the resource path: /api/apiVersion/resource
+		actions = appendIf(actions, action{"LIST", resourcePath, resourceParams, namer, false}, isLister)
+		actions = appendIf(actions, action{"POST", resourcePath, resourceParams, namer, false}, isCreater)
+		actions = appendIf(actions, action{"DELETECOLLECTION", resourcePath, resourceParams, namer, false}, isCollectionDeleter)
+		// DEPRECATED
+		actions = appendIf(actions, action{"WATCHLIST", "watch/" + resourcePath, resourceParams, namer, false}, allowWatchList)
+
+		// Add actions at the item path: /api/apiVersion/resource/{name}
+		actions = appendIf(actions, action{"GET", itemPath, nameParams, namer, false}, isGetter)
+		if getSubpath {
+			actions = appendIf(actions, action{"GET", itemPath + "/{path:*}", proxyParams, namer, false}, isGetter)
+		}
+		actions = appendIf(actions, action{"PUT", itemPath, nameParams, namer, false}, isUpdater)
+		actions = appendIf(actions, action{"PATCH", itemPath, nameParams, namer, false}, isPatcher)
+		actions = appendIf(actions, action{"DELETE", itemPath, nameParams, namer, false}, isGracefulDeleter)
+		actions = appendIf(actions, action{"WATCH", "watch/" + itemPath, nameParams, namer, false}, isWatcher)
+		actions = appendIf(actions, action{"CONNECT", itemPath, nameParams, namer, false}, isConnecter)
+		actions = appendIf(actions, action{"CONNECT", itemPath + "/{path:*}", proxyParams, namer, false}, isConnecter && connectSubpath)
+		break
+	default:
+		namespaceParamName := "namespaces"
+		// Handler for standard REST verbs (GET, PUT, POST and DELETE).
+		namespaceParam := ws.PathParameter("namespace", "object name and auth scope, such as for teams and projects").DataType("string")
+		namespacedPath := namespaceParamName + "/{" + "namespace" + "}/" + resource
+		namespaceParams := []*restful.Parameter{namespaceParam}
+
+		resourcePath := namespacedPath
+		resourceParams := namespaceParams
+		itemPath := namespacedPath + "/{name}"
+		nameParams := append(namespaceParams, nameParam)
+		proxyParams := append(nameParams, pathParam)
+		itemPathSuffix := ""
+		if isSubresource {
+			itemPathSuffix = "/" + subresource
+			itemPath = itemPath + itemPathSuffix
+			resourcePath = itemPath
+			resourceParams = nameParams
+		}
+		apiResource.Name = path
+		apiResource.Namespaced = true
+		apiResource.Kind = resourceKind
+		namer := handlers.ContextBasedNaming{
+			SelfLinker:         a.group.Linker,
+			ClusterScoped:      false,
+			SelfLinkPathPrefix: gpath.Join(a.prefix, namespaceParamName) + "/",
+			SelfLinkPathSuffix: itemPathSuffix,
+		}
+
+		actions = appendIf(actions, action{"LIST", resourcePath, resourceParams, namer, false}, isLister)
+		actions = appendIf(actions, action{"POST", resourcePath, resourceParams, namer, false}, isCreater)
+		actions = appendIf(actions, action{"DELETECOLLECTION", resourcePath, resourceParams, namer, false}, isCollectionDeleter)
+		// DEPRECATED
+		actions = appendIf(actions, action{"WATCHLIST", "watch/" + resourcePath, resourceParams, namer, false}, allowWatchList)
+
+		actions = appendIf(actions, action{"GET", itemPath, nameParams, namer, false}, isGetter)
+		if getSubpath {
+			actions = appendIf(actions, action{"GET", itemPath + "/{path:*}", proxyParams, namer, false}, isGetter)
+		}
+		actions = appendIf(actions, action{"PUT", itemPath, nameParams, namer, false}, isUpdater)
+		actions = appendIf(actions, action{"PATCH", itemPath, nameParams, namer, false}, isPatcher)
+		actions = appendIf(actions, action{"DELETE", itemPath, nameParams, namer, false}, isGracefulDeleter)
+		actions = appendIf(actions, action{"WATCH", "watch/" + itemPath, nameParams, namer, false}, isWatcher)
+		actions = appendIf(actions, action{"CONNECT", itemPath, nameParams, namer, false}, isConnecter)
+		actions = appendIf(actions, action{"CONNECT", itemPath + "/{path:*}", proxyParams, namer, false}, isConnecter && connectSubpath)
+
+		// list or post across namespace.
+		// For ex: LIST all pods in all namespaces by sending a LIST request at /api/apiVersion/pods.
+		// TODO: more strongly type whether a resource allows these actions on "all namespaces" (bulk delete)
+		if !isSubresource {
+			actions = appendIf(actions, action{"LIST", resource, params, namer, true}, isLister)
+			actions = appendIf(actions, action{"WATCHLIST", "watch/" + resource, params, namer, true}, allowWatchList)
+		}
+		break
+	}
+
+	// Create Routes for the actions.
+	// TODO: Add status documentation using Returns()
+	// Errors (see api/errors/errors.go as well as go-restful router):
+	// http.StatusNotFound, http.StatusMethodNotAllowed,
+	// http.StatusUnsupportedMediaType, http.StatusNotAcceptable,
+	// http.StatusBadRequest, http.StatusUnauthorized, http.StatusForbidden,
+	// http.StatusRequestTimeout, http.StatusConflict, http.StatusPreconditionFailed,
+	// http.StatusUnprocessableEntity, http.StatusInternalServerError,
+	// http.StatusServiceUnavailable
+	// and api error codes
+	// Note that if we specify a versioned Status object here, we may need to
+	// create one for the tests, also
+	// Success:
+	// http.StatusOK, http.StatusCreated, http.StatusAccepted, http.StatusNoContent
+	//
+	// test/integration/auth_test.go is currently the most comprehensive status code test
+
+	mediaTypes, streamMediaTypes := negotiation.MediaTypesForSerializer(a.group.Serializer)
+	allMediaTypes := append(mediaTypes, streamMediaTypes...)
+	ws.Produces(allMediaTypes...)
+
+	kubeVerbs := map[string]struct{}{}
+	reqScope := handlers.RequestScope{
+		Serializer:      a.group.Serializer,
+		ParameterCodec:  a.group.ParameterCodec,
+		Creater:         a.group.Creater,
+		Convertor:       a.group.Convertor,
+		Defaulter:       a.group.Defaulter,
+		Typer:           a.group.Typer,
+		UnsafeConvertor: a.group.UnsafeConvertor,
+
+		// TODO: Check for the interface on storage
+		TableConvertor: tableProvider,
+
+		// TODO: This seems wrong for cross-group subresources. It makes an assumption that a subresource and its parent are in the same group version. Revisit this.
+		Resource:    a.group.GroupVersion.WithResource(resource),
+		Subresource: subresource,
+		Kind:        fqKindToRegister,
+
+		MetaGroupVersion: metav1.SchemeGroupVersion,
+	}
+	if a.group.MetaGroupVersion != nil {
+		reqScope.MetaGroupVersion = *a.group.MetaGroupVersion
+	}
+	if a.group.OpenAPIConfig != nil {
+		openAPIDefinitions, err := openapibuilder.BuildOpenAPIDefinitionsForResource(defaultVersionedObject, a.group.OpenAPIConfig)
+		if err != nil {
+			return nil, fmt.Errorf("unable to build openapi definitions for %v: %v", fqKindToRegister, err)
+		}
+		reqScope.OpenAPISchema, err = utilopenapi.ToProtoSchema(openAPIDefinitions, fqKindToRegister)
+		if err != nil {
+			return nil, fmt.Errorf("unable to get openapi schema for %v: %v", fqKindToRegister, err)
+		}
+	}
+	for _, action := range actions {
+		producedObject := storageMeta.ProducesObject(action.Verb)
+		if producedObject == nil {
+			producedObject = defaultVersionedObject
+		}
+		reqScope.Namer = action.Namer
+
+		requestScope := "cluster"
+		var namespaced string
+		var operationSuffix string
+		if apiResource.Namespaced {
+			requestScope = "namespace"
+			namespaced = "Namespaced"
+		}
+		if strings.HasSuffix(action.Path, "/{path:*}") {
+			requestScope = "resource"
+			operationSuffix = operationSuffix + "WithPath"
+		}
+		if action.AllNamespaces {
+			requestScope = "cluster"
+			operationSuffix = operationSuffix + "ForAllNamespaces"
+			namespaced = ""
+		}
+
+		if kubeVerb, found := toDiscoveryKubeVerb[action.Verb]; found {
+			if len(kubeVerb) != 0 {
+				kubeVerbs[kubeVerb] = struct{}{}
+			}
+		} else {
+			return nil, fmt.Errorf("unknown action verb for discovery: %s", action.Verb)
+		}
+
+		routes := []*restful.RouteBuilder{}
+
+		// If there is a subresource, kind should be the parent's kind.
+		if isSubresource {
+			parentStorage, ok := a.group.Storage[resource]
+			if !ok {
+				return nil, fmt.Errorf("missing parent storage: %q", resource)
+			}
+
+			fqParentKind, err := a.getResourceKind(resource, parentStorage)
+			if err != nil {
+				return nil, err
+			}
+			kind = fqParentKind.Kind
+		}
+
+		verbOverrider, needOverride := storage.(StorageMetricsOverride)
+
+		switch action.Verb {
+		case "GET": // Get a resource.
+			var handler restful.RouteFunction
+			if isGetterWithOptions {
+				handler = restfulGetResourceWithOptions(getterWithOptions, reqScope, isSubresource)
+			} else {
+				handler = restfulGetResource(getter, exporter, reqScope)
+			}
+
+			if needOverride {
+				// need change the reported verb
+				handler = metrics.InstrumentRouteFunc(verbOverrider.OverrideMetricsVerb(action.Verb), resource, subresource, requestScope, handler)
+			} else {
+				handler = metrics.InstrumentRouteFunc(action.Verb, resource, subresource, requestScope, handler)
+			}
+
+			if a.enableAPIResponseCompression {
+				handler = genericfilters.RestfulWithCompression(handler)
+			}
+			doc := "read the specified " + kind
+			if isSubresource {
+				doc = "read " + subresource + " of the specified " + kind
+			}
+			route := ws.GET(action.Path).To(handler).
+				Doc(doc).
+				Param(ws.QueryParameter("pretty", "If 'true', then the output is pretty printed.")).
+				Operation("read"+namespaced+kind+strings.Title(subresource)+operationSuffix).
+				Produces(append(storageMeta.ProducesMIMETypes(action.Verb), mediaTypes...)...).
+				Returns(http.StatusOK, "OK", producedObject).
+				Writes(producedObject)
+			if isGetterWithOptions {
+				if err := addObjectParams(ws, route, versionedGetOptions); err != nil {
+					return nil, err
+				}
+			}
+			if isExporter {
+				if err := addObjectParams(ws, route, versionedExportOptions); err != nil {
+					return nil, err
+				}
+			}
+			addParams(route, action.Params)
+			routes = append(routes, route)
+		case "LIST": // List all resources of a kind.
+			doc := "list objects of kind " + kind
+			if isSubresource {
+				doc = "list " + subresource + " of objects of kind " + kind
+			}
+			handler := metrics.InstrumentRouteFunc(action.Verb, resource, subresource, requestScope, restfulListResource(lister, watcher, reqScope, false, a.minRequestTimeout))
+			if a.enableAPIResponseCompression {
+				handler = genericfilters.RestfulWithCompression(handler)
+			}
+			route := ws.GET(action.Path).To(handler).
+				Doc(doc).
+				Param(ws.QueryParameter("pretty", "If 'true', then the output is pretty printed.")).
+				Operation("list"+namespaced+kind+strings.Title(subresource)+operationSuffix).
+				Produces(append(storageMeta.ProducesMIMETypes(action.Verb), allMediaTypes...)...).
+				Returns(http.StatusOK, "OK", versionedList).
+				Writes(versionedList)
+			if err := addObjectParams(ws, route, versionedListOptions); err != nil {
+				return nil, err
+			}
+			switch {
+			case isLister && isWatcher:
+				doc := "list or watch objects of kind " + kind
+				if isSubresource {
+					doc = "list or watch " + subresource + " of objects of kind " + kind
+				}
+				route.Doc(doc)
+			case isWatcher:
+				doc := "watch objects of kind " + kind
+				if isSubresource {
+					doc = "watch " + subresource + "of objects of kind " + kind
+				}
+				route.Doc(doc)
+			}
+			addParams(route, action.Params)
+			routes = append(routes, route)
+		case "PUT": // Update a resource.
+			doc := "replace the specified " + kind
+			if isSubresource {
+				doc = "replace " + subresource + " of the specified " + kind
+			}
+			handler := metrics.InstrumentRouteFunc(action.Verb, resource, subresource, requestScope, restfulUpdateResource(updater, reqScope, admit))
+			route := ws.PUT(action.Path).To(handler).
+				Doc(doc).
+				Param(ws.QueryParameter("pretty", "If 'true', then the output is pretty printed.")).
+				Operation("replace"+namespaced+kind+strings.Title(subresource)+operationSuffix).
+				Produces(append(storageMeta.ProducesMIMETypes(action.Verb), mediaTypes...)...).
+				Returns(http.StatusOK, "OK", producedObject).
+				// TODO: in some cases, the API may return a v1.Status instead of the versioned object
+				// but currently go-restful can't handle multiple different objects being returned.
+				Returns(http.StatusCreated, "Created", producedObject).
+				Reads(defaultVersionedObject).
+				Writes(producedObject)
+			addParams(route, action.Params)
+			routes = append(routes, route)
+		case "PATCH": // Partially update a resource
+			doc := "partially update the specified " + kind
+			if isSubresource {
+				doc = "partially update " + subresource + " of the specified " + kind
+			}
+			supportedTypes := []string{
+				string(types.JSONPatchType),
+				string(types.MergePatchType),
+				string(types.StrategicMergePatchType),
+			}
+			handler := metrics.InstrumentRouteFunc(action.Verb, resource, subresource, requestScope, restfulPatchResource(patcher, reqScope, admit, supportedTypes))
+			route := ws.PATCH(action.Path).To(handler).
+				Doc(doc).
+				Param(ws.QueryParameter("pretty", "If 'true', then the output is pretty printed.")).
+				Consumes(string(types.JSONPatchType), string(types.MergePatchType), string(types.StrategicMergePatchType)).
+				Operation("patch"+namespaced+kind+strings.Title(subresource)+operationSuffix).
+				Produces(append(storageMeta.ProducesMIMETypes(action.Verb), mediaTypes...)...).
+				Returns(http.StatusOK, "OK", producedObject).
+				Reads(metav1.Patch{}).
+				Writes(producedObject)
+			addParams(route, action.Params)
+			routes = append(routes, route)
+		case "POST": // Create a resource.
+			var handler restful.RouteFunction
+			if isNamedCreater {
+				handler = restfulCreateNamedResource(namedCreater, reqScope, admit)
+			} else {
+				handler = restfulCreateResource(creater, reqScope, admit)
+			}
+			handler = metrics.InstrumentRouteFunc(action.Verb, resource, subresource, requestScope, handler)
+			article := getArticleForNoun(kind, " ")
+			doc := "create" + article + kind
+			if isSubresource {
+				doc = "create " + subresource + " of" + article + kind
+			}
+			route := ws.POST(action.Path).To(handler).
+				Doc(doc).
+				Param(ws.QueryParameter("pretty", "If 'true', then the output is pretty printed.")).
+				Operation("create"+namespaced+kind+strings.Title(subresource)+operationSuffix).
+				Produces(append(storageMeta.ProducesMIMETypes(action.Verb), mediaTypes...)...).
+				Returns(http.StatusOK, "OK", producedObject).
+				// TODO: in some cases, the API may return a v1.Status instead of the versioned object
+				// but currently go-restful can't handle multiple different objects being returned.
+				Returns(http.StatusCreated, "Created", producedObject).
+				Returns(http.StatusAccepted, "Accepted", producedObject).
+				Reads(defaultVersionedObject).
+				Writes(producedObject)
+			addParams(route, action.Params)
+			routes = append(routes, route)
+		case "DELETE": // Delete a resource.
+			article := getArticleForNoun(kind, " ")
+			doc := "delete" + article + kind
+			if isSubresource {
+				doc = "delete " + subresource + " of" + article + kind
+			}
+			handler := metrics.InstrumentRouteFunc(action.Verb, resource, subresource, requestScope, restfulDeleteResource(gracefulDeleter, isGracefulDeleter, reqScope, admit))
+			route := ws.DELETE(action.Path).To(handler).
+				Doc(doc).
+				Param(ws.QueryParameter("pretty", "If 'true', then the output is pretty printed.")).
+				Operation("delete"+namespaced+kind+strings.Title(subresource)+operationSuffix).
+				Produces(append(storageMeta.ProducesMIMETypes(action.Verb), mediaTypes...)...).
+				Writes(versionedStatus).
+				Returns(http.StatusOK, "OK", versionedStatus)
+			if isGracefulDeleter {
+				route.Reads(versionedDeleterObject)
+				if err := addObjectParams(ws, route, versionedDeleteOptions); err != nil {
+					return nil, err
+				}
+			}
+			addParams(route, action.Params)
+			routes = append(routes, route)
+		case "DELETECOLLECTION":
+			doc := "delete collection of " + kind
+			if isSubresource {
+				doc = "delete collection of " + subresource + " of a " + kind
+			}
+			handler := metrics.InstrumentRouteFunc(action.Verb, resource, subresource, requestScope, restfulDeleteCollection(collectionDeleter, isCollectionDeleter, reqScope, admit))
+			route := ws.DELETE(action.Path).To(handler).
+				Doc(doc).
+				Param(ws.QueryParameter("pretty", "If 'true', then the output is pretty printed.")).
+				Operation("deletecollection"+namespaced+kind+strings.Title(subresource)+operationSuffix).
+				Produces(append(storageMeta.ProducesMIMETypes(action.Verb), mediaTypes...)...).
+				Writes(versionedStatus).
+				Returns(http.StatusOK, "OK", versionedStatus)
+			if err := addObjectParams(ws, route, versionedListOptions); err != nil {
+				return nil, err
+			}
+			addParams(route, action.Params)
+			routes = append(routes, route)
+		// TODO: deprecated
+		case "WATCH": // Watch a resource.
+			doc := "watch changes to an object of kind " + kind
+			if isSubresource {
+				doc = "watch changes to " + subresource + " of an object of kind " + kind
+			}
+			handler := metrics.InstrumentRouteFunc(action.Verb, resource, subresource, requestScope, restfulListResource(lister, watcher, reqScope, true, a.minRequestTimeout))
+			route := ws.GET(action.Path).To(handler).
+				Doc(doc).
+				Param(ws.QueryParameter("pretty", "If 'true', then the output is pretty printed.")).
+				Operation("watch"+namespaced+kind+strings.Title(subresource)+operationSuffix).
+				Produces(allMediaTypes...).
+				Returns(http.StatusOK, "OK", versionedWatchEvent).
+				Writes(versionedWatchEvent)
+			if err := addObjectParams(ws, route, versionedListOptions); err != nil {
+				return nil, err
+			}
+			addParams(route, action.Params)
+			routes = append(routes, route)
+		// TODO: deprecated
+		case "WATCHLIST": // Watch all resources of a kind.
+			doc := "watch individual changes to a list of " + kind
+			if isSubresource {
+				doc = "watch individual changes to a list of " + subresource + " of " + kind
+			}
+			handler := metrics.InstrumentRouteFunc(action.Verb, resource, subresource, requestScope, restfulListResource(lister, watcher, reqScope, true, a.minRequestTimeout))
+			route := ws.GET(action.Path).To(handler).
+				Doc(doc).
+				Param(ws.QueryParameter("pretty", "If 'true', then the output is pretty printed.")).
+				Operation("watch"+namespaced+kind+strings.Title(subresource)+"List"+operationSuffix).
+				Produces(allMediaTypes...).
+				Returns(http.StatusOK, "OK", versionedWatchEvent).
+				Writes(versionedWatchEvent)
+			if err := addObjectParams(ws, route, versionedListOptions); err != nil {
+				return nil, err
+			}
+			addParams(route, action.Params)
+			routes = append(routes, route)
+		case "CONNECT":
+			for _, method := range connecter.ConnectMethods() {
+				connectProducedObject := storageMeta.ProducesObject(method)
+				if connectProducedObject == nil {
+					connectProducedObject = "string"
+				}
+				doc := "connect " + method + " requests to " + kind
+				if isSubresource {
+					doc = "connect " + method + " requests to " + subresource + " of " + kind
+				}
+				handler := metrics.InstrumentRouteFunc(action.Verb, resource, subresource, requestScope, restfulConnectResource(connecter, reqScope, admit, path, isSubresource))
+				route := ws.Method(method).Path(action.Path).
+					To(handler).
+					Doc(doc).
+					Operation("connect" + strings.Title(strings.ToLower(method)) + namespaced + kind + strings.Title(subresource) + operationSuffix).
+					Produces("*/*").
+					Consumes("*/*").
+					Writes(connectProducedObject)
+				if versionedConnectOptions != nil {
+					if err := addObjectParams(ws, route, versionedConnectOptions); err != nil {
+						return nil, err
+					}
+				}
+				addParams(route, action.Params)
+				routes = append(routes, route)
+			}
+		default:
+			return nil, fmt.Errorf("unrecognized action verb: %s", action.Verb)
+		}
+		for _, route := range routes {
+			route.Metadata(ROUTE_META_GVK, metav1.GroupVersionKind{
+				Group:   reqScope.Kind.Group,
+				Version: reqScope.Kind.Version,
+				Kind:    reqScope.Kind.Kind,
+			})
+			route.Metadata(ROUTE_META_ACTION, strings.ToLower(action.Verb))
+			ws.Route(route)
+		}
+		// Note: update GetAuthorizerAttributes() when adding a custom handler.
+	}
+
+	apiResource.Verbs = make([]string, 0, len(kubeVerbs))
+	for kubeVerb := range kubeVerbs {
+		apiResource.Verbs = append(apiResource.Verbs, kubeVerb)
+	}
+	sort.Strings(apiResource.Verbs)
+
+	if shortNamesProvider, ok := storage.(rest.ShortNamesProvider); ok {
+		apiResource.ShortNames = shortNamesProvider.ShortNames()
+	}
+	if categoriesProvider, ok := storage.(rest.CategoriesProvider); ok {
+		apiResource.Categories = categoriesProvider.Categories()
+	}
+	if gvkProvider, ok := storage.(rest.GroupVersionKindProvider); ok {
+		gvk := gvkProvider.GroupVersionKind(a.group.GroupVersion)
+		apiResource.Group = gvk.Group
+		apiResource.Version = gvk.Version
+		apiResource.Kind = gvk.Kind
+	}
+
+	return &apiResource, nil
+}
+
+// indirectArbitraryPointer returns *ptrToObject for an arbitrary pointer
+func indirectArbitraryPointer(ptrToObject interface{}) interface{} {
+	return reflect.Indirect(reflect.ValueOf(ptrToObject)).Interface()
+}
+
+func appendIf(actions []action, a action, shouldAppend bool) []action {
+	if shouldAppend {
+		actions = append(actions, a)
+	}
+	return actions
+}
+
+// Wraps a http.Handler function inside a restful.RouteFunction
+func routeFunction(handler http.Handler) restful.RouteFunction {
+	return func(restReq *restful.Request, restResp *restful.Response) {
+		handler.ServeHTTP(restResp.ResponseWriter, restReq.Request)
+	}
+}
+
+func addParams(route *restful.RouteBuilder, params []*restful.Parameter) {
+	for _, param := range params {
+		route.Param(param)
+	}
+}
+
+// addObjectParams converts a runtime.Object into a set of go-restful Param() definitions on the route.
+// The object must be a pointer to a struct; only fields at the top level of the struct that are not
+// themselves interfaces or structs are used; only fields with a json tag that is non empty (the standard
+// Go JSON behavior for omitting a field) become query parameters. The name of the query parameter is
+// the JSON field name. If a description struct tag is set on the field, that description is used on the
+// query parameter. In essence, it converts a standard JSON top level object into a query param schema.
+func addObjectParams(ws *restful.WebService, route *restful.RouteBuilder, obj interface{}) error {
+	sv, err := conversion.EnforcePtr(obj)
+	if err != nil {
+		return err
+	}
+	st := sv.Type()
+	switch st.Kind() {
+	case reflect.Struct:
+		for i := 0; i < st.NumField(); i++ {
+			name := st.Field(i).Name
+			sf, ok := st.FieldByName(name)
+			if !ok {
+				continue
+			}
+			switch sf.Type.Kind() {
+			case reflect.Interface, reflect.Struct:
+			case reflect.Ptr:
+				// TODO: This is a hack to let metav1.Time through. This needs to be fixed in a more generic way eventually. bug #36191
+				if (sf.Type.Elem().Kind() == reflect.Interface || sf.Type.Elem().Kind() == reflect.Struct) && strings.TrimPrefix(sf.Type.String(), "*") != "metav1.Time" {
+					continue
+				}
+				fallthrough
+			default:
+				jsonTag := sf.Tag.Get("json")
+				if len(jsonTag) == 0 {
+					continue
+				}
+				jsonName := strings.SplitN(jsonTag, ",", 2)[0]
+				if len(jsonName) == 0 {
+					continue
+				}
+
+				var desc string
+				if docable, ok := obj.(documentable); ok {
+					desc = docable.SwaggerDoc()[jsonName]
+				}
+				route.Param(ws.QueryParameter(jsonName, desc).DataType(typeToJSON(sf.Type.String())))
+			}
+		}
+	}
+	return nil
+}
+
+// TODO: this is incomplete, expand as needed.
+// Convert the name of a golang type to the name of a JSON type
+func typeToJSON(typeName string) string {
+	switch typeName {
+	case "bool", "*bool":
+		return "boolean"
+	case "uint8", "*uint8", "int", "*int", "int32", "*int32", "int64", "*int64", "uint32", "*uint32", "uint64", "*uint64":
+		return "integer"
+	case "float64", "*float64", "float32", "*float32":
+		return "number"
+	case "metav1.Time", "*metav1.Time":
+		return "string"
+	case "byte", "*byte":
+		return "string"
+	case "v1.DeletionPropagation", "*v1.DeletionPropagation":
+		return "string"
+
+	// TODO: Fix these when go-restful supports a way to specify an array query param:
+	// https://github.com/emicklei/go-restful/issues/225
+	case "[]string", "[]*string":
+		return "string"
+	case "[]int32", "[]*int32":
+		return "integer"
+
+	default:
+		return typeName
+	}
+}
+
+// defaultStorageMetadata provides default answers to rest.StorageMetadata.
+type defaultStorageMetadata struct{}
+
+// defaultStorageMetadata implements rest.StorageMetadata
+var _ rest.StorageMetadata = defaultStorageMetadata{}
+
+func (defaultStorageMetadata) ProducesMIMETypes(verb string) []string {
+	return nil
+}
+
+func (defaultStorageMetadata) ProducesObject(verb string) interface{} {
+	return nil
+}
+
+// splitSubresource checks if the given storage path is the path of a subresource and returns
+// the resource and subresource components.
+func splitSubresource(path string) (string, string, error) {
+	var resource, subresource string
+	switch parts := strings.Split(path, "/"); len(parts) {
+	case 2:
+		resource, subresource = parts[0], parts[1]
+	case 1:
+		resource = parts[0]
+	default:
+		// TODO: support deeper paths
+		return "", "", fmt.Errorf("api_installer allows only one or two segment paths (resource or resource/subresource)")
+	}
+	return resource, subresource, nil
+}
+
+// getArticleForNoun returns the article needed for the given noun.
+func getArticleForNoun(noun string, padding string) string {
+	if noun[len(noun)-2:] != "ss" && noun[len(noun)-1:] == "s" {
+		// Plurals don't have an article.
+		// Don't catch words like class
+		return fmt.Sprintf("%v", padding)
+	}
+
+	article := "a"
+	if isVowel(rune(noun[0])) {
+		article = "an"
+	}
+
+	return fmt.Sprintf("%s%s%s", padding, article, padding)
+}
+
+// isVowel returns true if the rune is a vowel (case insensitive).
+func isVowel(c rune) bool {
+	vowels := []rune{'a', 'e', 'i', 'o', 'u'}
+	for _, value := range vowels {
+		if value == unicode.ToLower(c) {
+			return true
+		}
+	}
+	return false
+}
+
+func restfulListResource(r rest.Lister, rw rest.Watcher, scope handlers.RequestScope, forceWatch bool, minRequestTimeout time.Duration) restful.RouteFunction {
+	return func(req *restful.Request, res *restful.Response) {
+		handlers.ListResource(r, rw, scope, forceWatch, minRequestTimeout)(res.ResponseWriter, req.Request)
+	}
+}
+
+func restfulCreateNamedResource(r rest.NamedCreater, scope handlers.RequestScope, admit admission.Interface) restful.RouteFunction {
+	return func(req *restful.Request, res *restful.Response) {
+		handlers.CreateNamedResource(r, scope, admit)(res.ResponseWriter, req.Request)
+	}
+}
+
+func restfulCreateResource(r rest.Creater, scope handlers.RequestScope, admit admission.Interface) restful.RouteFunction {
+	return func(req *restful.Request, res *restful.Response) {
+		handlers.CreateResource(r, scope, admit)(res.ResponseWriter, req.Request)
+	}
+}
+
+func restfulDeleteResource(r rest.GracefulDeleter, allowsOptions bool, scope handlers.RequestScope, admit admission.Interface) restful.RouteFunction {
+	return func(req *restful.Request, res *restful.Response) {
+		handlers.DeleteResource(r, allowsOptions, scope, admit)(res.ResponseWriter, req.Request)
+	}
+}
+
+func restfulDeleteCollection(r rest.CollectionDeleter, checkBody bool, scope handlers.RequestScope, admit admission.Interface) restful.RouteFunction {
+	return func(req *restful.Request, res *restful.Response) {
+		handlers.DeleteCollection(r, checkBody, scope, admit)(res.ResponseWriter, req.Request)
+	}
+}
+
+func restfulUpdateResource(r rest.Updater, scope handlers.RequestScope, admit admission.Interface) restful.RouteFunction {
+	return func(req *restful.Request, res *restful.Response) {
+		handlers.UpdateResource(r, scope, admit)(res.ResponseWriter, req.Request)
+	}
+}
+
+func restfulPatchResource(r rest.Patcher, scope handlers.RequestScope, admit admission.Interface, supportedTypes []string) restful.RouteFunction {
+	return func(req *restful.Request, res *restful.Response) {
+		handlers.PatchResource(r, scope, admit, supportedTypes)(res.ResponseWriter, req.Request)
+	}
+}
+
+func restfulGetResource(r rest.Getter, e rest.Exporter, scope handlers.RequestScope) restful.RouteFunction {
+	return func(req *restful.Request, res *restful.Response) {
+		handlers.GetResource(r, e, scope)(res.ResponseWriter, req.Request)
+	}
+}
+
+func restfulGetResourceWithOptions(r rest.GetterWithOptions, scope handlers.RequestScope, isSubresource bool) restful.RouteFunction {
+	return func(req *restful.Request, res *restful.Response) {
+		handlers.GetResourceWithOptions(r, scope, isSubresource)(res.ResponseWriter, req.Request)
+	}
+}
+
+func restfulConnectResource(connecter rest.Connecter, scope handlers.RequestScope, admit admission.Interface, restPath string, isSubresource bool) restful.RouteFunction {
+	return func(req *restful.Request, res *restful.Response) {
+		handlers.ConnectResource(connecter, scope, admit, restPath, isSubresource)(res.ResponseWriter, req.Request)
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/metrics/OWNERS b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/metrics/OWNERS
new file mode 100755
index 0000000..f0706b3
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/metrics/OWNERS
@@ -0,0 +1,3 @@
+reviewers:
+- wojtek-t
+- jimmidyson
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/metrics/metrics.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/metrics/metrics.go
new file mode 100644
index 0000000..516452e
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/metrics/metrics.go
@@ -0,0 +1,443 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+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.
+*/
+
+package metrics
+
+import (
+	"bufio"
+	"net"
+	"net/http"
+	"regexp"
+	"strconv"
+	"strings"
+	"sync"
+	"time"
+
+	utilnet "k8s.io/apimachinery/pkg/util/net"
+	"k8s.io/apiserver/pkg/endpoints/request"
+
+	"github.com/emicklei/go-restful"
+	"github.com/prometheus/client_golang/prometheus"
+)
+
+// resettableCollector is the interface implemented by prometheus.MetricVec
+// that can be used by Prometheus to collect metrics and reset their values.
+type resettableCollector interface {
+	prometheus.Collector
+	Reset()
+}
+
+var (
+	// TODO(a-robinson): Add unit tests for the handling of these metrics once
+	// the upstream library supports it.
+	requestCounter = prometheus.NewCounterVec(
+		prometheus.CounterOpts{
+			Name: "apiserver_request_count",
+			Help: "Counter of apiserver requests broken out for each verb, API resource, client, and HTTP response contentType and code.",
+		},
+		[]string{"verb", "resource", "subresource", "scope", "client", "contentType", "code"},
+	)
+	longRunningRequestGauge = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "apiserver_longrunning_gauge",
+			Help: "Gauge of all active long-running apiserver requests broken out by verb, API resource, and scope. Not all requests are tracked this way.",
+		},
+		[]string{"verb", "resource", "subresource", "scope"},
+	)
+	requestLatencies = prometheus.NewHistogramVec(
+		prometheus.HistogramOpts{
+			Name: "apiserver_request_latencies",
+			Help: "Response latency distribution in microseconds for each verb, resource and subresource.",
+			// Use buckets ranging from 125 ms to 8 seconds.
+			Buckets: prometheus.ExponentialBuckets(125000, 2.0, 7),
+		},
+		[]string{"verb", "resource", "subresource", "scope"},
+	)
+	requestLatenciesSummary = prometheus.NewSummaryVec(
+		prometheus.SummaryOpts{
+			Name: "apiserver_request_latencies_summary",
+			Help: "Response latency summary in microseconds for each verb, resource and subresource.",
+			// Make the sliding window of 5h.
+			// TODO: The value for this should be based on our SLI definition (medium term).
+			MaxAge: 5 * time.Hour,
+		},
+		[]string{"verb", "resource", "subresource", "scope"},
+	)
+	responseSizes = prometheus.NewHistogramVec(
+		prometheus.HistogramOpts{
+			Name: "apiserver_response_sizes",
+			Help: "Response size distribution in bytes for each verb, resource, subresource and scope (namespace/cluster).",
+			// Use buckets ranging from 1000 bytes (1KB) to 10^9 bytes (1GB).
+			Buckets: prometheus.ExponentialBuckets(1000, 10.0, 7),
+		},
+		[]string{"verb", "resource", "subresource", "scope"},
+	)
+	// DroppedRequests is a number of requests dropped with 'Try again later' response"
+	DroppedRequests = prometheus.NewCounterVec(
+		prometheus.CounterOpts{
+			Name: "apiserver_dropped_requests",
+			Help: "Number of requests dropped with 'Try again later' response",
+		},
+		[]string{"requestKind"},
+	)
+	// RegisteredWatchers is a number of currently registered watchers splitted by resource.
+	RegisteredWatchers = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "apiserver_registered_watchers",
+			Help: "Number of currently registered watchers for a given resources",
+		},
+		[]string{"group", "version", "kind"},
+	)
+	// Because of volatality of the base metric this is pre-aggregated one. Instead of reporing current usage all the time
+	// it reports maximal usage during the last second.
+	currentInflightRequests = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "apiserver_current_inflight_requests",
+			Help: "Maximal mumber of currently used inflight request limit of this apiserver per request kind in last second.",
+		},
+		[]string{"requestKind"},
+	)
+	kubectlExeRegexp = regexp.MustCompile(`^.*((?i:kubectl\.exe))`)
+
+	metrics = []resettableCollector{
+		requestCounter,
+		longRunningRequestGauge,
+		requestLatencies,
+		requestLatenciesSummary,
+		responseSizes,
+		DroppedRequests,
+		RegisteredWatchers,
+		currentInflightRequests,
+	}
+)
+
+const (
+	// ReadOnlyKind is a string identifying read only request kind
+	ReadOnlyKind = "readOnly"
+	// MutatingKind is a string identifying mutating request kind
+	MutatingKind = "mutating"
+)
+
+var registerMetrics sync.Once
+
+// Register all metrics.
+func Register() {
+	registerMetrics.Do(func() {
+		for _, metric := range metrics {
+			prometheus.MustRegister(metric)
+		}
+	})
+}
+
+// Reset all metrics.
+func Reset() {
+	for _, metric := range metrics {
+		metric.Reset()
+	}
+}
+
+func UpdateInflightRequestMetrics(nonmutating, mutating int) {
+	currentInflightRequests.WithLabelValues(ReadOnlyKind).Set(float64(nonmutating))
+	currentInflightRequests.WithLabelValues(MutatingKind).Set(float64(mutating))
+}
+
+// Record records a single request to the standard metrics endpoints. For use by handlers that perform their own
+// processing. All API paths should use InstrumentRouteFunc implicitly. Use this instead of MonitorRequest if
+// you already have a RequestInfo object.
+func Record(req *http.Request, requestInfo *request.RequestInfo, contentType string, code int, responseSizeInBytes int, elapsed time.Duration) {
+	if requestInfo == nil {
+		requestInfo = &request.RequestInfo{Verb: req.Method, Path: req.URL.Path}
+	}
+	scope := CleanScope(requestInfo)
+	if requestInfo.IsResourceRequest {
+		MonitorRequest(req, strings.ToUpper(requestInfo.Verb), requestInfo.Resource, requestInfo.Subresource, contentType, scope, code, responseSizeInBytes, elapsed)
+	} else {
+		MonitorRequest(req, strings.ToUpper(requestInfo.Verb), "", requestInfo.Path, contentType, scope, code, responseSizeInBytes, elapsed)
+	}
+}
+
+// RecordLongRunning tracks the execution of a long running request against the API server. It provides an accurate count
+// of the total number of open long running requests. requestInfo may be nil if the caller is not in the normal request flow.
+func RecordLongRunning(req *http.Request, requestInfo *request.RequestInfo, fn func()) {
+	if requestInfo == nil {
+		requestInfo = &request.RequestInfo{Verb: req.Method, Path: req.URL.Path}
+	}
+	var g prometheus.Gauge
+	scope := CleanScope(requestInfo)
+	reportedVerb := cleanVerb(strings.ToUpper(requestInfo.Verb), req)
+	if requestInfo.IsResourceRequest {
+		g = longRunningRequestGauge.WithLabelValues(reportedVerb, requestInfo.Resource, requestInfo.Subresource, scope)
+	} else {
+		g = longRunningRequestGauge.WithLabelValues(reportedVerb, "", requestInfo.Path, scope)
+	}
+	g.Inc()
+	defer g.Dec()
+	fn()
+}
+
+// MonitorRequest handles standard transformations for client and the reported verb and then invokes Monitor to record
+// a request. verb must be uppercase to be backwards compatible with existing monitoring tooling.
+func MonitorRequest(req *http.Request, verb, resource, subresource, scope, contentType string, httpCode, respSize int, elapsed time.Duration) {
+	reportedVerb := cleanVerb(verb, req)
+	client := cleanUserAgent(utilnet.GetHTTPClient(req))
+	elapsedMicroseconds := float64(elapsed / time.Microsecond)
+	requestCounter.WithLabelValues(reportedVerb, resource, subresource, scope, client, contentType, codeToString(httpCode)).Inc()
+	requestLatencies.WithLabelValues(reportedVerb, resource, subresource, scope).Observe(elapsedMicroseconds)
+	requestLatenciesSummary.WithLabelValues(reportedVerb, resource, subresource, scope).Observe(elapsedMicroseconds)
+	// We are only interested in response sizes of read requests.
+	if verb == "GET" || verb == "LIST" {
+		responseSizes.WithLabelValues(reportedVerb, resource, subresource, scope).Observe(float64(respSize))
+	}
+}
+
+// InstrumentRouteFunc works like Prometheus' InstrumentHandlerFunc but wraps
+// the go-restful RouteFunction instead of a HandlerFunc plus some Kubernetes endpoint specific information.
+func InstrumentRouteFunc(verb, resource, subresource, scope string, routeFunc restful.RouteFunction) restful.RouteFunction {
+	return restful.RouteFunction(func(request *restful.Request, response *restful.Response) {
+		now := time.Now()
+
+		delegate := &ResponseWriterDelegator{ResponseWriter: response.ResponseWriter}
+
+		_, cn := response.ResponseWriter.(http.CloseNotifier)
+		_, fl := response.ResponseWriter.(http.Flusher)
+		_, hj := response.ResponseWriter.(http.Hijacker)
+		var rw http.ResponseWriter
+		if cn && fl && hj {
+			rw = &fancyResponseWriterDelegator{delegate}
+		} else {
+			rw = delegate
+		}
+		response.ResponseWriter = rw
+
+		routeFunc(request, response)
+
+		MonitorRequest(request.Request, verb, resource, subresource, scope, delegate.Header().Get("Content-Type"), delegate.Status(), delegate.ContentLength(), time.Since(now))
+	})
+}
+
+// InstrumentHandlerFunc works like Prometheus' InstrumentHandlerFunc but adds some Kubernetes endpoint specific information.
+func InstrumentHandlerFunc(verb, resource, subresource, scope string, handler http.HandlerFunc) http.HandlerFunc {
+	return func(w http.ResponseWriter, req *http.Request) {
+		now := time.Now()
+
+		delegate := &ResponseWriterDelegator{ResponseWriter: w}
+
+		_, cn := w.(http.CloseNotifier)
+		_, fl := w.(http.Flusher)
+		_, hj := w.(http.Hijacker)
+		if cn && fl && hj {
+			w = &fancyResponseWriterDelegator{delegate}
+		} else {
+			w = delegate
+		}
+
+		handler(w, req)
+
+		MonitorRequest(req, verb, resource, subresource, scope, delegate.Header().Get("Content-Type"), delegate.Status(), delegate.ContentLength(), time.Since(now))
+	}
+}
+
+// CleanScope returns the scope of the request.
+func CleanScope(requestInfo *request.RequestInfo) string {
+	if requestInfo.Namespace != "" {
+		return "namespace"
+	}
+	if requestInfo.Name != "" {
+		return "resource"
+	}
+	if requestInfo.IsResourceRequest {
+		return "cluster"
+	}
+	// this is the empty scope
+	return ""
+}
+
+func cleanVerb(verb string, request *http.Request) string {
+	reportedVerb := verb
+	if verb == "LIST" {
+		// see apimachinery/pkg/runtime/conversion.go Convert_Slice_string_To_bool
+		if values := request.URL.Query()["watch"]; len(values) > 0 {
+			if value := strings.ToLower(values[0]); value != "0" && value != "false" {
+				reportedVerb = "WATCH"
+			}
+		}
+	}
+	// normalize the legacy WATCHLIST to WATCH to ensure users aren't surprised by metrics
+	if verb == "WATCHLIST" {
+		reportedVerb = "WATCH"
+	}
+	return reportedVerb
+}
+
+func cleanUserAgent(ua string) string {
+	// We collapse all "web browser"-type user agents into one "browser" to reduce metric cardinality.
+	if strings.HasPrefix(ua, "Mozilla/") {
+		return "Browser"
+	}
+	// If an old "kubectl.exe" has passed us its full path, we discard the path portion.
+	ua = kubectlExeRegexp.ReplaceAllString(ua, "$1")
+	return ua
+}
+
+// ResponseWriterDelegator interface wraps http.ResponseWriter to additionally record content-length, status-code, etc.
+type ResponseWriterDelegator struct {
+	http.ResponseWriter
+
+	status      int
+	written     int64
+	wroteHeader bool
+}
+
+func (r *ResponseWriterDelegator) WriteHeader(code int) {
+	r.status = code
+	r.wroteHeader = true
+	r.ResponseWriter.WriteHeader(code)
+}
+
+func (r *ResponseWriterDelegator) Write(b []byte) (int, error) {
+	if !r.wroteHeader {
+		r.WriteHeader(http.StatusOK)
+	}
+	n, err := r.ResponseWriter.Write(b)
+	r.written += int64(n)
+	return n, err
+}
+
+func (r *ResponseWriterDelegator) Status() int {
+	return r.status
+}
+
+func (r *ResponseWriterDelegator) ContentLength() int {
+	return int(r.written)
+}
+
+type fancyResponseWriterDelegator struct {
+	*ResponseWriterDelegator
+}
+
+func (f *fancyResponseWriterDelegator) CloseNotify() <-chan bool {
+	return f.ResponseWriter.(http.CloseNotifier).CloseNotify()
+}
+
+func (f *fancyResponseWriterDelegator) Flush() {
+	f.ResponseWriter.(http.Flusher).Flush()
+}
+
+func (f *fancyResponseWriterDelegator) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+	return f.ResponseWriter.(http.Hijacker).Hijack()
+}
+
+// Small optimization over Itoa
+func codeToString(s int) string {
+	switch s {
+	case 100:
+		return "100"
+	case 101:
+		return "101"
+
+	case 200:
+		return "200"
+	case 201:
+		return "201"
+	case 202:
+		return "202"
+	case 203:
+		return "203"
+	case 204:
+		return "204"
+	case 205:
+		return "205"
+	case 206:
+		return "206"
+
+	case 300:
+		return "300"
+	case 301:
+		return "301"
+	case 302:
+		return "302"
+	case 304:
+		return "304"
+	case 305:
+		return "305"
+	case 307:
+		return "307"
+
+	case 400:
+		return "400"
+	case 401:
+		return "401"
+	case 402:
+		return "402"
+	case 403:
+		return "403"
+	case 404:
+		return "404"
+	case 405:
+		return "405"
+	case 406:
+		return "406"
+	case 407:
+		return "407"
+	case 408:
+		return "408"
+	case 409:
+		return "409"
+	case 410:
+		return "410"
+	case 411:
+		return "411"
+	case 412:
+		return "412"
+	case 413:
+		return "413"
+	case 414:
+		return "414"
+	case 415:
+		return "415"
+	case 416:
+		return "416"
+	case 417:
+		return "417"
+	case 418:
+		return "418"
+
+	case 500:
+		return "500"
+	case 501:
+		return "501"
+	case 502:
+		return "502"
+	case 503:
+		return "503"
+	case 504:
+		return "504"
+	case 505:
+		return "505"
+
+	case 428:
+		return "428"
+	case 429:
+		return "429"
+	case 431:
+		return "431"
+	case 511:
+		return "511"
+
+	default:
+		return strconv.Itoa(s)
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/openapi/OWNERS b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/openapi/OWNERS
new file mode 100755
index 0000000..4126a6b
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/openapi/OWNERS
@@ -0,0 +1,2 @@
+reviewers:
+- mbohlool
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/openapi/openapi.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/openapi/openapi.go
new file mode 100644
index 0000000..e512f29
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/openapi/openapi.go
@@ -0,0 +1,179 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package openapi
+
+import (
+	"bytes"
+	"fmt"
+	"reflect"
+	"sort"
+	"strings"
+	"unicode"
+
+	restful "github.com/emicklei/go-restful"
+	"github.com/go-openapi/spec"
+
+	"k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/kube-openapi/pkg/util"
+)
+
+var verbs = util.NewTrie([]string{"get", "log", "read", "replace", "patch", "delete", "deletecollection", "watch", "connect", "proxy", "list", "create", "patch"})
+
+const (
+	extensionGVK = "x-kubernetes-group-version-kind"
+)
+
+// ToValidOperationID makes an string a valid op ID (e.g. removing punctuations and whitespaces and make it camel case)
+func ToValidOperationID(s string, capitalizeFirstLetter bool) string {
+	var buffer bytes.Buffer
+	capitalize := capitalizeFirstLetter
+	for i, r := range s {
+		if unicode.IsLetter(r) || r == '_' || (i != 0 && unicode.IsDigit(r)) {
+			if capitalize {
+				buffer.WriteRune(unicode.ToUpper(r))
+				capitalize = false
+			} else {
+				buffer.WriteRune(r)
+			}
+		} else {
+			capitalize = true
+		}
+	}
+	return buffer.String()
+}
+
+// GetOperationIDAndTags returns a customize operation ID and a list of tags for kubernetes API server's OpenAPI spec to prevent duplicate IDs.
+func GetOperationIDAndTags(r *restful.Route) (string, []string, error) {
+	op := r.Operation
+	path := r.Path
+	var tags []string
+	prefix, exists := verbs.GetPrefix(op)
+	if !exists {
+		return op, tags, fmt.Errorf("operation names should start with a verb. Cannot determine operation verb from %v", op)
+	}
+	op = op[len(prefix):]
+	parts := strings.Split(strings.Trim(path, "/"), "/")
+	// Assume /api is /apis/core, remove this when we actually server /api/... on /apis/core/...
+	if len(parts) >= 1 && parts[0] == "api" {
+		parts = append([]string{"apis", "core"}, parts[1:]...)
+	}
+	if len(parts) >= 2 && parts[0] == "apis" {
+		trimmed := strings.TrimSuffix(parts[1], ".k8s.io")
+		prefix = prefix + ToValidOperationID(trimmed, prefix != "")
+		tag := ToValidOperationID(trimmed, false)
+		if len(parts) > 2 {
+			prefix = prefix + ToValidOperationID(parts[2], prefix != "")
+			tag = tag + "_" + ToValidOperationID(parts[2], false)
+		}
+		tags = append(tags, tag)
+	} else if len(parts) >= 1 {
+		tags = append(tags, ToValidOperationID(parts[0], false))
+	}
+	return prefix + ToValidOperationID(op, prefix != ""), tags, nil
+}
+
+type groupVersionKinds []v1.GroupVersionKind
+
+func (s groupVersionKinds) Len() int {
+	return len(s)
+}
+
+func (s groupVersionKinds) Swap(i, j int) {
+	s[i], s[j] = s[j], s[i]
+}
+
+func (s groupVersionKinds) Less(i, j int) bool {
+	if s[i].Group == s[j].Group {
+		if s[i].Version == s[j].Version {
+			return s[i].Kind < s[j].Kind
+		}
+		return s[i].Version < s[j].Version
+	}
+	return s[i].Group < s[j].Group
+}
+
+// DefinitionNamer is the type to customize OpenAPI definition name.
+type DefinitionNamer struct {
+	typeGroupVersionKinds map[string]groupVersionKinds
+}
+
+func gvkConvert(gvk schema.GroupVersionKind) v1.GroupVersionKind {
+	return v1.GroupVersionKind{
+		Group:   gvk.Group,
+		Version: gvk.Version,
+		Kind:    gvk.Kind,
+	}
+}
+
+func friendlyName(name string) string {
+	nameParts := strings.Split(name, "/")
+	// Reverse first part. e.g., io.k8s... instead of k8s.io...
+	if len(nameParts) > 0 && strings.Contains(nameParts[0], ".") {
+		parts := strings.Split(nameParts[0], ".")
+		for i, j := 0, len(parts)-1; i < j; i, j = i+1, j-1 {
+			parts[i], parts[j] = parts[j], parts[i]
+		}
+		nameParts[0] = strings.Join(parts, ".")
+	}
+	return strings.Join(nameParts, ".")
+}
+
+func typeName(t reflect.Type) string {
+	path := t.PkgPath()
+	if strings.Contains(path, "/vendor/") {
+		path = path[strings.Index(path, "/vendor/")+len("/vendor/"):]
+	}
+	return fmt.Sprintf("%s.%s", path, t.Name())
+}
+
+// NewDefinitionNamer constructs a new DefinitionNamer to be used to customize OpenAPI spec.
+func NewDefinitionNamer(schemes ...*runtime.Scheme) *DefinitionNamer {
+	ret := &DefinitionNamer{
+		typeGroupVersionKinds: map[string]groupVersionKinds{},
+	}
+	for _, s := range schemes {
+		for gvk, rtype := range s.AllKnownTypes() {
+			newGVK := gvkConvert(gvk)
+			exists := false
+			for _, existingGVK := range ret.typeGroupVersionKinds[typeName(rtype)] {
+				if newGVK == existingGVK {
+					exists = true
+					break
+				}
+			}
+			if !exists {
+				ret.typeGroupVersionKinds[typeName(rtype)] = append(ret.typeGroupVersionKinds[typeName(rtype)], newGVK)
+			}
+		}
+	}
+	for _, gvk := range ret.typeGroupVersionKinds {
+		sort.Sort(gvk)
+	}
+	return ret
+}
+
+// GetDefinitionName returns the name and tags for a given definition
+func (d *DefinitionNamer) GetDefinitionName(name string) (string, spec.Extensions) {
+	if groupVersionKinds, ok := d.typeGroupVersionKinds[name]; ok {
+		return friendlyName(name), spec.Extensions{
+			extensionGVK: []v1.GroupVersionKind(groupVersionKinds),
+		}
+	}
+	return friendlyName(name), nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/request/OWNERS b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/request/OWNERS
new file mode 100755
index 0000000..9d268c4
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/request/OWNERS
@@ -0,0 +1,2 @@
+reviewers:
+- sttts
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/request/context.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/request/context.go
new file mode 100644
index 0000000..95166f5
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/request/context.go
@@ -0,0 +1,93 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package request
+
+import (
+	"context"
+
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apiserver/pkg/apis/audit"
+	"k8s.io/apiserver/pkg/authentication/user"
+)
+
+// The key type is unexported to prevent collisions
+type key int
+
+const (
+	// namespaceKey is the context key for the request namespace.
+	namespaceKey key = iota
+
+	// userKey is the context key for the request user.
+	userKey
+
+	// auditKey is the context key for the audit event.
+	auditKey
+)
+
+// NewContext instantiates a base context object for request flows.
+func NewContext() context.Context {
+	return context.TODO()
+}
+
+// NewDefaultContext instantiates a base context object for request flows in the default namespace
+func NewDefaultContext() context.Context {
+	return WithNamespace(NewContext(), metav1.NamespaceDefault)
+}
+
+// WithValue returns a copy of parent in which the value associated with key is val.
+func WithValue(parent context.Context, key interface{}, val interface{}) context.Context {
+	return context.WithValue(parent, key, val)
+}
+
+// WithNamespace returns a copy of parent in which the namespace value is set
+func WithNamespace(parent context.Context, namespace string) context.Context {
+	return WithValue(parent, namespaceKey, namespace)
+}
+
+// NamespaceFrom returns the value of the namespace key on the ctx
+func NamespaceFrom(ctx context.Context) (string, bool) {
+	namespace, ok := ctx.Value(namespaceKey).(string)
+	return namespace, ok
+}
+
+// NamespaceValue returns the value of the namespace key on the ctx, or the empty string if none
+func NamespaceValue(ctx context.Context) string {
+	namespace, _ := NamespaceFrom(ctx)
+	return namespace
+}
+
+// WithUser returns a copy of parent in which the user value is set
+func WithUser(parent context.Context, user user.Info) context.Context {
+	return WithValue(parent, userKey, user)
+}
+
+// UserFrom returns the value of the user key on the ctx
+func UserFrom(ctx context.Context) (user.Info, bool) {
+	user, ok := ctx.Value(userKey).(user.Info)
+	return user, ok
+}
+
+// WithAuditEvent returns set audit event struct.
+func WithAuditEvent(parent context.Context, ev *audit.Event) context.Context {
+	return WithValue(parent, auditKey, ev)
+}
+
+// AuditEventFrom returns the audit event struct on the ctx
+func AuditEventFrom(ctx context.Context) *audit.Event {
+	ev, _ := ctx.Value(auditKey).(*audit.Event)
+	return ev
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/request/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/request/doc.go
new file mode 100644
index 0000000..96da6f2
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/request/doc.go
@@ -0,0 +1,20 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+// Package request contains everything around extracting info from
+// a http request object.
+// TODO: this package is temporary. Handlers must move into pkg/apiserver/handlers to avoid dependency cycle
+package request // import "k8s.io/apiserver/pkg/endpoints/request"
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/request/requestinfo.go b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/request/requestinfo.go
new file mode 100644
index 0000000..1520bb3
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/endpoints/request/requestinfo.go
@@ -0,0 +1,273 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package request
+
+import (
+	"context"
+	"fmt"
+	"net/http"
+	"strings"
+
+	"k8s.io/apimachinery/pkg/api/validation/path"
+	metainternalversion "k8s.io/apimachinery/pkg/apis/meta/internalversion"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/util/sets"
+
+	"github.com/golang/glog"
+)
+
+// LongRunningRequestCheck is a predicate which is true for long-running http requests.
+type LongRunningRequestCheck func(r *http.Request, requestInfo *RequestInfo) bool
+
+type RequestInfoResolver interface {
+	NewRequestInfo(req *http.Request) (*RequestInfo, error)
+}
+
+// RequestInfo holds information parsed from the http.Request
+type RequestInfo struct {
+	// IsResourceRequest indicates whether or not the request is for an API resource or subresource
+	IsResourceRequest bool
+	// Path is the URL path of the request
+	Path string
+	// Verb is the kube verb associated with the request for API requests, not the http verb.  This includes things like list and watch.
+	// for non-resource requests, this is the lowercase http verb
+	Verb string
+
+	APIPrefix  string
+	APIGroup   string
+	APIVersion string
+	Namespace  string
+	// Resource is the name of the resource being requested.  This is not the kind.  For example: pods
+	Resource string
+	// Subresource is the name of the subresource being requested.  This is a different resource, scoped to the parent resource, but it may have a different kind.
+	// For instance, /pods has the resource "pods" and the kind "Pod", while /pods/foo/status has the resource "pods", the sub resource "status", and the kind "Pod"
+	// (because status operates on pods). The binding resource for a pod though may be /pods/foo/binding, which has resource "pods", subresource "binding", and kind "Binding".
+	Subresource string
+	// Name is empty for some verbs, but if the request directly indicates a name (not in body content) then this field is filled in.
+	Name string
+	// Parts are the path parts for the request, always starting with /{resource}/{name}
+	Parts []string
+}
+
+// specialVerbs contains just strings which are used in REST paths for special actions that don't fall under the normal
+// CRUDdy GET/POST/PUT/DELETE actions on REST objects.
+// TODO: find a way to keep this up to date automatically.  Maybe dynamically populate list as handlers added to
+// master's Mux.
+var specialVerbs = sets.NewString("proxy", "watch")
+
+// specialVerbsNoSubresources contains root verbs which do not allow subresources
+var specialVerbsNoSubresources = sets.NewString("proxy")
+
+// namespaceSubresources contains subresources of namespace
+// this list allows the parser to distinguish between a namespace subresource, and a namespaced resource
+var namespaceSubresources = sets.NewString("status", "finalize")
+
+// NamespaceSubResourcesForTest exports namespaceSubresources for testing in pkg/master/master_test.go, so we never drift
+var NamespaceSubResourcesForTest = sets.NewString(namespaceSubresources.List()...)
+
+type RequestInfoFactory struct {
+	APIPrefixes          sets.String // without leading and trailing slashes
+	GrouplessAPIPrefixes sets.String // without leading and trailing slashes
+}
+
+// TODO write an integration test against the swagger doc to test the RequestInfo and match up behavior to responses
+// NewRequestInfo returns the information from the http request.  If error is not nil, RequestInfo holds the information as best it is known before the failure
+// It handles both resource and non-resource requests and fills in all the pertinent information for each.
+// Valid Inputs:
+// Resource paths
+// /apis/{api-group}/{version}/namespaces
+// /api/{version}/namespaces
+// /api/{version}/namespaces/{namespace}
+// /api/{version}/namespaces/{namespace}/{resource}
+// /api/{version}/namespaces/{namespace}/{resource}/{resourceName}
+// /api/{version}/{resource}
+// /api/{version}/{resource}/{resourceName}
+//
+// Special verbs without subresources:
+// /api/{version}/proxy/{resource}/{resourceName}
+// /api/{version}/proxy/namespaces/{namespace}/{resource}/{resourceName}
+//
+// Special verbs with subresources:
+// /api/{version}/watch/{resource}
+// /api/{version}/watch/namespaces/{namespace}/{resource}
+//
+// NonResource paths
+// /apis/{api-group}/{version}
+// /apis/{api-group}
+// /apis
+// /api/{version}
+// /api
+// /healthz
+// /
+func (r *RequestInfoFactory) NewRequestInfo(req *http.Request) (*RequestInfo, error) {
+	// start with a non-resource request until proven otherwise
+	requestInfo := RequestInfo{
+		IsResourceRequest: false,
+		Path:              req.URL.Path,
+		Verb:              strings.ToLower(req.Method),
+	}
+
+	currentParts := splitPath(req.URL.Path)
+	if len(currentParts) < 3 {
+		// return a non-resource request
+		return &requestInfo, nil
+	}
+
+	if !r.APIPrefixes.Has(currentParts[0]) {
+		// return a non-resource request
+		return &requestInfo, nil
+	}
+	requestInfo.APIPrefix = currentParts[0]
+	currentParts = currentParts[1:]
+
+	if !r.GrouplessAPIPrefixes.Has(requestInfo.APIPrefix) {
+		// one part (APIPrefix) has already been consumed, so this is actually "do we have four parts?"
+		if len(currentParts) < 3 {
+			// return a non-resource request
+			return &requestInfo, nil
+		}
+
+		requestInfo.APIGroup = currentParts[0]
+		currentParts = currentParts[1:]
+	}
+
+	requestInfo.IsResourceRequest = true
+	requestInfo.APIVersion = currentParts[0]
+	currentParts = currentParts[1:]
+
+	// handle input of form /{specialVerb}/*
+	if specialVerbs.Has(currentParts[0]) {
+		if len(currentParts) < 2 {
+			return &requestInfo, fmt.Errorf("unable to determine kind and namespace from url, %v", req.URL)
+		}
+
+		requestInfo.Verb = currentParts[0]
+		currentParts = currentParts[1:]
+
+	} else {
+		switch req.Method {
+		case "POST":
+			requestInfo.Verb = "create"
+		case "GET", "HEAD":
+			requestInfo.Verb = "get"
+		case "PUT":
+			requestInfo.Verb = "update"
+		case "PATCH":
+			requestInfo.Verb = "patch"
+		case "DELETE":
+			requestInfo.Verb = "delete"
+		default:
+			requestInfo.Verb = ""
+		}
+	}
+
+	// URL forms: /namespaces/{namespace}/{kind}/*, where parts are adjusted to be relative to kind
+	if currentParts[0] == "namespaces" {
+		if len(currentParts) > 1 {
+			requestInfo.Namespace = currentParts[1]
+
+			// if there is another step after the namespace name and it is not a known namespace subresource
+			// move currentParts to include it as a resource in its own right
+			if len(currentParts) > 2 && !namespaceSubresources.Has(currentParts[2]) {
+				currentParts = currentParts[2:]
+			}
+		}
+	} else {
+		requestInfo.Namespace = metav1.NamespaceNone
+	}
+
+	// parsing successful, so we now know the proper value for .Parts
+	requestInfo.Parts = currentParts
+
+	// parts look like: resource/resourceName/subresource/other/stuff/we/don't/interpret
+	switch {
+	case len(requestInfo.Parts) >= 3 && !specialVerbsNoSubresources.Has(requestInfo.Verb):
+		requestInfo.Subresource = requestInfo.Parts[2]
+		fallthrough
+	case len(requestInfo.Parts) >= 2:
+		requestInfo.Name = requestInfo.Parts[1]
+		fallthrough
+	case len(requestInfo.Parts) >= 1:
+		requestInfo.Resource = requestInfo.Parts[0]
+	}
+
+	// if there's no name on the request and we thought it was a get before, then the actual verb is a list or a watch
+	if len(requestInfo.Name) == 0 && requestInfo.Verb == "get" {
+		opts := metainternalversion.ListOptions{}
+		if err := metainternalversion.ParameterCodec.DecodeParameters(req.URL.Query(), metav1.SchemeGroupVersion, &opts); err != nil {
+			// An error in parsing request will result in default to "list" and not setting "name" field.
+			glog.Errorf("Couldn't parse request %#v: %v", req.URL.Query(), err)
+			// Reset opts to not rely on partial results from parsing.
+			// However, if watch is set, let's report it.
+			opts = metainternalversion.ListOptions{}
+			if values := req.URL.Query()["watch"]; len(values) > 0 {
+				switch strings.ToLower(values[0]) {
+				case "false", "0":
+				default:
+					opts.Watch = true
+				}
+			}
+		}
+
+		if opts.Watch {
+			requestInfo.Verb = "watch"
+		} else {
+			requestInfo.Verb = "list"
+		}
+
+		if opts.FieldSelector != nil {
+			if name, ok := opts.FieldSelector.RequiresExactMatch("metadata.name"); ok {
+				if len(path.IsValidPathSegmentName(name)) == 0 {
+					requestInfo.Name = name
+				}
+			}
+		}
+	}
+	// if there's no name on the request and we thought it was a delete before, then the actual verb is deletecollection
+	if len(requestInfo.Name) == 0 && requestInfo.Verb == "delete" {
+		requestInfo.Verb = "deletecollection"
+	}
+
+	return &requestInfo, nil
+}
+
+type requestInfoKeyType int
+
+// requestInfoKey is the RequestInfo key for the context. It's of private type here. Because
+// keys are interfaces and interfaces are equal when the type and the value is equal, this
+// does not conflict with the keys defined in pkg/api.
+const requestInfoKey requestInfoKeyType = iota
+
+// WithRequestInfo returns a copy of parent in which the request info value is set
+func WithRequestInfo(parent context.Context, info *RequestInfo) context.Context {
+	return WithValue(parent, requestInfoKey, info)
+}
+
+// RequestInfoFrom returns the value of the RequestInfo key on the ctx
+func RequestInfoFrom(ctx context.Context) (*RequestInfo, bool) {
+	info, ok := ctx.Value(requestInfoKey).(*RequestInfo)
+	return info, ok
+}
+
+// splitPath returns the segments for a URL path.
+func splitPath(path string) []string {
+	path = strings.Trim(path, "/")
+	if path == "" {
+		return []string{}
+	}
+	return strings.Split(path, "/")
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/features/OWNERS b/metrics-server/vendor/k8s.io/apiserver/pkg/features/OWNERS
new file mode 100644
index 0000000..fe7b014
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/features/OWNERS
@@ -0,0 +1,2 @@
+approvers:
+- feature-approvers
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/features/kube_features.go b/metrics-server/vendor/k8s.io/apiserver/pkg/features/kube_features.go
new file mode 100644
index 0000000..57bab8b
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/features/kube_features.go
@@ -0,0 +1,81 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package features
+
+import (
+	utilfeature "k8s.io/apiserver/pkg/util/feature"
+)
+
+const (
+	// Every feature gate should add method here following this template:
+	//
+	// // owner: @username
+	// // alpha: v1.4
+	// MyFeature() bool
+
+	// owner: @tallclair
+	// alpha: v1.5
+	//
+	// StreamingProxyRedirects controls whether the apiserver should intercept (and follow)
+	// redirects from the backend (Kubelet) for streaming requests (exec/attach/port-forward).
+	StreamingProxyRedirects utilfeature.Feature = "StreamingProxyRedirects"
+
+	// owner: @tallclair
+	// alpha: v1.7
+	// beta: v1.8
+	//
+	// AdvancedAuditing enables a much more general API auditing pipeline, which includes support for
+	// pluggable output backends and an audit policy specifying how different requests should be
+	// audited.
+	AdvancedAuditing utilfeature.Feature = "AdvancedAuditing"
+
+	// owner: @ilackams
+	// alpha: v1.7
+	//
+	// Enables compression of REST responses (GET and LIST only)
+	APIResponseCompression utilfeature.Feature = "APIResponseCompression"
+
+	// owner: @smarterclayton
+	// alpha: v1.7
+	//
+	// Allow asynchronous coordination of object creation.
+	// Auto-enabled by the Initializers admission plugin.
+	Initializers utilfeature.Feature = "Initializers"
+
+	// owner: @smarterclayton
+	// alpha: v1.8
+	// beta: v1.9
+	//
+	// Allow API clients to retrieve resource lists in chunks rather than
+	// all at once.
+	APIListChunking utilfeature.Feature = "APIListChunking"
+)
+
+func init() {
+	utilfeature.DefaultFeatureGate.Add(defaultKubernetesFeatureGates)
+}
+
+// defaultKubernetesFeatureGates consists of all known Kubernetes-specific feature keys.
+// To add a new feature, define a key for it above and add it here. The features will be
+// available throughout Kubernetes binaries.
+var defaultKubernetesFeatureGates = map[utilfeature.Feature]utilfeature.FeatureSpec{
+	StreamingProxyRedirects: {Default: true, PreRelease: utilfeature.Beta},
+	AdvancedAuditing:        {Default: true, PreRelease: utilfeature.Beta},
+	APIResponseCompression:  {Default: false, PreRelease: utilfeature.Alpha},
+	Initializers:            {Default: false, PreRelease: utilfeature.Alpha},
+	APIListChunking:         {Default: true, PreRelease: utilfeature.Beta},
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/registry/generic/OWNERS b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/generic/OWNERS
new file mode 100755
index 0000000..75e1393
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/generic/OWNERS
@@ -0,0 +1,34 @@
+reviewers:
+- thockin
+- lavalamp
+- smarterclayton
+- wojtek-t
+- deads2k
+- yujuhong
+- derekwaynecarr
+- caesarxuchao
+- mikedanese
+- liggitt
+- nikhiljindal
+- gmarek
+- davidopp
+- saad-ali
+- janetkuo
+- pwittrock
+- roberthbailey
+- ncdc
+- eparis
+- jlowdermilk
+- piosz
+- dims
+- hongchaodeng
+- krousey
+- markturansky
+- fgrzadkowski
+- xiang90
+- resouer
+- mqliang
+- feihujiang
+- sdminonne
+- goltermann
+- enj
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/registry/generic/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/generic/doc.go
new file mode 100644
index 0000000..ea79d13
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/generic/doc.go
@@ -0,0 +1,19 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+// Package generic provides a generic object store interface and a
+// generic label/field matching type.
+package generic // import "k8s.io/apiserver/pkg/registry/generic"
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/registry/generic/matcher.go b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/generic/matcher.go
new file mode 100644
index 0000000..4364374
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/generic/matcher.go
@@ -0,0 +1,52 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package generic
+
+import (
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/fields"
+)
+
+// ObjectMetaFieldsSet returns a fields that represent the ObjectMeta.
+func ObjectMetaFieldsSet(objectMeta *metav1.ObjectMeta, hasNamespaceField bool) fields.Set {
+	if !hasNamespaceField {
+		return fields.Set{
+			"metadata.name": objectMeta.Name,
+		}
+	}
+	return fields.Set{
+		"metadata.name":      objectMeta.Name,
+		"metadata.namespace": objectMeta.Namespace,
+	}
+}
+
+// AdObjectMetaField add fields that represent the ObjectMeta to source.
+func AddObjectMetaFieldsSet(source fields.Set, objectMeta *metav1.ObjectMeta, hasNamespaceField bool) fields.Set {
+	source["metadata.name"] = objectMeta.Name
+	if hasNamespaceField {
+		source["metadata.namespace"] = objectMeta.Namespace
+	}
+	return source
+}
+
+// MergeFieldsSets merges a fields'set from fragment into the source.
+func MergeFieldsSets(source fields.Set, fragment fields.Set) fields.Set {
+	for k, value := range fragment {
+		source[k] = value
+	}
+	return source
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/registry/generic/options.go b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/generic/options.go
new file mode 100644
index 0000000..af65137
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/generic/options.go
@@ -0,0 +1,52 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package generic
+
+import (
+	"time"
+
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apiserver/pkg/storage"
+	"k8s.io/apiserver/pkg/storage/storagebackend"
+)
+
+// RESTOptions is set of configuration options to generic registries.
+type RESTOptions struct {
+	StorageConfig *storagebackend.Config
+	Decorator     StorageDecorator
+
+	EnableGarbageCollection bool
+	DeleteCollectionWorkers int
+	ResourcePrefix          string
+	CountMetricPollPeriod   time.Duration
+}
+
+// Implement RESTOptionsGetter so that RESTOptions can directly be used when available (i.e. tests)
+func (opts RESTOptions) GetRESTOptions(schema.GroupResource) (RESTOptions, error) {
+	return opts, nil
+}
+
+type RESTOptionsGetter interface {
+	GetRESTOptions(resource schema.GroupResource) (RESTOptions, error)
+}
+
+// StoreOptions is set of configuration options used to complete generic registries.
+type StoreOptions struct {
+	RESTOptions RESTOptionsGetter
+	TriggerFunc storage.TriggerPublisherFunc
+	AttrFunc    storage.AttrFunc
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/registry/generic/registry/decorated_watcher.go b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/generic/registry/decorated_watcher.go
new file mode 100644
index 0000000..f589dd1
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/generic/registry/decorated_watcher.go
@@ -0,0 +1,96 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package registry
+
+import (
+	"context"
+	"net/http"
+
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/watch"
+)
+
+type decoratedWatcher struct {
+	w         watch.Interface
+	decorator ObjectFunc
+	cancel    context.CancelFunc
+	resultCh  chan watch.Event
+}
+
+func newDecoratedWatcher(w watch.Interface, decorator ObjectFunc) *decoratedWatcher {
+	ctx, cancel := context.WithCancel(context.Background())
+	d := &decoratedWatcher{
+		w:         w,
+		decorator: decorator,
+		cancel:    cancel,
+		resultCh:  make(chan watch.Event),
+	}
+	go d.run(ctx)
+	return d
+}
+
+func (d *decoratedWatcher) run(ctx context.Context) {
+	var recv, send watch.Event
+	for {
+		select {
+		case recv = <-d.w.ResultChan():
+			switch recv.Type {
+			case watch.Added, watch.Modified, watch.Deleted:
+				err := d.decorator(recv.Object)
+				if err != nil {
+					send = makeStatusErrorEvent(err)
+					break
+				}
+				send = recv
+			case watch.Error:
+				send = recv
+			}
+			select {
+			case d.resultCh <- send:
+				if send.Type == watch.Error {
+					d.cancel()
+				}
+			case <-ctx.Done():
+			}
+		case <-ctx.Done():
+			d.w.Stop()
+			close(d.resultCh)
+			return
+		}
+	}
+}
+
+func (d *decoratedWatcher) Stop() {
+	d.cancel()
+}
+
+func (d *decoratedWatcher) ResultChan() <-chan watch.Event {
+	return d.resultCh
+}
+
+func makeStatusErrorEvent(err error) watch.Event {
+	status := &metav1.Status{
+		Status:  metav1.StatusFailure,
+		Message: err.Error(),
+		Code:    http.StatusInternalServerError,
+		Reason:  metav1.StatusReasonInternalError,
+	}
+	return watch.Event{
+		Type:   watch.Error,
+		Object: status,
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/registry/generic/registry/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/generic/registry/doc.go
new file mode 100644
index 0000000..bd315ae
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/generic/registry/doc.go
@@ -0,0 +1,19 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+// Package etcd has a generic implementation of a registry that
+// stores things in etcd.
+package registry // import "k8s.io/apiserver/pkg/registry/generic/registry"
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/registry/generic/registry/storage_factory.go b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/generic/registry/storage_factory.go
new file mode 100644
index 0000000..c1ef906
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/generic/registry/storage_factory.go
@@ -0,0 +1,119 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+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.
+*/
+
+package registry
+
+import (
+	"sync"
+
+	"github.com/golang/glog"
+
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apiserver/pkg/registry/generic"
+	"k8s.io/apiserver/pkg/storage"
+	etcdstorage "k8s.io/apiserver/pkg/storage/etcd"
+	"k8s.io/apiserver/pkg/storage/storagebackend"
+	"k8s.io/apiserver/pkg/storage/storagebackend/factory"
+)
+
+// Creates a cacher based given storageConfig.
+func StorageWithCacher(capacity int) generic.StorageDecorator {
+	return func(
+		storageConfig *storagebackend.Config,
+		objectType runtime.Object,
+		resourcePrefix string,
+		keyFunc func(obj runtime.Object) (string, error),
+		newListFunc func() runtime.Object,
+		getAttrsFunc storage.AttrFunc,
+		triggerFunc storage.TriggerPublisherFunc) (storage.Interface, factory.DestroyFunc) {
+
+		s, d := generic.NewRawStorage(storageConfig)
+		if capacity == 0 {
+			glog.V(5).Infof("Storage caching is disabled for %T", objectType)
+			return s, d
+		}
+		glog.V(5).Infof("Storage caching is enabled for %T with capacity %v", objectType, capacity)
+
+		// TODO: we would change this later to make storage always have cacher and hide low level KV layer inside.
+		// Currently it has two layers of same storage interface -- cacher and low level kv.
+		cacherConfig := storage.CacherConfig{
+			CacheCapacity:        capacity,
+			Storage:              s,
+			Versioner:            etcdstorage.APIObjectVersioner{},
+			Type:                 objectType,
+			ResourcePrefix:       resourcePrefix,
+			KeyFunc:              keyFunc,
+			NewListFunc:          newListFunc,
+			GetAttrsFunc:         getAttrsFunc,
+			TriggerPublisherFunc: triggerFunc,
+			Codec:                storageConfig.Codec,
+		}
+		cacher := storage.NewCacherFromConfig(cacherConfig)
+		destroyFunc := func() {
+			cacher.Stop()
+			d()
+		}
+
+		// TODO : Remove RegisterStorageCleanup below when PR
+		// https://github.com/kubernetes/kubernetes/pull/50690
+		// merges as that shuts down storage properly
+		RegisterStorageCleanup(destroyFunc)
+
+		return cacher, destroyFunc
+	}
+}
+
+// TODO : Remove all the code below when PR
+// https://github.com/kubernetes/kubernetes/pull/50690
+// merges as that shuts down storage properly
+// HACK ALERT : Track the destroy methods to call them
+// from the test harness. TrackStorageCleanup will be called
+// only from the test harness, so Register/Cleanup will be
+// no-op at runtime.
+
+var cleanupLock sync.Mutex
+var cleanup []func() = nil
+
+func TrackStorageCleanup() {
+	cleanupLock.Lock()
+	defer cleanupLock.Unlock()
+
+	if cleanup != nil {
+		panic("Conflicting storage tracking")
+	}
+	cleanup = make([]func(), 0)
+}
+
+func RegisterStorageCleanup(fn func()) {
+	cleanupLock.Lock()
+	defer cleanupLock.Unlock()
+
+	if cleanup == nil {
+		return
+	}
+	cleanup = append(cleanup, fn)
+}
+
+func CleanupStorage() {
+	cleanupLock.Lock()
+	old := cleanup
+	cleanup = nil
+	cleanupLock.Unlock()
+
+	for _, d := range old {
+		d()
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/registry/generic/registry/store.go b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/generic/registry/store.go
new file mode 100644
index 0000000..1e799c6
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/generic/registry/store.go
@@ -0,0 +1,1416 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package registry
+
+import (
+	"context"
+	"fmt"
+	"reflect"
+	"strings"
+	"sync"
+	"time"
+
+	kubeerr "k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/api/meta"
+	"k8s.io/apimachinery/pkg/api/validation/path"
+	metainternalversion "k8s.io/apimachinery/pkg/apis/meta/internalversion"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	metav1beta1 "k8s.io/apimachinery/pkg/apis/meta/v1beta1"
+	"k8s.io/apimachinery/pkg/fields"
+	"k8s.io/apimachinery/pkg/labels"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
+	"k8s.io/apimachinery/pkg/util/sets"
+	"k8s.io/apimachinery/pkg/util/validation/field"
+	"k8s.io/apimachinery/pkg/util/wait"
+	"k8s.io/apimachinery/pkg/watch"
+	genericapirequest "k8s.io/apiserver/pkg/endpoints/request"
+	"k8s.io/apiserver/pkg/registry/generic"
+	"k8s.io/apiserver/pkg/registry/rest"
+	"k8s.io/apiserver/pkg/storage"
+	storeerr "k8s.io/apiserver/pkg/storage/errors"
+	"k8s.io/apiserver/pkg/storage/etcd/metrics"
+
+	"github.com/golang/glog"
+)
+
+// ObjectFunc is a function to act on a given object. An error may be returned
+// if the hook cannot be completed. An ObjectFunc may transform the provided
+// object.
+type ObjectFunc func(obj runtime.Object) error
+
+// GenericStore interface can be used for type assertions when we need to access the underlying strategies.
+type GenericStore interface {
+	GetCreateStrategy() rest.RESTCreateStrategy
+	GetUpdateStrategy() rest.RESTUpdateStrategy
+	GetDeleteStrategy() rest.RESTDeleteStrategy
+	GetExportStrategy() rest.RESTExportStrategy
+}
+
+// Store implements pkg/api/rest.StandardStorage. It's intended to be
+// embeddable and allows the consumer to implement any non-generic functions
+// that are required. This object is intended to be copyable so that it can be
+// used in different ways but share the same underlying behavior.
+//
+// All fields are required unless specified.
+//
+// The intended use of this type is embedding within a Kind specific
+// RESTStorage implementation. This type provides CRUD semantics on a Kubelike
+// resource, handling details like conflict detection with ResourceVersion and
+// semantics. The RESTCreateStrategy, RESTUpdateStrategy, and
+// RESTDeleteStrategy are generic across all backends, and encapsulate logic
+// specific to the API.
+//
+// TODO: make the default exposed methods exactly match a generic RESTStorage
+type Store struct {
+	// NewFunc returns a new instance of the type this registry returns for a
+	// GET of a single object, e.g.:
+	//
+	// curl GET /apis/group/version/namespaces/my-ns/myresource/name-of-object
+	NewFunc func() runtime.Object
+
+	// NewListFunc returns a new list of the type this registry; it is the
+	// type returned when the resource is listed, e.g.:
+	//
+	// curl GET /apis/group/version/namespaces/my-ns/myresource
+	NewListFunc func() runtime.Object
+
+	// DefaultQualifiedResource is the pluralized name of the resource.
+	// This field is used if there is no request info present in the context.
+	// See qualifiedResourceFromContext for details.
+	DefaultQualifiedResource schema.GroupResource
+
+	// KeyRootFunc returns the root etcd key for this resource; should not
+	// include trailing "/".  This is used for operations that work on the
+	// entire collection (listing and watching).
+	//
+	// KeyRootFunc and KeyFunc must be supplied together or not at all.
+	KeyRootFunc func(ctx context.Context) string
+
+	// KeyFunc returns the key for a specific object in the collection.
+	// KeyFunc is called for Create/Update/Get/Delete. Note that 'namespace'
+	// can be gotten from ctx.
+	//
+	// KeyFunc and KeyRootFunc must be supplied together or not at all.
+	KeyFunc func(ctx context.Context, name string) (string, error)
+
+	// ObjectNameFunc returns the name of an object or an error.
+	ObjectNameFunc func(obj runtime.Object) (string, error)
+
+	// TTLFunc returns the TTL (time to live) that objects should be persisted
+	// with. The existing parameter is the current TTL or the default for this
+	// operation. The update parameter indicates whether this is an operation
+	// against an existing object.
+	//
+	// Objects that are persisted with a TTL are evicted once the TTL expires.
+	TTLFunc func(obj runtime.Object, existing uint64, update bool) (uint64, error)
+
+	// PredicateFunc returns a matcher corresponding to the provided labels
+	// and fields. The SelectionPredicate returned should return true if the
+	// object matches the given field and label selectors.
+	PredicateFunc func(label labels.Selector, field fields.Selector) storage.SelectionPredicate
+
+	// EnableGarbageCollection affects the handling of Update and Delete
+	// requests. Enabling garbage collection allows finalizers to do work to
+	// finalize this object before the store deletes it.
+	//
+	// If any store has garbage collection enabled, it must also be enabled in
+	// the kube-controller-manager.
+	EnableGarbageCollection bool
+
+	// DeleteCollectionWorkers is the maximum number of workers in a single
+	// DeleteCollection call. Delete requests for the items in a collection
+	// are issued in parallel.
+	DeleteCollectionWorkers int
+
+	// Decorator is an optional exit hook on an object returned from the
+	// underlying storage. The returned object could be an individual object
+	// (e.g. Pod) or a list type (e.g. PodList). Decorator is intended for
+	// integrations that are above storage and should only be used for
+	// specific cases where storage of the value is not appropriate, since
+	// they cannot be watched.
+	Decorator ObjectFunc
+	// CreateStrategy implements resource-specific behavior during creation.
+	CreateStrategy rest.RESTCreateStrategy
+	// AfterCreate implements a further operation to run after a resource is
+	// created and before it is decorated, optional.
+	AfterCreate ObjectFunc
+
+	// UpdateStrategy implements resource-specific behavior during updates.
+	UpdateStrategy rest.RESTUpdateStrategy
+	// AfterUpdate implements a further operation to run after a resource is
+	// updated and before it is decorated, optional.
+	AfterUpdate ObjectFunc
+
+	// DeleteStrategy implements resource-specific behavior during deletion.
+	DeleteStrategy rest.RESTDeleteStrategy
+	// AfterDelete implements a further operation to run after a resource is
+	// deleted and before it is decorated, optional.
+	AfterDelete ObjectFunc
+	// ReturnDeletedObject determines whether the Store returns the object
+	// that was deleted. Otherwise, return a generic success status response.
+	ReturnDeletedObject bool
+	// ExportStrategy implements resource-specific behavior during export,
+	// optional. Exported objects are not decorated.
+	ExportStrategy rest.RESTExportStrategy
+	// TableConvertor is an optional interface for transforming items or lists
+	// of items into tabular output. If unset, the default will be used.
+	TableConvertor rest.TableConvertor
+
+	// Storage is the interface for the underlying storage for the resource.
+	Storage storage.Interface
+	// Called to cleanup clients used by the underlying Storage; optional.
+	DestroyFunc func()
+}
+
+// Note: the rest.StandardStorage interface aggregates the common REST verbs
+var _ rest.StandardStorage = &Store{}
+var _ rest.Exporter = &Store{}
+var _ rest.TableConvertor = &Store{}
+var _ GenericStore = &Store{}
+
+const (
+	OptimisticLockErrorMsg        = "the object has been modified; please apply your changes to the latest version and try again"
+	resourceCountPollPeriodJitter = 1.2
+)
+
+// NamespaceKeyRootFunc is the default function for constructing storage paths
+// to resource directories enforcing namespace rules.
+func NamespaceKeyRootFunc(ctx context.Context, prefix string) string {
+	key := prefix
+	ns, ok := genericapirequest.NamespaceFrom(ctx)
+	if ok && len(ns) > 0 {
+		key = key + "/" + ns
+	}
+	return key
+}
+
+// NamespaceKeyFunc is the default function for constructing storage paths to
+// a resource relative to the given prefix enforcing namespace rules. If the
+// context does not contain a namespace, it errors.
+func NamespaceKeyFunc(ctx context.Context, prefix string, name string) (string, error) {
+	key := NamespaceKeyRootFunc(ctx, prefix)
+	ns, ok := genericapirequest.NamespaceFrom(ctx)
+	if !ok || len(ns) == 0 {
+		return "", kubeerr.NewBadRequest("Namespace parameter required.")
+	}
+	if len(name) == 0 {
+		return "", kubeerr.NewBadRequest("Name parameter required.")
+	}
+	if msgs := path.IsValidPathSegmentName(name); len(msgs) != 0 {
+		return "", kubeerr.NewBadRequest(fmt.Sprintf("Name parameter invalid: %q: %s", name, strings.Join(msgs, ";")))
+	}
+	key = key + "/" + name
+	return key, nil
+}
+
+// NoNamespaceKeyFunc is the default function for constructing storage paths
+// to a resource relative to the given prefix without a namespace.
+func NoNamespaceKeyFunc(ctx context.Context, prefix string, name string) (string, error) {
+	if len(name) == 0 {
+		return "", kubeerr.NewBadRequest("Name parameter required.")
+	}
+	if msgs := path.IsValidPathSegmentName(name); len(msgs) != 0 {
+		return "", kubeerr.NewBadRequest(fmt.Sprintf("Name parameter invalid: %q: %s", name, strings.Join(msgs, ";")))
+	}
+	key := prefix + "/" + name
+	return key, nil
+}
+
+// New implements RESTStorage.New.
+func (e *Store) New() runtime.Object {
+	return e.NewFunc()
+}
+
+// NewList implements rest.Lister.
+func (e *Store) NewList() runtime.Object {
+	return e.NewListFunc()
+}
+
+// NamespaceScoped indicates whether the resource is namespaced
+func (e *Store) NamespaceScoped() bool {
+	if e.CreateStrategy != nil {
+		return e.CreateStrategy.NamespaceScoped()
+	}
+	if e.UpdateStrategy != nil {
+		return e.UpdateStrategy.NamespaceScoped()
+	}
+
+	panic("programmer error: no CRUD for resource, you're crazy, override NamespaceScoped too")
+}
+
+// GetCreateStrategy implements GenericStore.
+func (e *Store) GetCreateStrategy() rest.RESTCreateStrategy {
+	return e.CreateStrategy
+}
+
+// GetUpdateStrategy implements GenericStore.
+func (e *Store) GetUpdateStrategy() rest.RESTUpdateStrategy {
+	return e.UpdateStrategy
+}
+
+// GetDeleteStrategy implements GenericStore.
+func (e *Store) GetDeleteStrategy() rest.RESTDeleteStrategy {
+	return e.DeleteStrategy
+}
+
+// GetExportStrategy implements GenericStore.
+func (e *Store) GetExportStrategy() rest.RESTExportStrategy {
+	return e.ExportStrategy
+}
+
+// List returns a list of items matching labels and field according to the
+// store's PredicateFunc.
+func (e *Store) List(ctx context.Context, options *metainternalversion.ListOptions) (runtime.Object, error) {
+	label := labels.Everything()
+	if options != nil && options.LabelSelector != nil {
+		label = options.LabelSelector
+	}
+	field := fields.Everything()
+	if options != nil && options.FieldSelector != nil {
+		field = options.FieldSelector
+	}
+	out, err := e.ListPredicate(ctx, e.PredicateFunc(label, field), options)
+	if err != nil {
+		return nil, err
+	}
+	if e.Decorator != nil {
+		if err := e.Decorator(out); err != nil {
+			return nil, err
+		}
+	}
+	return out, nil
+}
+
+// ListPredicate returns a list of all the items matching the given
+// SelectionPredicate.
+func (e *Store) ListPredicate(ctx context.Context, p storage.SelectionPredicate, options *metainternalversion.ListOptions) (runtime.Object, error) {
+	if options == nil {
+		// By default we should serve the request from etcd.
+		options = &metainternalversion.ListOptions{ResourceVersion: ""}
+	}
+	p.IncludeUninitialized = options.IncludeUninitialized
+	p.Limit = options.Limit
+	p.Continue = options.Continue
+	list := e.NewListFunc()
+	qualifiedResource := e.qualifiedResourceFromContext(ctx)
+	if name, ok := p.MatchesSingle(); ok {
+		if key, err := e.KeyFunc(ctx, name); err == nil {
+			err := e.Storage.GetToList(ctx, key, options.ResourceVersion, p, list)
+			return list, storeerr.InterpretListError(err, qualifiedResource)
+		}
+		// if we cannot extract a key based on the current context, the optimization is skipped
+	}
+
+	err := e.Storage.List(ctx, e.KeyRootFunc(ctx), options.ResourceVersion, p, list)
+	return list, storeerr.InterpretListError(err, qualifiedResource)
+}
+
+// Create inserts a new item according to the unique key from the object.
+func (e *Store) Create(ctx context.Context, obj runtime.Object, createValidation rest.ValidateObjectFunc, includeUninitialized bool) (runtime.Object, error) {
+	if err := rest.BeforeCreate(e.CreateStrategy, ctx, obj); err != nil {
+		return nil, err
+	}
+	// at this point we have a fully formed object.  It is time to call the validators that the apiserver
+	// handling chain wants to enforce.
+	if createValidation != nil {
+		if err := createValidation(obj.DeepCopyObject()); err != nil {
+			return nil, err
+		}
+	}
+
+	name, err := e.ObjectNameFunc(obj)
+	if err != nil {
+		return nil, err
+	}
+	key, err := e.KeyFunc(ctx, name)
+	if err != nil {
+		return nil, err
+	}
+	qualifiedResource := e.qualifiedResourceFromContext(ctx)
+	ttl, err := e.calculateTTL(obj, 0, false)
+	if err != nil {
+		return nil, err
+	}
+	out := e.NewFunc()
+	if err := e.Storage.Create(ctx, key, obj, out, ttl); err != nil {
+		err = storeerr.InterpretCreateError(err, qualifiedResource, name)
+		err = rest.CheckGeneratedNameError(e.CreateStrategy, err, obj)
+		if !kubeerr.IsAlreadyExists(err) {
+			return nil, err
+		}
+		if errGet := e.Storage.Get(ctx, key, "", out, false); errGet != nil {
+			return nil, err
+		}
+		accessor, errGetAcc := meta.Accessor(out)
+		if errGetAcc != nil {
+			return nil, err
+		}
+		if accessor.GetDeletionTimestamp() != nil {
+			msg := &err.(*kubeerr.StatusError).ErrStatus.Message
+			*msg = fmt.Sprintf("object is being deleted: %s", *msg)
+		}
+		return nil, err
+	}
+	if e.AfterCreate != nil {
+		if err := e.AfterCreate(out); err != nil {
+			return nil, err
+		}
+	}
+	if e.Decorator != nil {
+		if err := e.Decorator(out); err != nil {
+			return nil, err
+		}
+	}
+	if !includeUninitialized {
+		return e.WaitForInitialized(ctx, out)
+	}
+	return out, nil
+}
+
+// WaitForInitialized holds until the object is initialized, or returns an error if the default limit expires.
+// This method is exposed publicly for consumers of generic rest tooling.
+func (e *Store) WaitForInitialized(ctx context.Context, obj runtime.Object) (runtime.Object, error) {
+	// return early if we don't have initializers, or if they've completed already
+	accessor, err := meta.Accessor(obj)
+	if err != nil {
+		return obj, nil
+	}
+	initializers := accessor.GetInitializers()
+	if initializers == nil {
+		return obj, nil
+	}
+	if result := initializers.Result; result != nil {
+		return nil, kubeerr.FromObject(result)
+	}
+
+	key, err := e.KeyFunc(ctx, accessor.GetName())
+	if err != nil {
+		return nil, err
+	}
+	qualifiedResource := e.qualifiedResourceFromContext(ctx)
+	w, err := e.Storage.Watch(ctx, key, accessor.GetResourceVersion(), storage.SelectionPredicate{
+		Label: labels.Everything(),
+		Field: fields.Everything(),
+
+		IncludeUninitialized: true,
+	})
+	if err != nil {
+		return nil, err
+	}
+	defer w.Stop()
+
+	latest := obj
+	ch := w.ResultChan()
+	for {
+		select {
+		case event, ok := <-ch:
+			if !ok {
+				msg := fmt.Sprintf("server has timed out waiting for the initialization of %s %s",
+					qualifiedResource.String(), accessor.GetName())
+				return nil, kubeerr.NewTimeoutError(msg, 0)
+			}
+			switch event.Type {
+			case watch.Deleted:
+				if latest = event.Object; latest != nil {
+					if accessor, err := meta.Accessor(latest); err == nil {
+						if initializers := accessor.GetInitializers(); initializers != nil && initializers.Result != nil {
+							// initialization failed, but we missed the modification event
+							return nil, kubeerr.FromObject(initializers.Result)
+						}
+					}
+				}
+				return nil, kubeerr.NewInternalError(fmt.Errorf("object deleted while waiting for creation"))
+			case watch.Error:
+				if status, ok := event.Object.(*metav1.Status); ok {
+					return nil, &kubeerr.StatusError{ErrStatus: *status}
+				}
+				return nil, kubeerr.NewInternalError(fmt.Errorf("unexpected object in watch stream, can't complete initialization %T", event.Object))
+			case watch.Modified:
+				latest = event.Object
+				accessor, err = meta.Accessor(latest)
+				if err != nil {
+					return nil, kubeerr.NewInternalError(fmt.Errorf("object no longer has access to metadata %T: %v", latest, err))
+				}
+				initializers := accessor.GetInitializers()
+				if initializers == nil {
+					// completed initialization
+					return latest, nil
+				}
+				if result := initializers.Result; result != nil {
+					// initialization failed
+					return nil, kubeerr.FromObject(result)
+				}
+			}
+		case <-ctx.Done():
+			return nil, ctx.Err()
+		}
+	}
+}
+
+// shouldDeleteDuringUpdate checks if a Update is removing all the object's
+// finalizers. If so, it further checks if the object's
+// DeletionGracePeriodSeconds is 0.
+func (e *Store) shouldDeleteDuringUpdate(ctx context.Context, key string, obj, existing runtime.Object) bool {
+	newMeta, err := meta.Accessor(obj)
+	if err != nil {
+		utilruntime.HandleError(err)
+		return false
+	}
+	oldMeta, err := meta.Accessor(existing)
+	if err != nil {
+		utilruntime.HandleError(err)
+		return false
+	}
+	return len(newMeta.GetFinalizers()) == 0 && oldMeta.GetDeletionGracePeriodSeconds() != nil && *oldMeta.GetDeletionGracePeriodSeconds() == 0
+}
+
+// shouldDeleteForFailedInitialization returns true if the provided object is initializing and has
+// a failure recorded.
+func (e *Store) shouldDeleteForFailedInitialization(ctx context.Context, obj runtime.Object) bool {
+	m, err := meta.Accessor(obj)
+	if err != nil {
+		utilruntime.HandleError(err)
+		return false
+	}
+	if initializers := m.GetInitializers(); initializers != nil && initializers.Result != nil {
+		return true
+	}
+	return false
+}
+
+// deleteWithoutFinalizers handles deleting an object ignoring its finalizer list.
+// Used for objects that are either been finalized or have never initialized.
+func (e *Store) deleteWithoutFinalizers(ctx context.Context, name, key string, obj runtime.Object, preconditions *storage.Preconditions) (runtime.Object, bool, error) {
+	out := e.NewFunc()
+	glog.V(6).Infof("going to delete %s from registry, triggered by update", name)
+	if err := e.Storage.Delete(ctx, key, out, preconditions); err != nil {
+		// Deletion is racy, i.e., there could be multiple update
+		// requests to remove all finalizers from the object, so we
+		// ignore the NotFound error.
+		if storage.IsNotFound(err) {
+			_, err := e.finalizeDelete(ctx, obj, true)
+			// clients are expecting an updated object if a PUT succeeded,
+			// but finalizeDelete returns a metav1.Status, so return
+			// the object in the request instead.
+			return obj, false, err
+		}
+		return nil, false, storeerr.InterpretDeleteError(err, e.qualifiedResourceFromContext(ctx), name)
+	}
+	_, err := e.finalizeDelete(ctx, out, true)
+	// clients are expecting an updated object if a PUT succeeded, but
+	// finalizeDelete returns a metav1.Status, so return the object in
+	// the request instead.
+	return obj, false, err
+}
+
+// Update performs an atomic update and set of the object. Returns the result of the update
+// or an error. If the registry allows create-on-update, the create flow will be executed.
+// A bool is returned along with the object and any errors, to indicate object creation.
+func (e *Store) Update(ctx context.Context, name string, objInfo rest.UpdatedObjectInfo, createValidation rest.ValidateObjectFunc, updateValidation rest.ValidateObjectUpdateFunc) (runtime.Object, bool, error) {
+	key, err := e.KeyFunc(ctx, name)
+	if err != nil {
+		return nil, false, err
+	}
+
+	var (
+		creatingObj runtime.Object
+		creating    = false
+	)
+
+	qualifiedResource := e.qualifiedResourceFromContext(ctx)
+	storagePreconditions := &storage.Preconditions{}
+	if preconditions := objInfo.Preconditions(); preconditions != nil {
+		storagePreconditions.UID = preconditions.UID
+	}
+
+	out := e.NewFunc()
+	// deleteObj is only used in case a deletion is carried out
+	var deleteObj runtime.Object
+	err = e.Storage.GuaranteedUpdate(ctx, key, out, true, storagePreconditions, func(existing runtime.Object, res storage.ResponseMeta) (runtime.Object, *uint64, error) {
+		// Given the existing object, get the new object
+		obj, err := objInfo.UpdatedObject(ctx, existing)
+		if err != nil {
+			return nil, nil, err
+		}
+
+		// If AllowUnconditionalUpdate() is true and the object specified by
+		// the user does not have a resource version, then we populate it with
+		// the latest version. Else, we check that the version specified by
+		// the user matches the version of latest storage object.
+		resourceVersion, err := e.Storage.Versioner().ObjectResourceVersion(obj)
+		if err != nil {
+			return nil, nil, err
+		}
+		doUnconditionalUpdate := resourceVersion == 0 && e.UpdateStrategy.AllowUnconditionalUpdate()
+
+		version, err := e.Storage.Versioner().ObjectResourceVersion(existing)
+		if err != nil {
+			return nil, nil, err
+		}
+		if version == 0 {
+			if !e.UpdateStrategy.AllowCreateOnUpdate() {
+				return nil, nil, kubeerr.NewNotFound(qualifiedResource, name)
+			}
+			creating = true
+			creatingObj = obj
+			if err := rest.BeforeCreate(e.CreateStrategy, ctx, obj); err != nil {
+				return nil, nil, err
+			}
+			// at this point we have a fully formed object.  It is time to call the validators that the apiserver
+			// handling chain wants to enforce.
+			if createValidation != nil {
+				if err := createValidation(obj.DeepCopyObject()); err != nil {
+					return nil, nil, err
+				}
+			}
+			ttl, err := e.calculateTTL(obj, 0, false)
+			if err != nil {
+				return nil, nil, err
+			}
+
+			return obj, &ttl, nil
+		}
+
+		creating = false
+		creatingObj = nil
+		if doUnconditionalUpdate {
+			// Update the object's resource version to match the latest
+			// storage object's resource version.
+			err = e.Storage.Versioner().UpdateObject(obj, res.ResourceVersion)
+			if err != nil {
+				return nil, nil, err
+			}
+		} else {
+			// Check if the object's resource version matches the latest
+			// resource version.
+			if resourceVersion == 0 {
+				// TODO: The Invalid error should have a field for Resource.
+				// After that field is added, we should fill the Resource and
+				// leave the Kind field empty. See the discussion in #18526.
+				qualifiedKind := schema.GroupKind{Group: qualifiedResource.Group, Kind: qualifiedResource.Resource}
+				fieldErrList := field.ErrorList{field.Invalid(field.NewPath("metadata").Child("resourceVersion"), resourceVersion, "must be specified for an update")}
+				return nil, nil, kubeerr.NewInvalid(qualifiedKind, name, fieldErrList)
+			}
+			if resourceVersion != version {
+				return nil, nil, kubeerr.NewConflict(qualifiedResource, name, fmt.Errorf(OptimisticLockErrorMsg))
+			}
+		}
+		if err := rest.BeforeUpdate(e.UpdateStrategy, ctx, obj, existing); err != nil {
+			return nil, nil, err
+		}
+		// at this point we have a fully formed object.  It is time to call the validators that the apiserver
+		// handling chain wants to enforce.
+		if updateValidation != nil {
+			if err := updateValidation(obj.DeepCopyObject(), existing.DeepCopyObject()); err != nil {
+				return nil, nil, err
+			}
+		}
+		if e.shouldDeleteDuringUpdate(ctx, key, obj, existing) {
+			deleteObj = obj
+			return nil, nil, errEmptiedFinalizers
+		}
+		ttl, err := e.calculateTTL(obj, res.TTL, true)
+		if err != nil {
+			return nil, nil, err
+		}
+		if int64(ttl) != res.TTL {
+			return obj, &ttl, nil
+		}
+		return obj, nil, nil
+	})
+
+	if err != nil {
+		// delete the object
+		if err == errEmptiedFinalizers {
+			return e.deleteWithoutFinalizers(ctx, name, key, deleteObj, storagePreconditions)
+		}
+		if creating {
+			err = storeerr.InterpretCreateError(err, qualifiedResource, name)
+			err = rest.CheckGeneratedNameError(e.CreateStrategy, err, creatingObj)
+		} else {
+			err = storeerr.InterpretUpdateError(err, qualifiedResource, name)
+		}
+		return nil, false, err
+	}
+
+	if e.shouldDeleteForFailedInitialization(ctx, out) {
+		return e.deleteWithoutFinalizers(ctx, name, key, out, storagePreconditions)
+	}
+
+	if creating {
+		if e.AfterCreate != nil {
+			if err := e.AfterCreate(out); err != nil {
+				return nil, false, err
+			}
+		}
+	} else {
+		if e.AfterUpdate != nil {
+			if err := e.AfterUpdate(out); err != nil {
+				return nil, false, err
+			}
+		}
+	}
+	if e.Decorator != nil {
+		if err := e.Decorator(out); err != nil {
+			return nil, false, err
+		}
+	}
+	return out, creating, nil
+}
+
+// Get retrieves the item from storage.
+func (e *Store) Get(ctx context.Context, name string, options *metav1.GetOptions) (runtime.Object, error) {
+	obj := e.NewFunc()
+	key, err := e.KeyFunc(ctx, name)
+	if err != nil {
+		return nil, err
+	}
+	if err := e.Storage.Get(ctx, key, options.ResourceVersion, obj, false); err != nil {
+		return nil, storeerr.InterpretGetError(err, e.qualifiedResourceFromContext(ctx), name)
+	}
+	if e.Decorator != nil {
+		if err := e.Decorator(obj); err != nil {
+			return nil, err
+		}
+	}
+	return obj, nil
+}
+
+// qualifiedResourceFromContext attempts to retrieve a GroupResource from the context's request info.
+// If the context has no request info, DefaultQualifiedResource is used.
+func (e *Store) qualifiedResourceFromContext(ctx context.Context) schema.GroupResource {
+	if info, ok := genericapirequest.RequestInfoFrom(ctx); ok {
+		return schema.GroupResource{Group: info.APIGroup, Resource: info.Resource}
+	}
+	// some implementations access storage directly and thus the context has no RequestInfo
+	return e.DefaultQualifiedResource
+}
+
+var (
+	errAlreadyDeleting   = fmt.Errorf("abort delete")
+	errDeleteNow         = fmt.Errorf("delete now")
+	errEmptiedFinalizers = fmt.Errorf("emptied finalizers")
+)
+
+// shouldOrphanDependents returns true if the finalizer for orphaning should be set
+// updated for FinalizerOrphanDependents. In the order of highest to lowest
+// priority, there are three factors affect whether to add/remove the
+// FinalizerOrphanDependents: options, existing finalizers of the object,
+// and e.DeleteStrategy.DefaultGarbageCollectionPolicy.
+func shouldOrphanDependents(ctx context.Context, e *Store, accessor metav1.Object, options *metav1.DeleteOptions) bool {
+	// Get default GC policy from this REST object type
+	gcStrategy, ok := e.DeleteStrategy.(rest.GarbageCollectionDeleteStrategy)
+	var defaultGCPolicy rest.GarbageCollectionPolicy
+	if ok {
+		defaultGCPolicy = gcStrategy.DefaultGarbageCollectionPolicy(ctx)
+	}
+
+	if defaultGCPolicy == rest.Unsupported {
+		// return  false to indicate that we should NOT orphan
+		return false
+	}
+
+	// An explicit policy was set at deletion time, that overrides everything
+	if options != nil && options.OrphanDependents != nil {
+		return *options.OrphanDependents
+	}
+	if options != nil && options.PropagationPolicy != nil {
+		switch *options.PropagationPolicy {
+		case metav1.DeletePropagationOrphan:
+			return true
+		case metav1.DeletePropagationBackground, metav1.DeletePropagationForeground:
+			return false
+		}
+	}
+
+	// If a finalizer is set in the object, it overrides the default
+	// validation should make sure the two cases won't be true at the same time.
+	finalizers := accessor.GetFinalizers()
+	for _, f := range finalizers {
+		switch f {
+		case metav1.FinalizerOrphanDependents:
+			return true
+		case metav1.FinalizerDeleteDependents:
+			return false
+		}
+	}
+
+	// Get default orphan policy from this REST object type if it exists
+	if defaultGCPolicy == rest.OrphanDependents {
+		return true
+	}
+	return false
+}
+
+// shouldDeleteDependents returns true if the finalizer for foreground deletion should be set
+// updated for FinalizerDeleteDependents. In the order of highest to lowest
+// priority, there are three factors affect whether to add/remove the
+// FinalizerDeleteDependents: options, existing finalizers of the object, and
+// e.DeleteStrategy.DefaultGarbageCollectionPolicy.
+func shouldDeleteDependents(ctx context.Context, e *Store, accessor metav1.Object, options *metav1.DeleteOptions) bool {
+	// Get default GC policy from this REST object type
+	if gcStrategy, ok := e.DeleteStrategy.(rest.GarbageCollectionDeleteStrategy); ok && gcStrategy.DefaultGarbageCollectionPolicy(ctx) == rest.Unsupported {
+		// return false to indicate that we should NOT delete in foreground
+		return false
+	}
+
+	// If an explicit policy was set at deletion time, that overrides both
+	if options != nil && options.OrphanDependents != nil {
+		return false
+	}
+	if options != nil && options.PropagationPolicy != nil {
+		switch *options.PropagationPolicy {
+		case metav1.DeletePropagationForeground:
+			return true
+		case metav1.DeletePropagationBackground, metav1.DeletePropagationOrphan:
+			return false
+		}
+	}
+
+	// If a finalizer is set in the object, it overrides the default
+	// validation has made sure the two cases won't be true at the same time.
+	finalizers := accessor.GetFinalizers()
+	for _, f := range finalizers {
+		switch f {
+		case metav1.FinalizerDeleteDependents:
+			return true
+		case metav1.FinalizerOrphanDependents:
+			return false
+		}
+	}
+
+	return false
+}
+
+// deletionFinalizersForGarbageCollection analyzes the object and delete options
+// to determine whether the object is in need of finalization by the garbage
+// collector. If so, returns the set of deletion finalizers to apply and a bool
+// indicating whether the finalizer list has changed and is in need of updating.
+//
+// The finalizers returned are intended to be handled by the garbage collector.
+// If garbage collection is disabled for the store, this function returns false
+// to ensure finalizers aren't set which will never be cleared.
+func deletionFinalizersForGarbageCollection(ctx context.Context, e *Store, accessor metav1.Object, options *metav1.DeleteOptions) (bool, []string) {
+	if !e.EnableGarbageCollection {
+		return false, []string{}
+	}
+	shouldOrphan := shouldOrphanDependents(ctx, e, accessor, options)
+	shouldDeleteDependentInForeground := shouldDeleteDependents(ctx, e, accessor, options)
+	newFinalizers := []string{}
+
+	// first remove both finalizers, add them back if needed.
+	for _, f := range accessor.GetFinalizers() {
+		if f == metav1.FinalizerOrphanDependents || f == metav1.FinalizerDeleteDependents {
+			continue
+		}
+		newFinalizers = append(newFinalizers, f)
+	}
+
+	if shouldOrphan {
+		newFinalizers = append(newFinalizers, metav1.FinalizerOrphanDependents)
+	}
+	if shouldDeleteDependentInForeground {
+		newFinalizers = append(newFinalizers, metav1.FinalizerDeleteDependents)
+	}
+
+	oldFinalizerSet := sets.NewString(accessor.GetFinalizers()...)
+	newFinalizersSet := sets.NewString(newFinalizers...)
+	if oldFinalizerSet.Equal(newFinalizersSet) {
+		return false, accessor.GetFinalizers()
+	}
+	return true, newFinalizers
+}
+
+// markAsDeleting sets the obj's DeletionGracePeriodSeconds to 0, and sets the
+// DeletionTimestamp to "now". Finalizers are watching for such updates and will
+// finalize the object if their IDs are present in the object's Finalizers list.
+func markAsDeleting(obj runtime.Object) (err error) {
+	objectMeta, kerr := meta.Accessor(obj)
+	if kerr != nil {
+		return kerr
+	}
+	now := metav1.NewTime(time.Now())
+	// This handles Generation bump for resources that don't support graceful
+	// deletion. For resources that support graceful deletion is handle in
+	// pkg/api/rest/delete.go
+	if objectMeta.GetDeletionTimestamp() == nil && objectMeta.GetGeneration() > 0 {
+		objectMeta.SetGeneration(objectMeta.GetGeneration() + 1)
+	}
+	objectMeta.SetDeletionTimestamp(&now)
+	var zero int64 = 0
+	objectMeta.SetDeletionGracePeriodSeconds(&zero)
+	return nil
+}
+
+// updateForGracefulDeletionAndFinalizers updates the given object for
+// graceful deletion and finalization by setting the deletion timestamp and
+// grace period seconds (graceful deletion) and updating the list of
+// finalizers (finalization); it returns:
+//
+// 1. an error
+// 2. a boolean indicating that the object was not found, but it should be
+//    ignored
+// 3. a boolean indicating that the object's grace period is exhausted and it
+//    should be deleted immediately
+// 4. a new output object with the state that was updated
+// 5. a copy of the last existing state of the object
+func (e *Store) updateForGracefulDeletionAndFinalizers(ctx context.Context, name, key string, options *metav1.DeleteOptions, preconditions storage.Preconditions, in runtime.Object) (err error, ignoreNotFound, deleteImmediately bool, out, lastExisting runtime.Object) {
+	lastGraceful := int64(0)
+	var pendingFinalizers bool
+	out = e.NewFunc()
+	err = e.Storage.GuaranteedUpdate(
+		ctx,
+		key,
+		out,
+		false, /* ignoreNotFound */
+		&preconditions,
+		storage.SimpleUpdate(func(existing runtime.Object) (runtime.Object, error) {
+			graceful, pendingGraceful, err := rest.BeforeDelete(e.DeleteStrategy, ctx, existing, options)
+			if err != nil {
+				return nil, err
+			}
+			if pendingGraceful {
+				return nil, errAlreadyDeleting
+			}
+
+			// Add/remove the orphan finalizer as the options dictates.
+			// Note that this occurs after checking pendingGraceufl, so
+			// finalizers cannot be updated via DeleteOptions if deletion has
+			// started.
+			existingAccessor, err := meta.Accessor(existing)
+			if err != nil {
+				return nil, err
+			}
+			needsUpdate, newFinalizers := deletionFinalizersForGarbageCollection(ctx, e, existingAccessor, options)
+			if needsUpdate {
+				existingAccessor.SetFinalizers(newFinalizers)
+			}
+
+			pendingFinalizers = len(existingAccessor.GetFinalizers()) != 0
+			if !graceful {
+				// set the DeleteGracePeriods to 0 if the object has pendingFinalizers but not supporting graceful deletion
+				if pendingFinalizers {
+					glog.V(6).Infof("update the DeletionTimestamp to \"now\" and GracePeriodSeconds to 0 for object %s, because it has pending finalizers", name)
+					err = markAsDeleting(existing)
+					if err != nil {
+						return nil, err
+					}
+					return existing, nil
+				}
+				return nil, errDeleteNow
+			}
+			lastGraceful = *options.GracePeriodSeconds
+			lastExisting = existing
+			return existing, nil
+		}),
+	)
+	switch err {
+	case nil:
+		// If there are pending finalizers, we never delete the object immediately.
+		if pendingFinalizers {
+			return nil, false, false, out, lastExisting
+		}
+		if lastGraceful > 0 {
+			return nil, false, false, out, lastExisting
+		}
+		// If we are here, the registry supports grace period mechanism and
+		// we are intentionally delete gracelessly. In this case, we may
+		// enter a race with other k8s components. If other component wins
+		// the race, the object will not be found, and we should tolerate
+		// the NotFound error. See
+		// https://github.com/kubernetes/kubernetes/issues/19403 for
+		// details.
+		return nil, true, true, out, lastExisting
+	case errDeleteNow:
+		// we've updated the object to have a zero grace period, or it's already at 0, so
+		// we should fall through and truly delete the object.
+		return nil, false, true, out, lastExisting
+	case errAlreadyDeleting:
+		out, err = e.finalizeDelete(ctx, in, true)
+		return err, false, false, out, lastExisting
+	default:
+		return storeerr.InterpretUpdateError(err, e.qualifiedResourceFromContext(ctx), name), false, false, out, lastExisting
+	}
+}
+
+// Delete removes the item from storage.
+func (e *Store) Delete(ctx context.Context, name string, options *metav1.DeleteOptions) (runtime.Object, bool, error) {
+	key, err := e.KeyFunc(ctx, name)
+	if err != nil {
+		return nil, false, err
+	}
+	obj := e.NewFunc()
+	qualifiedResource := e.qualifiedResourceFromContext(ctx)
+	if err := e.Storage.Get(ctx, key, "", obj, false); err != nil {
+		return nil, false, storeerr.InterpretDeleteError(err, qualifiedResource, name)
+	}
+	// support older consumers of delete by treating "nil" as delete immediately
+	if options == nil {
+		options = metav1.NewDeleteOptions(0)
+	}
+	var preconditions storage.Preconditions
+	if options.Preconditions != nil {
+		preconditions.UID = options.Preconditions.UID
+	}
+	graceful, pendingGraceful, err := rest.BeforeDelete(e.DeleteStrategy, ctx, obj, options)
+	if err != nil {
+		return nil, false, err
+	}
+	// this means finalizers cannot be updated via DeleteOptions if a deletion is already pending
+	if pendingGraceful {
+		out, err := e.finalizeDelete(ctx, obj, false)
+		return out, false, err
+	}
+	// check if obj has pending finalizers
+	accessor, err := meta.Accessor(obj)
+	if err != nil {
+		return nil, false, kubeerr.NewInternalError(err)
+	}
+	pendingFinalizers := len(accessor.GetFinalizers()) != 0
+	var ignoreNotFound bool
+	var deleteImmediately bool = true
+	var lastExisting, out runtime.Object
+
+	// Handle combinations of graceful deletion and finalization by issuing
+	// the correct updates.
+	shouldUpdateFinalizers, _ := deletionFinalizersForGarbageCollection(ctx, e, accessor, options)
+	// TODO: remove the check, because we support no-op updates now.
+	if graceful || pendingFinalizers || shouldUpdateFinalizers {
+		err, ignoreNotFound, deleteImmediately, out, lastExisting = e.updateForGracefulDeletionAndFinalizers(ctx, name, key, options, preconditions, obj)
+	}
+
+	// !deleteImmediately covers all cases where err != nil. We keep both to be future-proof.
+	if !deleteImmediately || err != nil {
+		return out, false, err
+	}
+
+	// delete immediately, or no graceful deletion supported
+	glog.V(6).Infof("going to delete %s from registry: ", name)
+	out = e.NewFunc()
+	if err := e.Storage.Delete(ctx, key, out, &preconditions); err != nil {
+		// Please refer to the place where we set ignoreNotFound for the reason
+		// why we ignore the NotFound error .
+		if storage.IsNotFound(err) && ignoreNotFound && lastExisting != nil {
+			// The lastExisting object may not be the last state of the object
+			// before its deletion, but it's the best approximation.
+			out, err := e.finalizeDelete(ctx, lastExisting, true)
+			return out, true, err
+		}
+		return nil, false, storeerr.InterpretDeleteError(err, qualifiedResource, name)
+	}
+	out, err = e.finalizeDelete(ctx, out, true)
+	return out, true, err
+}
+
+// DeleteCollection removes all items returned by List with a given ListOptions from storage.
+//
+// DeleteCollection is currently NOT atomic. It can happen that only subset of objects
+// will be deleted from storage, and then an error will be returned.
+// In case of success, the list of deleted objects will be returned.
+//
+// TODO: Currently, there is no easy way to remove 'directory' entry from storage (if we
+// are removing all objects of a given type) with the current API (it's technically
+// possibly with storage API, but watch is not delivered correctly then).
+// It will be possible to fix it with v3 etcd API.
+func (e *Store) DeleteCollection(ctx context.Context, options *metav1.DeleteOptions, listOptions *metainternalversion.ListOptions) (runtime.Object, error) {
+	if listOptions == nil {
+		listOptions = &metainternalversion.ListOptions{}
+	} else {
+		listOptions = listOptions.DeepCopy()
+	}
+
+	// DeleteCollection must remain backwards compatible with old clients that expect it to
+	// remove all resources, initialized or not, within the type. It is also consistent with
+	// Delete which does not require IncludeUninitialized
+	listOptions.IncludeUninitialized = true
+
+	listObj, err := e.List(ctx, listOptions)
+	if err != nil {
+		return nil, err
+	}
+	items, err := meta.ExtractList(listObj)
+	if err != nil {
+		return nil, err
+	}
+	// Spawn a number of goroutines, so that we can issue requests to storage
+	// in parallel to speed up deletion.
+	// TODO: Make this proportional to the number of items to delete, up to
+	// DeleteCollectionWorkers (it doesn't make much sense to spawn 16
+	// workers to delete 10 items).
+	workersNumber := e.DeleteCollectionWorkers
+	if workersNumber < 1 {
+		workersNumber = 1
+	}
+	wg := sync.WaitGroup{}
+	toProcess := make(chan int, 2*workersNumber)
+	errs := make(chan error, workersNumber+1)
+
+	go func() {
+		defer utilruntime.HandleCrash(func(panicReason interface{}) {
+			errs <- fmt.Errorf("DeleteCollection distributor panicked: %v", panicReason)
+		})
+		for i := 0; i < len(items); i++ {
+			toProcess <- i
+		}
+		close(toProcess)
+	}()
+
+	wg.Add(workersNumber)
+	for i := 0; i < workersNumber; i++ {
+		go func() {
+			// panics don't cross goroutine boundaries
+			defer utilruntime.HandleCrash(func(panicReason interface{}) {
+				errs <- fmt.Errorf("DeleteCollection goroutine panicked: %v", panicReason)
+			})
+			defer wg.Done()
+
+			for index := range toProcess {
+				accessor, err := meta.Accessor(items[index])
+				if err != nil {
+					errs <- err
+					return
+				}
+				if _, _, err := e.Delete(ctx, accessor.GetName(), options); err != nil && !kubeerr.IsNotFound(err) {
+					glog.V(4).Infof("Delete %s in DeleteCollection failed: %v", accessor.GetName(), err)
+					errs <- err
+					return
+				}
+			}
+		}()
+	}
+	wg.Wait()
+	select {
+	case err := <-errs:
+		return nil, err
+	default:
+		return listObj, nil
+	}
+}
+
+// finalizeDelete runs the Store's AfterDelete hook if runHooks is set and
+// returns the decorated deleted object if appropriate.
+func (e *Store) finalizeDelete(ctx context.Context, obj runtime.Object, runHooks bool) (runtime.Object, error) {
+	if runHooks && e.AfterDelete != nil {
+		if err := e.AfterDelete(obj); err != nil {
+			return nil, err
+		}
+	}
+	if e.ReturnDeletedObject {
+		if e.Decorator != nil {
+			if err := e.Decorator(obj); err != nil {
+				return nil, err
+			}
+		}
+		return obj, nil
+	}
+	// Return information about the deleted object, which enables clients to
+	// verify that the object was actually deleted and not waiting for finalizers.
+	accessor, err := meta.Accessor(obj)
+	if err != nil {
+		return nil, err
+	}
+	qualifiedResource := e.qualifiedResourceFromContext(ctx)
+	details := &metav1.StatusDetails{
+		Name:  accessor.GetName(),
+		Group: qualifiedResource.Group,
+		Kind:  qualifiedResource.Resource, // Yes we set Kind field to resource.
+		UID:   accessor.GetUID(),
+	}
+	status := &metav1.Status{Status: metav1.StatusSuccess, Details: details}
+	return status, nil
+}
+
+// Watch makes a matcher for the given label and field, and calls
+// WatchPredicate. If possible, you should customize PredicateFunc to produce
+// a matcher that matches by key. SelectionPredicate does this for you
+// automatically.
+func (e *Store) Watch(ctx context.Context, options *metainternalversion.ListOptions) (watch.Interface, error) {
+	label := labels.Everything()
+	if options != nil && options.LabelSelector != nil {
+		label = options.LabelSelector
+	}
+	field := fields.Everything()
+	if options != nil && options.FieldSelector != nil {
+		field = options.FieldSelector
+	}
+	predicate := e.PredicateFunc(label, field)
+
+	resourceVersion := ""
+	if options != nil {
+		resourceVersion = options.ResourceVersion
+		predicate.IncludeUninitialized = options.IncludeUninitialized
+	}
+	return e.WatchPredicate(ctx, predicate, resourceVersion)
+}
+
+// WatchPredicate starts a watch for the items that matches.
+func (e *Store) WatchPredicate(ctx context.Context, p storage.SelectionPredicate, resourceVersion string) (watch.Interface, error) {
+	if name, ok := p.MatchesSingle(); ok {
+		if key, err := e.KeyFunc(ctx, name); err == nil {
+			w, err := e.Storage.Watch(ctx, key, resourceVersion, p)
+			if err != nil {
+				return nil, err
+			}
+			if e.Decorator != nil {
+				return newDecoratedWatcher(w, e.Decorator), nil
+			}
+			return w, nil
+		}
+		// if we cannot extract a key based on the current context, the
+		// optimization is skipped
+	}
+
+	w, err := e.Storage.WatchList(ctx, e.KeyRootFunc(ctx), resourceVersion, p)
+	if err != nil {
+		return nil, err
+	}
+	if e.Decorator != nil {
+		return newDecoratedWatcher(w, e.Decorator), nil
+	}
+	return w, nil
+}
+
+// calculateTTL is a helper for retrieving the updated TTL for an object or
+// returning an error if the TTL cannot be calculated. The defaultTTL is
+// changed to 1 if less than zero. Zero means no TTL, not expire immediately.
+func (e *Store) calculateTTL(obj runtime.Object, defaultTTL int64, update bool) (ttl uint64, err error) {
+	// TODO: validate this is assertion is still valid.
+
+	// etcd may return a negative TTL for a node if the expiration has not
+	// occurred due to server lag - we will ensure that the value is at least
+	// set.
+	if defaultTTL < 0 {
+		defaultTTL = 1
+	}
+	ttl = uint64(defaultTTL)
+	if e.TTLFunc != nil {
+		ttl, err = e.TTLFunc(obj, ttl, update)
+	}
+	return ttl, err
+}
+
+// exportObjectMeta unsets the fields on the given object that should not be
+// present when the object is exported.
+func exportObjectMeta(accessor metav1.Object, exact bool) {
+	accessor.SetUID("")
+	if !exact {
+		accessor.SetNamespace("")
+	}
+	accessor.SetCreationTimestamp(metav1.Time{})
+	accessor.SetDeletionTimestamp(nil)
+	accessor.SetResourceVersion("")
+	accessor.SetSelfLink("")
+	if len(accessor.GetGenerateName()) > 0 && !exact {
+		accessor.SetName("")
+	}
+}
+
+// Export implements the rest.Exporter interface
+func (e *Store) Export(ctx context.Context, name string, opts metav1.ExportOptions) (runtime.Object, error) {
+	obj, err := e.Get(ctx, name, &metav1.GetOptions{})
+	if err != nil {
+		return nil, err
+	}
+	if accessor, err := meta.Accessor(obj); err == nil {
+		exportObjectMeta(accessor, opts.Exact)
+	} else {
+		glog.V(4).Infof("Object of type %v does not have ObjectMeta: %v", reflect.TypeOf(obj), err)
+	}
+
+	if e.ExportStrategy != nil {
+		if err = e.ExportStrategy.Export(ctx, obj, opts.Exact); err != nil {
+			return nil, err
+		}
+	} else {
+		e.CreateStrategy.PrepareForCreate(ctx, obj)
+	}
+	return obj, nil
+}
+
+// CompleteWithOptions updates the store with the provided options and
+// defaults common fields.
+func (e *Store) CompleteWithOptions(options *generic.StoreOptions) error {
+	if e.DefaultQualifiedResource.Empty() {
+		return fmt.Errorf("store %#v must have a non-empty qualified resource", e)
+	}
+	if e.NewFunc == nil {
+		return fmt.Errorf("store for %s must have NewFunc set", e.DefaultQualifiedResource.String())
+	}
+	if e.NewListFunc == nil {
+		return fmt.Errorf("store for %s must have NewListFunc set", e.DefaultQualifiedResource.String())
+	}
+	if (e.KeyRootFunc == nil) != (e.KeyFunc == nil) {
+		return fmt.Errorf("store for %s must set both KeyRootFunc and KeyFunc or neither", e.DefaultQualifiedResource.String())
+	}
+
+	var isNamespaced bool
+	switch {
+	case e.CreateStrategy != nil:
+		isNamespaced = e.CreateStrategy.NamespaceScoped()
+	case e.UpdateStrategy != nil:
+		isNamespaced = e.UpdateStrategy.NamespaceScoped()
+	default:
+		return fmt.Errorf("store for %s must have CreateStrategy or UpdateStrategy set", e.DefaultQualifiedResource.String())
+	}
+
+	if e.DeleteStrategy == nil {
+		return fmt.Errorf("store for %s must have DeleteStrategy set", e.DefaultQualifiedResource.String())
+	}
+
+	if options.RESTOptions == nil {
+		return fmt.Errorf("options for %s must have RESTOptions set", e.DefaultQualifiedResource.String())
+	}
+
+	attrFunc := options.AttrFunc
+	if attrFunc == nil {
+		if isNamespaced {
+			attrFunc = storage.DefaultNamespaceScopedAttr
+		} else {
+			attrFunc = storage.DefaultClusterScopedAttr
+		}
+	}
+	if e.PredicateFunc == nil {
+		e.PredicateFunc = func(label labels.Selector, field fields.Selector) storage.SelectionPredicate {
+			return storage.SelectionPredicate{
+				Label:    label,
+				Field:    field,
+				GetAttrs: attrFunc,
+			}
+		}
+	}
+
+	opts, err := options.RESTOptions.GetRESTOptions(e.DefaultQualifiedResource)
+	if err != nil {
+		return err
+	}
+
+	// ResourcePrefix must come from the underlying factory
+	prefix := opts.ResourcePrefix
+	if !strings.HasPrefix(prefix, "/") {
+		prefix = "/" + prefix
+	}
+	if prefix == "/" {
+		return fmt.Errorf("store for %s has an invalid prefix %q", e.DefaultQualifiedResource.String(), opts.ResourcePrefix)
+	}
+
+	// Set the default behavior for storage key generation
+	if e.KeyRootFunc == nil && e.KeyFunc == nil {
+		if isNamespaced {
+			e.KeyRootFunc = func(ctx context.Context) string {
+				return NamespaceKeyRootFunc(ctx, prefix)
+			}
+			e.KeyFunc = func(ctx context.Context, name string) (string, error) {
+				return NamespaceKeyFunc(ctx, prefix, name)
+			}
+		} else {
+			e.KeyRootFunc = func(ctx context.Context) string {
+				return prefix
+			}
+			e.KeyFunc = func(ctx context.Context, name string) (string, error) {
+				return NoNamespaceKeyFunc(ctx, prefix, name)
+			}
+		}
+	}
+
+	// We adapt the store's keyFunc so that we can use it with the StorageDecorator
+	// without making any assumptions about where objects are stored in etcd
+	keyFunc := func(obj runtime.Object) (string, error) {
+		accessor, err := meta.Accessor(obj)
+		if err != nil {
+			return "", err
+		}
+
+		if isNamespaced {
+			return e.KeyFunc(genericapirequest.WithNamespace(genericapirequest.NewContext(), accessor.GetNamespace()), accessor.GetName())
+		}
+
+		return e.KeyFunc(genericapirequest.NewContext(), accessor.GetName())
+	}
+
+	triggerFunc := options.TriggerFunc
+	if triggerFunc == nil {
+		triggerFunc = storage.NoTriggerPublisher
+	}
+
+	if e.DeleteCollectionWorkers == 0 {
+		e.DeleteCollectionWorkers = opts.DeleteCollectionWorkers
+	}
+
+	e.EnableGarbageCollection = opts.EnableGarbageCollection
+
+	if e.ObjectNameFunc == nil {
+		e.ObjectNameFunc = func(obj runtime.Object) (string, error) {
+			accessor, err := meta.Accessor(obj)
+			if err != nil {
+				return "", err
+			}
+			return accessor.GetName(), nil
+		}
+	}
+
+	if e.Storage == nil {
+		e.Storage, e.DestroyFunc = opts.Decorator(
+			opts.StorageConfig,
+			e.NewFunc(),
+			prefix,
+			keyFunc,
+			e.NewListFunc,
+			attrFunc,
+			triggerFunc,
+		)
+
+		if opts.CountMetricPollPeriod > 0 {
+			stopFunc := e.startObservingCount(opts.CountMetricPollPeriod)
+			previousDestroy := e.DestroyFunc
+			e.DestroyFunc = func() {
+				stopFunc()
+				if previousDestroy != nil {
+					previousDestroy()
+				}
+			}
+		}
+	}
+
+	return nil
+}
+
+// startObservingCount starts monitoring given prefix and periodically updating metrics. It returns a function to stop collection.
+func (e *Store) startObservingCount(period time.Duration) func() {
+	prefix := e.KeyRootFunc(genericapirequest.NewContext())
+	resourceName := e.DefaultQualifiedResource.String()
+	glog.V(2).Infof("Monitoring %v count at <storage-prefix>/%v", resourceName, prefix)
+	stopCh := make(chan struct{})
+	go wait.JitterUntil(func() {
+		count, err := e.Storage.Count(prefix)
+		if err != nil {
+			glog.V(5).Infof("Failed to update storage count metric: %v", err)
+			metrics.UpdateObjectCount(resourceName, -1)
+		} else {
+			metrics.UpdateObjectCount(resourceName, count)
+		}
+	}, period, resourceCountPollPeriodJitter, true, stopCh)
+	return func() { close(stopCh) }
+}
+
+func (e *Store) ConvertToTable(ctx context.Context, object runtime.Object, tableOptions runtime.Object) (*metav1beta1.Table, error) {
+	if e.TableConvertor != nil {
+		return e.TableConvertor.ConvertToTable(ctx, object, tableOptions)
+	}
+	return rest.NewDefaultTableConvertor(e.qualifiedResourceFromContext(ctx)).ConvertToTable(ctx, object, tableOptions)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/registry/generic/storage_decorator.go b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/generic/storage_decorator.go
new file mode 100644
index 0000000..94a4794
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/generic/storage_decorator.go
@@ -0,0 +1,60 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+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.
+*/
+
+package generic
+
+import (
+	"github.com/golang/glog"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apiserver/pkg/storage"
+	"k8s.io/apiserver/pkg/storage/storagebackend"
+	"k8s.io/apiserver/pkg/storage/storagebackend/factory"
+)
+
+// StorageDecorator is a function signature for producing a storage.Interface
+// and an associated DestroyFunc from given parameters.
+type StorageDecorator func(
+	config *storagebackend.Config,
+	objectType runtime.Object,
+	resourcePrefix string,
+	keyFunc func(obj runtime.Object) (string, error),
+	newListFunc func() runtime.Object,
+	getAttrsFunc storage.AttrFunc,
+	trigger storage.TriggerPublisherFunc) (storage.Interface, factory.DestroyFunc)
+
+// UndecoratedStorage returns the given a new storage from the given config
+// without any decoration.
+func UndecoratedStorage(
+	config *storagebackend.Config,
+	objectType runtime.Object,
+	resourcePrefix string,
+	keyFunc func(obj runtime.Object) (string, error),
+	newListFunc func() runtime.Object,
+	getAttrsFunc storage.AttrFunc,
+	trigger storage.TriggerPublisherFunc) (storage.Interface, factory.DestroyFunc) {
+	return NewRawStorage(config)
+}
+
+// NewRawStorage creates the low level kv storage. This is a work-around for current
+// two layer of same storage interface.
+// TODO: Once cacher is enabled on all registries (event registry is special), we will remove this method.
+func NewRawStorage(config *storagebackend.Config) (storage.Interface, factory.DestroyFunc) {
+	s, d, err := factory.Create(*config)
+	if err != nil {
+		glog.Fatalf("Unable to create storage backend: config (%v), err (%v)", config, err)
+	}
+	return s, d
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/registry/rest/OWNERS b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/rest/OWNERS
new file mode 100755
index 0000000..6427750
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/rest/OWNERS
@@ -0,0 +1,32 @@
+reviewers:
+- thockin
+- smarterclayton
+- wojtek-t
+- deads2k
+- brendandburns
+- derekwaynecarr
+- caesarxuchao
+- mikedanese
+- liggitt
+- nikhiljindal
+- gmarek
+- justinsb
+- roberthbailey
+- ncdc
+- eparis
+- dims
+- hongchaodeng
+- krousey
+- jszczepkowski
+- euank
+- markturansky
+- fgrzadkowski
+- fabioy
+- ingvagabund
+- david-mcmahon
+- jianhuiz
+- nhlfr
+- feihujiang
+- sdminonne
+- goltermann
+- enj
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/registry/rest/create.go b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/rest/create.go
new file mode 100644
index 0000000..f399ebd
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/rest/create.go
@@ -0,0 +1,180 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package rest
+
+import (
+	"context"
+
+	"k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/api/meta"
+	genericvalidation "k8s.io/apimachinery/pkg/api/validation"
+	"k8s.io/apimachinery/pkg/api/validation/path"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apimachinery/pkg/util/validation/field"
+	"k8s.io/apiserver/pkg/admission"
+	"k8s.io/apiserver/pkg/features"
+	"k8s.io/apiserver/pkg/storage/names"
+	utilfeature "k8s.io/apiserver/pkg/util/feature"
+)
+
+// RESTCreateStrategy defines the minimum validation, accepted input, and
+// name generation behavior to create an object that follows Kubernetes
+// API conventions.
+type RESTCreateStrategy interface {
+	runtime.ObjectTyper
+	// The name generator is used when the standard GenerateName field is set.
+	// The NameGenerator will be invoked prior to validation.
+	names.NameGenerator
+
+	// NamespaceScoped returns true if the object must be within a namespace.
+	NamespaceScoped() bool
+	// PrepareForCreate is invoked on create before validation to normalize
+	// the object.  For example: remove fields that are not to be persisted,
+	// sort order-insensitive list fields, etc.  This should not remove fields
+	// whose presence would be considered a validation error.
+	//
+	// Often implemented as a type check and an initailization or clearing of
+	// status. Clear the status because status changes are internal. External
+	// callers of an api (users) should not be setting an initial status on
+	// newly created objects.
+	PrepareForCreate(ctx context.Context, obj runtime.Object)
+	// Validate returns an ErrorList with validation errors or nil.  Validate
+	// is invoked after default fields in the object have been filled in
+	// before the object is persisted.  This method should not mutate the
+	// object.
+	Validate(ctx context.Context, obj runtime.Object) field.ErrorList
+	// Canonicalize allows an object to be mutated into a canonical form. This
+	// ensures that code that operates on these objects can rely on the common
+	// form for things like comparison.  Canonicalize is invoked after
+	// validation has succeeded but before the object has been persisted.
+	// This method may mutate the object. Often implemented as a type check or
+	// empty method.
+	Canonicalize(obj runtime.Object)
+}
+
+// BeforeCreate ensures that common operations for all resources are performed on creation. It only returns
+// errors that can be converted to api.Status. It invokes PrepareForCreate, then GenerateName, then Validate.
+// It returns nil if the object should be created.
+func BeforeCreate(strategy RESTCreateStrategy, ctx context.Context, obj runtime.Object) error {
+	objectMeta, kind, kerr := objectMetaAndKind(strategy, obj)
+	if kerr != nil {
+		return kerr
+	}
+
+	if strategy.NamespaceScoped() {
+		if !ValidNamespace(ctx, objectMeta) {
+			return errors.NewBadRequest("the namespace of the provided object does not match the namespace sent on the request")
+		}
+	} else {
+		objectMeta.SetNamespace(metav1.NamespaceNone)
+	}
+	objectMeta.SetDeletionTimestamp(nil)
+	objectMeta.SetDeletionGracePeriodSeconds(nil)
+	strategy.PrepareForCreate(ctx, obj)
+	FillObjectMetaSystemFields(objectMeta)
+	if len(objectMeta.GetGenerateName()) > 0 && len(objectMeta.GetName()) == 0 {
+		objectMeta.SetName(strategy.GenerateName(objectMeta.GetGenerateName()))
+	}
+
+	// Ensure Initializers are not set unless the feature is enabled
+	if !utilfeature.DefaultFeatureGate.Enabled(features.Initializers) {
+		objectMeta.SetInitializers(nil)
+	}
+
+	// ClusterName is ignored and should not be saved
+	objectMeta.SetClusterName("")
+
+	if errs := strategy.Validate(ctx, obj); len(errs) > 0 {
+		return errors.NewInvalid(kind.GroupKind(), objectMeta.GetName(), errs)
+	}
+
+	// Custom validation (including name validation) passed
+	// Now run common validation on object meta
+	// Do this *after* custom validation so that specific error messages are shown whenever possible
+	if errs := genericvalidation.ValidateObjectMetaAccessor(objectMeta, strategy.NamespaceScoped(), path.ValidatePathSegmentName, field.NewPath("metadata")); len(errs) > 0 {
+		return errors.NewInvalid(kind.GroupKind(), objectMeta.GetName(), errs)
+	}
+
+	strategy.Canonicalize(obj)
+
+	return nil
+}
+
+// CheckGeneratedNameError checks whether an error that occurred creating a resource is due
+// to generation being unable to pick a valid name.
+func CheckGeneratedNameError(strategy RESTCreateStrategy, err error, obj runtime.Object) error {
+	if !errors.IsAlreadyExists(err) {
+		return err
+	}
+
+	objectMeta, kind, kerr := objectMetaAndKind(strategy, obj)
+	if kerr != nil {
+		return kerr
+	}
+
+	if len(objectMeta.GetGenerateName()) == 0 {
+		return err
+	}
+
+	return errors.NewServerTimeoutForKind(kind.GroupKind(), "POST", 0)
+}
+
+// objectMetaAndKind retrieves kind and ObjectMeta from a runtime object, or returns an error.
+func objectMetaAndKind(typer runtime.ObjectTyper, obj runtime.Object) (metav1.Object, schema.GroupVersionKind, error) {
+	objectMeta, err := meta.Accessor(obj)
+	if err != nil {
+		return nil, schema.GroupVersionKind{}, errors.NewInternalError(err)
+	}
+	kinds, _, err := typer.ObjectKinds(obj)
+	if err != nil {
+		return nil, schema.GroupVersionKind{}, errors.NewInternalError(err)
+	}
+	return objectMeta, kinds[0], nil
+}
+
+// NamespaceScopedStrategy has a method to tell if the object must be in a namespace.
+type NamespaceScopedStrategy interface {
+	// NamespaceScoped returns if the object must be in a namespace.
+	NamespaceScoped() bool
+}
+
+// AdmissionToValidateObjectFunc converts validating admission to a rest validate object func
+func AdmissionToValidateObjectFunc(admit admission.Interface, staticAttributes admission.Attributes) ValidateObjectFunc {
+	validatingAdmission, ok := admit.(admission.ValidationInterface)
+	if !ok {
+		return func(obj runtime.Object) error { return nil }
+	}
+	return func(obj runtime.Object) error {
+		finalAttributes := admission.NewAttributesRecord(
+			obj,
+			staticAttributes.GetOldObject(),
+			staticAttributes.GetKind(),
+			staticAttributes.GetNamespace(),
+			staticAttributes.GetName(),
+			staticAttributes.GetResource(),
+			staticAttributes.GetSubresource(),
+			staticAttributes.GetOperation(),
+			staticAttributes.GetUserInfo(),
+		)
+		if !validatingAdmission.Handles(finalAttributes.GetOperation()) {
+			return nil
+		}
+		return validatingAdmission.Validate(finalAttributes)
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/registry/rest/delete.go b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/rest/delete.go
new file mode 100644
index 0000000..7c39f6b
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/rest/delete.go
@@ -0,0 +1,137 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package rest
+
+import (
+	"context"
+	"fmt"
+	"time"
+
+	"k8s.io/apimachinery/pkg/api/errors"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/apis/meta/v1/validation"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+)
+
+// RESTDeleteStrategy defines deletion behavior on an object that follows Kubernetes
+// API conventions.
+type RESTDeleteStrategy interface {
+	runtime.ObjectTyper
+}
+
+type GarbageCollectionPolicy string
+
+const (
+	DeleteDependents GarbageCollectionPolicy = "DeleteDependents"
+	OrphanDependents GarbageCollectionPolicy = "OrphanDependents"
+	// Unsupported means that the resource knows that it cannot be GC'd, so the finalizers
+	// should never be set in storage.
+	Unsupported GarbageCollectionPolicy = "Unsupported"
+)
+
+// GarbageCollectionDeleteStrategy must be implemented by the registry that wants to
+// orphan dependents by default.
+type GarbageCollectionDeleteStrategy interface {
+	// DefaultGarbageCollectionPolicy returns the default garbage collection behavior.
+	DefaultGarbageCollectionPolicy(ctx context.Context) GarbageCollectionPolicy
+}
+
+// RESTGracefulDeleteStrategy must be implemented by the registry that supports
+// graceful deletion.
+type RESTGracefulDeleteStrategy interface {
+	// CheckGracefulDelete should return true if the object can be gracefully deleted and set
+	// any default values on the DeleteOptions.
+	CheckGracefulDelete(ctx context.Context, obj runtime.Object, options *metav1.DeleteOptions) bool
+}
+
+// BeforeDelete tests whether the object can be gracefully deleted.
+// If graceful is set, the object should be gracefully deleted.  If gracefulPending
+// is set, the object has already been gracefully deleted (and the provided grace
+// period is longer than the time to deletion). An error is returned if the
+// condition cannot be checked or the gracePeriodSeconds is invalid. The options
+// argument may be updated with default values if graceful is true. Second place
+// where we set deletionTimestamp is pkg/registry/generic/registry/store.go.
+// This function is responsible for setting deletionTimestamp during gracefulDeletion,
+// other one for cascading deletions.
+func BeforeDelete(strategy RESTDeleteStrategy, ctx context.Context, obj runtime.Object, options *metav1.DeleteOptions) (graceful, gracefulPending bool, err error) {
+	objectMeta, gvk, kerr := objectMetaAndKind(strategy, obj)
+	if kerr != nil {
+		return false, false, kerr
+	}
+	if errs := validation.ValidateDeleteOptions(options); len(errs) > 0 {
+		return false, false, errors.NewInvalid(schema.GroupKind{Group: metav1.GroupName, Kind: "DeleteOptions"}, "", errs)
+	}
+	// Checking the Preconditions here to fail early. They'll be enforced later on when we actually do the deletion, too.
+	if options.Preconditions != nil && options.Preconditions.UID != nil && *options.Preconditions.UID != objectMeta.GetUID() {
+		return false, false, errors.NewConflict(schema.GroupResource{Group: gvk.Group, Resource: gvk.Kind}, objectMeta.GetName(), fmt.Errorf("the UID in the precondition (%s) does not match the UID in record (%s). The object might have been deleted and then recreated", *options.Preconditions.UID, objectMeta.GetUID()))
+	}
+	gracefulStrategy, ok := strategy.(RESTGracefulDeleteStrategy)
+	if !ok {
+		// If we're not deleting gracefully there's no point in updating Generation, as we won't update
+		// the obcject before deleting it.
+		return false, false, nil
+	}
+	// if the object is already being deleted, no need to update generation.
+	if objectMeta.GetDeletionTimestamp() != nil {
+		// if we are already being deleted, we may only shorten the deletion grace period
+		// this means the object was gracefully deleted previously but deletionGracePeriodSeconds was not set,
+		// so we force deletion immediately
+		// IMPORTANT:
+		// The deletion operation happens in two phases.
+		// 1. Update to set DeletionGracePeriodSeconds and DeletionTimestamp
+		// 2. Delete the object from storage.
+		// If the update succeeds, but the delete fails (network error, internal storage error, etc.),
+		// a resource was previously left in a state that was non-recoverable.  We
+		// check if the existing stored resource has a grace period as 0 and if so
+		// attempt to delete immediately in order to recover from this scenario.
+		if objectMeta.GetDeletionGracePeriodSeconds() == nil || *objectMeta.GetDeletionGracePeriodSeconds() == 0 {
+			return false, false, nil
+		}
+		// only a shorter grace period may be provided by a user
+		if options.GracePeriodSeconds != nil {
+			period := int64(*options.GracePeriodSeconds)
+			if period >= *objectMeta.GetDeletionGracePeriodSeconds() {
+				return false, true, nil
+			}
+			newDeletionTimestamp := metav1.NewTime(
+				objectMeta.GetDeletionTimestamp().Add(-time.Second * time.Duration(*objectMeta.GetDeletionGracePeriodSeconds())).
+					Add(time.Second * time.Duration(*options.GracePeriodSeconds)))
+			objectMeta.SetDeletionTimestamp(&newDeletionTimestamp)
+			objectMeta.SetDeletionGracePeriodSeconds(&period)
+			return true, false, nil
+		}
+		// graceful deletion is pending, do nothing
+		options.GracePeriodSeconds = objectMeta.GetDeletionGracePeriodSeconds()
+		return false, true, nil
+	}
+
+	if !gracefulStrategy.CheckGracefulDelete(ctx, obj, options) {
+		return false, false, nil
+	}
+	now := metav1.NewTime(metav1.Now().Add(time.Second * time.Duration(*options.GracePeriodSeconds)))
+	objectMeta.SetDeletionTimestamp(&now)
+	objectMeta.SetDeletionGracePeriodSeconds(options.GracePeriodSeconds)
+	// If it's the first graceful deletion we are going to set the DeletionTimestamp to non-nil.
+	// Controllers of the object that's being deleted shouldn't take any nontrivial actions, hence its behavior changes.
+	// Thus we need to bump object's Generation (if set). This handles generation bump during graceful deletion.
+	// The bump for objects that don't support graceful deletion is handled in pkg/registry/generic/registry/store.go.
+	if objectMeta.GetGeneration() > 0 {
+		objectMeta.SetGeneration(objectMeta.GetGeneration() + 1)
+	}
+	return true, false, nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/registry/rest/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/rest/doc.go
new file mode 100644
index 0000000..20524d2
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/rest/doc.go
@@ -0,0 +1,18 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+// Package rest defines common logic around changes to Kubernetes-style resources.
+package rest // import "k8s.io/apiserver/pkg/registry/rest"
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/registry/rest/export.go b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/rest/export.go
new file mode 100644
index 0000000..b3fd8af
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/rest/export.go
@@ -0,0 +1,34 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+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.
+*/
+
+package rest
+
+import (
+	"context"
+
+	"k8s.io/apimachinery/pkg/runtime"
+)
+
+// RESTExportStrategy is the interface that defines how to export a Kubernetes
+// object.  An exported object is stripped of non-user-settable fields and
+// optionally, the identifying information related to the object's identity in
+// the cluster so that it can be loaded into a different namespace or entirely
+// different cluster without conflict.
+type RESTExportStrategy interface {
+	// Export strips fields that can not be set by the user.  If 'exact' is false
+	// fields specific to the cluster are also stripped
+	Export(ctx context.Context, obj runtime.Object, exact bool) error
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/registry/rest/meta.go b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/rest/meta.go
new file mode 100644
index 0000000..add6044
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/rest/meta.go
@@ -0,0 +1,43 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package rest
+
+import (
+	"context"
+
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/util/uuid"
+	genericapirequest "k8s.io/apiserver/pkg/endpoints/request"
+)
+
+// FillObjectMetaSystemFields populates fields that are managed by the system on ObjectMeta.
+func FillObjectMetaSystemFields(meta metav1.Object) {
+	meta.SetCreationTimestamp(metav1.Now())
+	meta.SetUID(uuid.NewUUID())
+	meta.SetSelfLink("")
+}
+
+// ValidNamespace returns false if the namespace on the context differs from
+// the resource.  If the resource has no namespace, it is set to the value in
+// the context.
+func ValidNamespace(ctx context.Context, resource metav1.Object) bool {
+	ns, ok := genericapirequest.NamespaceFrom(ctx)
+	if len(resource.GetNamespace()) == 0 {
+		resource.SetNamespace(ns)
+	}
+	return ns == resource.GetNamespace() && ok
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/registry/rest/rest.go b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/rest/rest.go
new file mode 100644
index 0000000..d84146f
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/rest/rest.go
@@ -0,0 +1,352 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package rest
+
+import (
+	"context"
+	"io"
+	"net/http"
+	"net/url"
+
+	metainternalversion "k8s.io/apimachinery/pkg/apis/meta/internalversion"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	metav1beta1 "k8s.io/apimachinery/pkg/apis/meta/v1beta1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apimachinery/pkg/watch"
+)
+
+//TODO:
+// Storage interfaces need to be separated into two groups; those that operate
+// on collections and those that operate on individually named items.
+// Collection interfaces:
+// (Method: Current -> Proposed)
+//    GET: Lister -> CollectionGetter
+//    WATCH: Watcher -> CollectionWatcher
+//    CREATE: Creater -> CollectionCreater
+//    DELETE: (n/a) -> CollectionDeleter
+//    UPDATE: (n/a) -> CollectionUpdater
+//
+// Single item interfaces:
+// (Method: Current -> Proposed)
+//    GET: Getter -> NamedGetter
+//    WATCH: (n/a) -> NamedWatcher
+//    CREATE: (n/a) -> NamedCreater
+//    DELETE: Deleter -> NamedDeleter
+//    UPDATE: Update -> NamedUpdater
+
+// Storage is a generic interface for RESTful storage services.
+// Resources which are exported to the RESTful API of apiserver need to implement this interface. It is expected
+// that objects may implement any of the below interfaces.
+type Storage interface {
+	// New returns an empty object that can be used with Create and Update after request data has been put into it.
+	// This object must be a pointer type for use with Codec.DecodeInto([]byte, runtime.Object)
+	New() runtime.Object
+}
+
+// Scoper indicates what scope the resource is at. It must be specified.
+// It is usually provided automatically based on your strategy.
+type Scoper interface {
+	// NamespaceScoped returns true if the storage is namespaced
+	NamespaceScoped() bool
+}
+
+// KindProvider specifies a different kind for its API than for its internal storage.  This is necessary for external
+// objects that are not compiled into the api server.  For such objects, there is no in-memory representation for
+// the object, so they must be represented as generic objects (e.g. runtime.Unknown), but when we present the object as part of
+// API discovery we want to present the specific kind, not the generic internal representation.
+type KindProvider interface {
+	Kind() string
+}
+
+// ShortNamesProvider is an interface for RESTful storage services. Delivers a list of short names for a resource. The list is used by kubectl to have short names representation of resources.
+type ShortNamesProvider interface {
+	ShortNames() []string
+}
+
+// CategoriesProvider allows a resource to specify which groups of resources (categories) it's part of. Categories can
+// be used by API clients to refer to a batch of resources by using a single name (e.g. "all" could translate to "pod,rc,svc,...").
+type CategoriesProvider interface {
+	Categories() []string
+}
+
+// GroupVersionKindProvider is used to specify a particular GroupVersionKind to discovery.  This is used for polymorphic endpoints
+// which generally point to foreign versions.  Scale refers to Scale.v1beta1.extensions for instance.
+// This trumps KindProvider since it is capable of providing the information required.
+// TODO KindProvider (only used by federation) should be removed and replaced with this, but that presents greater risk late in 1.8.
+type GroupVersionKindProvider interface {
+	GroupVersionKind(containingGV schema.GroupVersion) schema.GroupVersionKind
+}
+
+// Lister is an object that can retrieve resources that match the provided field and label criteria.
+type Lister interface {
+	// NewList returns an empty object that can be used with the List call.
+	// This object must be a pointer type for use with Codec.DecodeInto([]byte, runtime.Object)
+	NewList() runtime.Object
+	// List selects resources in the storage which match to the selector. 'options' can be nil.
+	List(ctx context.Context, options *metainternalversion.ListOptions) (runtime.Object, error)
+}
+
+// Exporter is an object that knows how to strip a RESTful resource for export. A store should implement this interface
+// if export is generally supported for that type. Errors can still be returned during the actual Export when certain
+// instances of the type are not exportable.
+type Exporter interface {
+	// Export an object.  Fields that are not user specified (e.g. Status, ObjectMeta.ResourceVersion) are stripped out
+	// Returns the stripped object.  If 'exact' is true, fields that are specific to the cluster (e.g. namespace) are
+	// retained, otherwise they are stripped also.
+	Export(ctx context.Context, name string, opts metav1.ExportOptions) (runtime.Object, error)
+}
+
+// Getter is an object that can retrieve a named RESTful resource.
+type Getter interface {
+	// Get finds a resource in the storage by name and returns it.
+	// Although it can return an arbitrary error value, IsNotFound(err) is true for the
+	// returned error value err when the specified resource is not found.
+	Get(ctx context.Context, name string, options *metav1.GetOptions) (runtime.Object, error)
+}
+
+// GetterWithOptions is an object that retrieve a named RESTful resource and takes
+// additional options on the get request. It allows a caller to also receive the
+// subpath of the GET request.
+type GetterWithOptions interface {
+	// Get finds a resource in the storage by name and returns it.
+	// Although it can return an arbitrary error value, IsNotFound(err) is true for the
+	// returned error value err when the specified resource is not found.
+	// The options object passed to it is of the same type returned by the NewGetOptions
+	// method.
+	// TODO: Pass metav1.GetOptions.
+	Get(ctx context.Context, name string, options runtime.Object) (runtime.Object, error)
+
+	// NewGetOptions returns an empty options object that will be used to pass
+	// options to the Get method. It may return a bool and a string, if true, the
+	// value of the request path below the object will be included as the named
+	// string in the serialization of the runtime object. E.g., returning "path"
+	// will convert the trailing request scheme value to "path" in the map[string][]string
+	// passed to the converter.
+	NewGetOptions() (runtime.Object, bool, string)
+}
+
+type TableConvertor interface {
+	ConvertToTable(ctx context.Context, object runtime.Object, tableOptions runtime.Object) (*metav1beta1.Table, error)
+}
+
+// GracefulDeleter knows how to pass deletion options to allow delayed deletion of a
+// RESTful object.
+type GracefulDeleter interface {
+	// Delete finds a resource in the storage and deletes it.
+	// If options are provided, the resource will attempt to honor them or return an invalid
+	// request error.
+	// Although it can return an arbitrary error value, IsNotFound(err) is true for the
+	// returned error value err when the specified resource is not found.
+	// Delete *may* return the object that was deleted, or a status object indicating additional
+	// information about deletion.
+	// It also returns a boolean which is set to true if the resource was instantly
+	// deleted or false if it will be deleted asynchronously.
+	Delete(ctx context.Context, name string, options *metav1.DeleteOptions) (runtime.Object, bool, error)
+}
+
+// CollectionDeleter is an object that can delete a collection
+// of RESTful resources.
+type CollectionDeleter interface {
+	// DeleteCollection selects all resources in the storage matching given 'listOptions'
+	// and deletes them. If 'options' are provided, the resource will attempt to honor
+	// them or return an invalid request error.
+	// DeleteCollection may not be atomic - i.e. it may delete some objects and still
+	// return an error after it. On success, returns a list of deleted objects.
+	DeleteCollection(ctx context.Context, options *metav1.DeleteOptions, listOptions *metainternalversion.ListOptions) (runtime.Object, error)
+}
+
+// Creater is an object that can create an instance of a RESTful object.
+type Creater interface {
+	// New returns an empty object that can be used with Create after request data has been put into it.
+	// This object must be a pointer type for use with Codec.DecodeInto([]byte, runtime.Object)
+	New() runtime.Object
+
+	// Create creates a new version of a resource. If includeUninitialized is set, the object may be returned
+	// without completing initialization.
+	Create(ctx context.Context, obj runtime.Object, createValidation ValidateObjectFunc, includeUninitialized bool) (runtime.Object, error)
+}
+
+// NamedCreater is an object that can create an instance of a RESTful object using a name parameter.
+type NamedCreater interface {
+	// New returns an empty object that can be used with Create after request data has been put into it.
+	// This object must be a pointer type for use with Codec.DecodeInto([]byte, runtime.Object)
+	New() runtime.Object
+
+	// Create creates a new version of a resource. It expects a name parameter from the path.
+	// This is needed for create operations on subresources which include the name of the parent
+	// resource in the path. If includeUninitialized is set, the object may be returned without
+	// completing initialization.
+	Create(ctx context.Context, name string, obj runtime.Object, createValidation ValidateObjectFunc, includeUninitialized bool) (runtime.Object, error)
+}
+
+// UpdatedObjectInfo provides information about an updated object to an Updater.
+// It requires access to the old object in order to return the newly updated object.
+type UpdatedObjectInfo interface {
+	// Returns preconditions built from the updated object, if applicable.
+	// May return nil, or a preconditions object containing nil fields,
+	// if no preconditions can be determined from the updated object.
+	Preconditions() *metav1.Preconditions
+
+	// UpdatedObject returns the updated object, given a context and old object.
+	// The only time an empty oldObj should be passed in is if a "create on update" is occurring (there is no oldObj).
+	UpdatedObject(ctx context.Context, oldObj runtime.Object) (newObj runtime.Object, err error)
+}
+
+// ValidateObjectFunc is a function to act on a given object. An error may be returned
+// if the hook cannot be completed. An ObjectFunc may NOT transform the provided
+// object.
+type ValidateObjectFunc func(obj runtime.Object) error
+
+// ValidateAllObjectFunc is a "admit everything" instance of ValidateObjectFunc.
+func ValidateAllObjectFunc(obj runtime.Object) error {
+	return nil
+}
+
+// ValidateObjectUpdateFunc is a function to act on a given object and its predecessor.
+// An error may be returned if the hook cannot be completed. An UpdateObjectFunc
+// may NOT transform the provided object.
+type ValidateObjectUpdateFunc func(obj, old runtime.Object) error
+
+// ValidateAllObjectUpdateFunc is a "admit everything" instance of ValidateObjectUpdateFunc.
+func ValidateAllObjectUpdateFunc(obj, old runtime.Object) error {
+	return nil
+}
+
+// Updater is an object that can update an instance of a RESTful object.
+type Updater interface {
+	// New returns an empty object that can be used with Update after request data has been put into it.
+	// This object must be a pointer type for use with Codec.DecodeInto([]byte, runtime.Object)
+	New() runtime.Object
+
+	// Update finds a resource in the storage and updates it. Some implementations
+	// may allow updates creates the object - they should set the created boolean
+	// to true.
+	Update(ctx context.Context, name string, objInfo UpdatedObjectInfo, createValidation ValidateObjectFunc, updateValidation ValidateObjectUpdateFunc) (runtime.Object, bool, error)
+}
+
+// CreaterUpdater is a storage object that must support both create and update.
+// Go prevents embedded interfaces that implement the same method.
+type CreaterUpdater interface {
+	Creater
+	Update(ctx context.Context, name string, objInfo UpdatedObjectInfo, createValidation ValidateObjectFunc, updateValidation ValidateObjectUpdateFunc) (runtime.Object, bool, error)
+}
+
+// CreaterUpdater must satisfy the Updater interface.
+var _ Updater = CreaterUpdater(nil)
+
+// Patcher is a storage object that supports both get and update.
+type Patcher interface {
+	Getter
+	Updater
+}
+
+// Watcher should be implemented by all Storage objects that
+// want to offer the ability to watch for changes through the watch api.
+type Watcher interface {
+	// 'label' selects on labels; 'field' selects on the object's fields. Not all fields
+	// are supported; an error should be returned if 'field' tries to select on a field that
+	// isn't supported. 'resourceVersion' allows for continuing/starting a watch at a
+	// particular version.
+	Watch(ctx context.Context, options *metainternalversion.ListOptions) (watch.Interface, error)
+}
+
+// StandardStorage is an interface covering the common verbs. Provided for testing whether a
+// resource satisfies the normal storage methods. Use Storage when passing opaque storage objects.
+type StandardStorage interface {
+	Getter
+	Lister
+	CreaterUpdater
+	GracefulDeleter
+	CollectionDeleter
+	Watcher
+}
+
+// Redirector know how to return a remote resource's location.
+type Redirector interface {
+	// ResourceLocation should return the remote location of the given resource, and an optional transport to use to request it, or an error.
+	ResourceLocation(ctx context.Context, id string) (remoteLocation *url.URL, transport http.RoundTripper, err error)
+}
+
+// Responder abstracts the normal response behavior for a REST method and is passed to callers that
+// may wish to handle the response directly in some cases, but delegate to the normal error or object
+// behavior in other cases.
+type Responder interface {
+	// Object writes the provided object to the response. Invoking this method multiple times is undefined.
+	Object(statusCode int, obj runtime.Object)
+	// Error writes the provided error to the response. This method may only be invoked once.
+	Error(err error)
+}
+
+// Connecter is a storage object that responds to a connection request.
+type Connecter interface {
+	// Connect returns an http.Handler that will handle the request/response for a given API invocation.
+	// The provided responder may be used for common API responses. The responder will write both status
+	// code and body, so the ServeHTTP method should exit after invoking the responder. The Handler will
+	// be used for a single API request and then discarded. The Responder is guaranteed to write to the
+	// same http.ResponseWriter passed to ServeHTTP.
+	Connect(ctx context.Context, id string, options runtime.Object, r Responder) (http.Handler, error)
+
+	// NewConnectOptions returns an empty options object that will be used to pass
+	// options to the Connect method. If nil, then a nil options object is passed to
+	// Connect. It may return a bool and a string. If true, the value of the request
+	// path below the object will be included as the named string in the serialization
+	// of the runtime object.
+	NewConnectOptions() (runtime.Object, bool, string)
+
+	// ConnectMethods returns the list of HTTP methods handled by Connect
+	ConnectMethods() []string
+}
+
+// ResourceStreamer is an interface implemented by objects that prefer to be streamed from the server
+// instead of decoded directly.
+type ResourceStreamer interface {
+	// InputStream should return an io.ReadCloser if the provided object supports streaming. The desired
+	// api version and an accept header (may be empty) are passed to the call. If no error occurs,
+	// the caller may return a flag indicating whether the result should be flushed as writes occur
+	// and a content type string that indicates the type of the stream.
+	// If a null stream is returned, a StatusNoContent response wil be generated.
+	InputStream(apiVersion, acceptHeader string) (stream io.ReadCloser, flush bool, mimeType string, err error)
+}
+
+// StorageMetadata is an optional interface that callers can implement to provide additional
+// information about their Storage objects.
+type StorageMetadata interface {
+	// ProducesMIMETypes returns a list of the MIME types the specified HTTP verb (GET, POST, DELETE,
+	// PATCH) can respond with.
+	ProducesMIMETypes(verb string) []string
+
+	// ProducesObject returns an object the specified HTTP verb respond with. It will overwrite storage object if
+	// it is not nil. Only the type of the return object matters, the value will be ignored.
+	ProducesObject(verb string) interface{}
+}
+
+// +k8s:deepcopy-gen=true
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+// ConnectRequest is an object passed to admission control for Connect operations
+type ConnectRequest struct {
+	// Name is the name of the object on which the connect request was made
+	Name string
+
+	// Options is the options object passed to the connect request. See the NewConnectOptions method on Connecter
+	Options runtime.Object
+
+	// ResourcePath is the path for the resource in the REST server (ie. "pods/proxy")
+	ResourcePath string
+}
+
+func (obj *ConnectRequest) GetObjectKind() schema.ObjectKind { return schema.EmptyObjectKind }
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/registry/rest/table.go b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/rest/table.go
new file mode 100644
index 0000000..bfcdcf5
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/rest/table.go
@@ -0,0 +1,99 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package rest
+
+import (
+	"context"
+	"fmt"
+	"net/http"
+	"time"
+
+	"k8s.io/apimachinery/pkg/api/meta"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	metav1beta1 "k8s.io/apimachinery/pkg/apis/meta/v1beta1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+)
+
+type defaultTableConvertor struct {
+	qualifiedResource schema.GroupResource
+}
+
+// NewDefaultTableConvertor creates a default convertor for the provided resource.
+func NewDefaultTableConvertor(resource schema.GroupResource) TableConvertor {
+	return defaultTableConvertor{qualifiedResource: resource}
+}
+
+var swaggerMetadataDescriptions = metav1.ObjectMeta{}.SwaggerDoc()
+
+func (c defaultTableConvertor) ConvertToTable(ctx context.Context, object runtime.Object, tableOptions runtime.Object) (*metav1beta1.Table, error) {
+	var table metav1beta1.Table
+	fn := func(obj runtime.Object) error {
+		m, err := meta.Accessor(obj)
+		if err != nil {
+			return errNotAcceptable{resource: c.qualifiedResource}
+		}
+		table.Rows = append(table.Rows, metav1beta1.TableRow{
+			Cells:  []interface{}{m.GetName(), m.GetCreationTimestamp().Time.UTC().Format(time.RFC3339)},
+			Object: runtime.RawExtension{Object: obj},
+		})
+		return nil
+	}
+	switch {
+	case meta.IsListType(object):
+		if err := meta.EachListItem(object, fn); err != nil {
+			return nil, err
+		}
+	default:
+		if err := fn(object); err != nil {
+			return nil, err
+		}
+	}
+	if m, err := meta.ListAccessor(object); err == nil {
+		table.ResourceVersion = m.GetResourceVersion()
+		table.SelfLink = m.GetSelfLink()
+		table.Continue = m.GetContinue()
+	} else {
+		if m, err := meta.CommonAccessor(object); err == nil {
+			table.ResourceVersion = m.GetResourceVersion()
+			table.SelfLink = m.GetSelfLink()
+		}
+	}
+	table.ColumnDefinitions = []metav1beta1.TableColumnDefinition{
+		{Name: "Name", Type: "string", Format: "name", Description: swaggerMetadataDescriptions["name"]},
+		{Name: "Created At", Type: "date", Description: swaggerMetadataDescriptions["creationTimestamp"]},
+	}
+	return &table, nil
+}
+
+// errNotAcceptable indicates the resource doesn't support Table conversion
+type errNotAcceptable struct {
+	resource schema.GroupResource
+}
+
+func (e errNotAcceptable) Error() string {
+	return fmt.Sprintf("the resource %s does not support being converted to a Table", e.resource)
+}
+
+func (e errNotAcceptable) Status() metav1.Status {
+	return metav1.Status{
+		Status:  metav1.StatusFailure,
+		Code:    http.StatusNotAcceptable,
+		Reason:  metav1.StatusReason("NotAcceptable"),
+		Message: e.Error(),
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/registry/rest/update.go b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/rest/update.go
new file mode 100644
index 0000000..b08dd14
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/rest/update.go
@@ -0,0 +1,273 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package rest
+
+import (
+	"context"
+	"fmt"
+
+	"k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/api/meta"
+	genericvalidation "k8s.io/apimachinery/pkg/api/validation"
+	"k8s.io/apimachinery/pkg/api/validation/path"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/util/validation/field"
+	"k8s.io/apiserver/pkg/admission"
+	"k8s.io/apiserver/pkg/features"
+	utilfeature "k8s.io/apiserver/pkg/util/feature"
+)
+
+// RESTUpdateStrategy defines the minimum validation, accepted input, and
+// name generation behavior to update an object that follows Kubernetes
+// API conventions. A resource may have many UpdateStrategies, depending on
+// the call pattern in use.
+type RESTUpdateStrategy interface {
+	runtime.ObjectTyper
+	// NamespaceScoped returns true if the object must be within a namespace.
+	NamespaceScoped() bool
+	// AllowCreateOnUpdate returns true if the object can be created by a PUT.
+	AllowCreateOnUpdate() bool
+	// PrepareForUpdate is invoked on update before validation to normalize
+	// the object.  For example: remove fields that are not to be persisted,
+	// sort order-insensitive list fields, etc.  This should not remove fields
+	// whose presence would be considered a validation error.
+	PrepareForUpdate(ctx context.Context, obj, old runtime.Object)
+	// ValidateUpdate is invoked after default fields in the object have been
+	// filled in before the object is persisted.  This method should not mutate
+	// the object.
+	ValidateUpdate(ctx context.Context, obj, old runtime.Object) field.ErrorList
+	// Canonicalize allows an object to be mutated into a canonical form. This
+	// ensures that code that operates on these objects can rely on the common
+	// form for things like comparison.  Canonicalize is invoked after
+	// validation has succeeded but before the object has been persisted.
+	// This method may mutate the object.
+	Canonicalize(obj runtime.Object)
+	// AllowUnconditionalUpdate returns true if the object can be updated
+	// unconditionally (irrespective of the latest resource version), when
+	// there is no resource version specified in the object.
+	AllowUnconditionalUpdate() bool
+}
+
+// TODO: add other common fields that require global validation.
+func validateCommonFields(obj, old runtime.Object, strategy RESTUpdateStrategy) (field.ErrorList, error) {
+	allErrs := field.ErrorList{}
+	objectMeta, err := meta.Accessor(obj)
+	if err != nil {
+		return nil, fmt.Errorf("failed to get new object metadata: %v", err)
+	}
+	oldObjectMeta, err := meta.Accessor(old)
+	if err != nil {
+		return nil, fmt.Errorf("failed to get old object metadata: %v", err)
+	}
+	allErrs = append(allErrs, genericvalidation.ValidateObjectMetaAccessor(objectMeta, strategy.NamespaceScoped(), path.ValidatePathSegmentName, field.NewPath("metadata"))...)
+	allErrs = append(allErrs, genericvalidation.ValidateObjectMetaAccessorUpdate(objectMeta, oldObjectMeta, field.NewPath("metadata"))...)
+
+	return allErrs, nil
+}
+
+// BeforeUpdate ensures that common operations for all resources are performed on update. It only returns
+// errors that can be converted to api.Status. It will invoke update validation with the provided existing
+// and updated objects.
+func BeforeUpdate(strategy RESTUpdateStrategy, ctx context.Context, obj, old runtime.Object) error {
+	objectMeta, kind, kerr := objectMetaAndKind(strategy, obj)
+	if kerr != nil {
+		return kerr
+	}
+	if strategy.NamespaceScoped() {
+		if !ValidNamespace(ctx, objectMeta) {
+			return errors.NewBadRequest("the namespace of the provided object does not match the namespace sent on the request")
+		}
+	} else {
+		objectMeta.SetNamespace(metav1.NamespaceNone)
+	}
+	// Ensure requests cannot update generation
+	oldMeta, err := meta.Accessor(old)
+	if err != nil {
+		return err
+	}
+	objectMeta.SetGeneration(oldMeta.GetGeneration())
+
+	// Ensure Initializers are not set unless the feature is enabled
+	if !utilfeature.DefaultFeatureGate.Enabled(features.Initializers) {
+		oldMeta.SetInitializers(nil)
+		objectMeta.SetInitializers(nil)
+	}
+
+	strategy.PrepareForUpdate(ctx, obj, old)
+
+	// ClusterName is ignored and should not be saved
+	objectMeta.SetClusterName("")
+	// Use the existing UID if none is provided
+	if len(objectMeta.GetUID()) == 0 {
+		objectMeta.SetUID(oldMeta.GetUID())
+	}
+	// ignore changes to timestamp
+	if oldCreationTime := oldMeta.GetCreationTimestamp(); !oldCreationTime.IsZero() {
+		objectMeta.SetCreationTimestamp(oldMeta.GetCreationTimestamp())
+	}
+	// an update can never remove/change a deletion timestamp
+	if !oldMeta.GetDeletionTimestamp().IsZero() {
+		objectMeta.SetDeletionTimestamp(oldMeta.GetDeletionTimestamp())
+	}
+	// an update can never remove/change grace period seconds
+	if oldMeta.GetDeletionGracePeriodSeconds() != nil && objectMeta.GetDeletionGracePeriodSeconds() == nil {
+		objectMeta.SetDeletionGracePeriodSeconds(oldMeta.GetDeletionGracePeriodSeconds())
+	}
+
+	// Ensure some common fields, like UID, are validated for all resources.
+	errs, err := validateCommonFields(obj, old, strategy)
+	if err != nil {
+		return errors.NewInternalError(err)
+	}
+
+	errs = append(errs, strategy.ValidateUpdate(ctx, obj, old)...)
+	if len(errs) > 0 {
+		return errors.NewInvalid(kind.GroupKind(), objectMeta.GetName(), errs)
+	}
+
+	strategy.Canonicalize(obj)
+
+	return nil
+}
+
+// TransformFunc is a function to transform and return newObj
+type TransformFunc func(ctx context.Context, newObj runtime.Object, oldObj runtime.Object) (transformedNewObj runtime.Object, err error)
+
+// defaultUpdatedObjectInfo implements UpdatedObjectInfo
+type defaultUpdatedObjectInfo struct {
+	// obj is the updated object
+	obj runtime.Object
+
+	// transformers is an optional list of transforming functions that modify or
+	// replace obj using information from the context, old object, or other sources.
+	transformers []TransformFunc
+}
+
+// DefaultUpdatedObjectInfo returns an UpdatedObjectInfo impl based on the specified object.
+func DefaultUpdatedObjectInfo(obj runtime.Object, transformers ...TransformFunc) UpdatedObjectInfo {
+	return &defaultUpdatedObjectInfo{obj, transformers}
+}
+
+// Preconditions satisfies the UpdatedObjectInfo interface.
+func (i *defaultUpdatedObjectInfo) Preconditions() *metav1.Preconditions {
+	// Attempt to get the UID out of the object
+	accessor, err := meta.Accessor(i.obj)
+	if err != nil {
+		// If no UID can be read, no preconditions are possible
+		return nil
+	}
+
+	// If empty, no preconditions needed
+	uid := accessor.GetUID()
+	if len(uid) == 0 {
+		return nil
+	}
+
+	return &metav1.Preconditions{UID: &uid}
+}
+
+// UpdatedObject satisfies the UpdatedObjectInfo interface.
+// It returns a copy of the held obj, passed through any configured transformers.
+func (i *defaultUpdatedObjectInfo) UpdatedObject(ctx context.Context, oldObj runtime.Object) (runtime.Object, error) {
+	var err error
+	// Start with the configured object
+	newObj := i.obj
+
+	// If the original is non-nil (might be nil if the first transformer builds the object from the oldObj), make a copy,
+	// so we don't return the original. BeforeUpdate can mutate the returned object, doing things like clearing ResourceVersion.
+	// If we're re-called, we need to be able to return the pristine version.
+	if newObj != nil {
+		newObj = newObj.DeepCopyObject()
+	}
+
+	// Allow any configured transformers to update the new object
+	for _, transformer := range i.transformers {
+		newObj, err = transformer(ctx, newObj, oldObj)
+		if err != nil {
+			return nil, err
+		}
+	}
+
+	return newObj, nil
+}
+
+// wrappedUpdatedObjectInfo allows wrapping an existing objInfo and
+// chaining additional transformations/checks on the result of UpdatedObject()
+type wrappedUpdatedObjectInfo struct {
+	// obj is the updated object
+	objInfo UpdatedObjectInfo
+
+	// transformers is an optional list of transforming functions that modify or
+	// replace obj using information from the context, old object, or other sources.
+	transformers []TransformFunc
+}
+
+// WrapUpdatedObjectInfo returns an UpdatedObjectInfo impl that delegates to
+// the specified objInfo, then calls the passed transformers
+func WrapUpdatedObjectInfo(objInfo UpdatedObjectInfo, transformers ...TransformFunc) UpdatedObjectInfo {
+	return &wrappedUpdatedObjectInfo{objInfo, transformers}
+}
+
+// Preconditions satisfies the UpdatedObjectInfo interface.
+func (i *wrappedUpdatedObjectInfo) Preconditions() *metav1.Preconditions {
+	return i.objInfo.Preconditions()
+}
+
+// UpdatedObject satisfies the UpdatedObjectInfo interface.
+// It delegates to the wrapped objInfo and passes the result through any configured transformers.
+func (i *wrappedUpdatedObjectInfo) UpdatedObject(ctx context.Context, oldObj runtime.Object) (runtime.Object, error) {
+	newObj, err := i.objInfo.UpdatedObject(ctx, oldObj)
+	if err != nil {
+		return newObj, err
+	}
+
+	// Allow any configured transformers to update the new object or error
+	for _, transformer := range i.transformers {
+		newObj, err = transformer(ctx, newObj, oldObj)
+		if err != nil {
+			return nil, err
+		}
+	}
+
+	return newObj, nil
+}
+
+// AdmissionToValidateObjectUpdateFunc converts validating admission to a rest validate object update func
+func AdmissionToValidateObjectUpdateFunc(admit admission.Interface, staticAttributes admission.Attributes) ValidateObjectUpdateFunc {
+	validatingAdmission, ok := admit.(admission.ValidationInterface)
+	if !ok {
+		return func(obj, old runtime.Object) error { return nil }
+	}
+	return func(obj, old runtime.Object) error {
+		finalAttributes := admission.NewAttributesRecord(
+			obj,
+			old,
+			staticAttributes.GetKind(),
+			staticAttributes.GetNamespace(),
+			staticAttributes.GetName(),
+			staticAttributes.GetResource(),
+			staticAttributes.GetSubresource(),
+			staticAttributes.GetOperation(),
+			staticAttributes.GetUserInfo(),
+		)
+		if !validatingAdmission.Handles(finalAttributes.GetOperation()) {
+			return nil
+		}
+		return validatingAdmission.Validate(finalAttributes)
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/registry/rest/zz_generated.deepcopy.go b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/rest/zz_generated.deepcopy.go
new file mode 100644
index 0000000..1ddd119
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/registry/rest/zz_generated.deepcopy.go
@@ -0,0 +1,54 @@
+// +build !ignore_autogenerated
+
+/*
+Copyright The Kubernetes Authors.
+
+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.
+*/
+
+// Code generated by deepcopy-gen. DO NOT EDIT.
+
+package rest
+
+import (
+	runtime "k8s.io/apimachinery/pkg/runtime"
+)
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ConnectRequest) DeepCopyInto(out *ConnectRequest) {
+	*out = *in
+	if in.Options == nil {
+		out.Options = nil
+	} else {
+		out.Options = in.Options.DeepCopyObject()
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConnectRequest.
+func (in *ConnectRequest) DeepCopy() *ConnectRequest {
+	if in == nil {
+		return nil
+	}
+	out := new(ConnectRequest)
+	in.DeepCopyInto(out)
+	return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *ConnectRequest) DeepCopyObject() runtime.Object {
+	if c := in.DeepCopy(); c != nil {
+		return c
+	}
+	return nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/config.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/config.go
new file mode 100644
index 0000000..41ae90a
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/config.go
@@ -0,0 +1,616 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package server
+
+import (
+	"crypto/tls"
+	"crypto/x509"
+	"fmt"
+	"io"
+	"net"
+	"net/http"
+	goruntime "runtime"
+	"sort"
+	"strconv"
+	"strings"
+	"time"
+
+	"github.com/emicklei/go-restful-swagger12"
+	"github.com/go-openapi/spec"
+	"github.com/pborman/uuid"
+
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/serializer"
+	"k8s.io/apimachinery/pkg/util/sets"
+	utilwaitgroup "k8s.io/apimachinery/pkg/util/waitgroup"
+	"k8s.io/apimachinery/pkg/version"
+	"k8s.io/apiserver/pkg/admission"
+	"k8s.io/apiserver/pkg/audit"
+	auditpolicy "k8s.io/apiserver/pkg/audit/policy"
+	"k8s.io/apiserver/pkg/authentication/authenticator"
+	"k8s.io/apiserver/pkg/authentication/authenticatorfactory"
+	authenticatorunion "k8s.io/apiserver/pkg/authentication/request/union"
+	"k8s.io/apiserver/pkg/authentication/user"
+	"k8s.io/apiserver/pkg/authorization/authorizer"
+	"k8s.io/apiserver/pkg/authorization/authorizerfactory"
+	authorizerunion "k8s.io/apiserver/pkg/authorization/union"
+	"k8s.io/apiserver/pkg/endpoints/discovery"
+	genericapifilters "k8s.io/apiserver/pkg/endpoints/filters"
+	apiopenapi "k8s.io/apiserver/pkg/endpoints/openapi"
+	apirequest "k8s.io/apiserver/pkg/endpoints/request"
+	"k8s.io/apiserver/pkg/features"
+	genericregistry "k8s.io/apiserver/pkg/registry/generic"
+	genericfilters "k8s.io/apiserver/pkg/server/filters"
+	"k8s.io/apiserver/pkg/server/healthz"
+	"k8s.io/apiserver/pkg/server/routes"
+	serverstore "k8s.io/apiserver/pkg/server/storage"
+	utilfeature "k8s.io/apiserver/pkg/util/feature"
+	"k8s.io/client-go/informers"
+	restclient "k8s.io/client-go/rest"
+	certutil "k8s.io/client-go/util/cert"
+	openapicommon "k8s.io/kube-openapi/pkg/common"
+
+	// install apis
+	"github.com/golang/glog"
+	_ "k8s.io/apiserver/pkg/apis/apiserver/install"
+)
+
+const (
+	// DefaultLegacyAPIPrefix is where the legacy APIs will be located.
+	DefaultLegacyAPIPrefix = "/api"
+
+	// APIGroupPrefix is where non-legacy API group will be located.
+	APIGroupPrefix = "/apis"
+)
+
+// Config is a structure used to configure a GenericAPIServer.
+// Its members are sorted roughly in order of importance for composers.
+type Config struct {
+	// SecureServing is required to serve https
+	SecureServing *SecureServingInfo
+
+	// Authentication is the configuration for authentication
+	Authentication AuthenticationInfo
+
+	// Authorization is the configuration for authorization
+	Authorization AuthorizationInfo
+
+	// LoopbackClientConfig is a config for a privileged loopback connection to the API server
+	// This is required for proper functioning of the PostStartHooks on a GenericAPIServer
+	// TODO: move into SecureServing(WithLoopback) as soon as insecure serving is gone
+	LoopbackClientConfig *restclient.Config
+	// RuleResolver is required to get the list of rules that apply to a given user
+	// in a given namespace
+	RuleResolver authorizer.RuleResolver
+	// AdmissionControl performs deep inspection of a given request (including content)
+	// to set values and determine whether its allowed
+	AdmissionControl      admission.Interface
+	CorsAllowedOriginList []string
+
+	EnableSwaggerUI bool
+	EnableIndex     bool
+	EnableProfiling bool
+	EnableDiscovery bool
+	// Requires generic profiling enabled
+	EnableContentionProfiling bool
+	EnableMetrics             bool
+
+	DisabledPostStartHooks sets.String
+
+	// Version will enable the /version endpoint if non-nil
+	Version *version.Info
+	// LegacyAuditWriter is the destination for audit logs. If nil, they will not be written.
+	LegacyAuditWriter io.Writer
+	// AuditBackend is where audit events are sent to.
+	AuditBackend audit.Backend
+	// AuditPolicyChecker makes the decision of whether and how to audit log a request.
+	AuditPolicyChecker auditpolicy.Checker
+	// ExternalAddress is the host name to use for external (public internet) facing URLs (e.g. Swagger)
+	// Will default to a value based on secure serving info and available ipv4 IPs.
+	ExternalAddress string
+
+	//===========================================================================
+	// Fields you probably don't care about changing
+	//===========================================================================
+
+	// BuildHandlerChainFunc allows you to build custom handler chains by decorating the apiHandler.
+	BuildHandlerChainFunc func(apiHandler http.Handler, c *Config) (secure http.Handler)
+	// HandlerChainWaitGroup allows you to wait for all chain handlers exit after the server shutdown.
+	HandlerChainWaitGroup *utilwaitgroup.SafeWaitGroup
+	// DiscoveryAddresses is used to build the IPs pass to discovery. If nil, the ExternalAddress is
+	// always reported
+	DiscoveryAddresses discovery.Addresses
+	// The default set of healthz checks. There might be more added via AddHealthzChecks dynamically.
+	HealthzChecks []healthz.HealthzChecker
+	// LegacyAPIGroupPrefixes is used to set up URL parsing for authorization and for validating requests
+	// to InstallLegacyAPIGroup. New API servers don't generally have legacy groups at all.
+	LegacyAPIGroupPrefixes sets.String
+	// RequestInfoResolver is used to assign attributes (used by admission and authorization) based on a request URL.
+	// Use-cases that are like kubelets may need to customize this.
+	RequestInfoResolver apirequest.RequestInfoResolver
+	// Serializer is required and provides the interface for serializing and converting objects to and from the wire
+	// The default (api.Codecs) usually works fine.
+	Serializer runtime.NegotiatedSerializer
+	// OpenAPIConfig will be used in generating OpenAPI spec. This is nil by default. Use DefaultOpenAPIConfig for "working" defaults.
+	OpenAPIConfig *openapicommon.Config
+	// SwaggerConfig will be used in generating Swagger spec. This is nil by default. Use DefaultSwaggerConfig for "working" defaults.
+	SwaggerConfig *swagger.Config
+
+	// RESTOptionsGetter is used to construct RESTStorage types via the generic registry.
+	RESTOptionsGetter genericregistry.RESTOptionsGetter
+
+	// If specified, all requests except those which match the LongRunningFunc predicate will timeout
+	// after this duration.
+	RequestTimeout time.Duration
+	// If specified, long running requests such as watch will be allocated a random timeout between this value, and
+	// twice this value.  Note that it is up to the request handlers to ignore or honor this timeout. In seconds.
+	MinRequestTimeout int
+	// MaxRequestsInFlight is the maximum number of parallel non-long-running requests. Every further
+	// request has to wait. Applies only to non-mutating requests.
+	MaxRequestsInFlight int
+	// MaxMutatingRequestsInFlight is the maximum number of parallel mutating requests. Every further
+	// request has to wait.
+	MaxMutatingRequestsInFlight int
+	// Predicate which is true for paths of long-running http requests
+	LongRunningFunc apirequest.LongRunningRequestCheck
+
+	// EnableAPIResponseCompression indicates whether API Responses should support compression
+	// if the client requests it via Accept-Encoding
+	EnableAPIResponseCompression bool
+
+	// MergedResourceConfig indicates which groupVersion enabled and its resources enabled/disabled.
+	// This is composed of genericapiserver defaultAPIResourceConfig and those parsed from flags.
+	// If not specify any in flags, then genericapiserver will only enable defaultAPIResourceConfig.
+	MergedResourceConfig *serverstore.ResourceConfig
+
+	//===========================================================================
+	// values below here are targets for removal
+	//===========================================================================
+
+	// The port on PublicAddress where a read-write server will be installed.
+	// Defaults to 6443 if not set.
+	ReadWritePort int
+	// PublicAddress is the IP address where members of the cluster (kubelet,
+	// kube-proxy, services, etc.) can reach the GenericAPIServer.
+	// If nil or 0.0.0.0, the host's default interface will be used.
+	PublicAddress net.IP
+}
+
+type RecommendedConfig struct {
+	Config
+
+	// SharedInformerFactory provides shared informers for Kubernetes resources. This value is set by
+	// RecommendedOptions.CoreAPI.ApplyTo called by RecommendedOptions.ApplyTo. It uses an in-cluster client config
+	// by default, or the kubeconfig given with kubeconfig command line flag.
+	SharedInformerFactory informers.SharedInformerFactory
+
+	// ClientConfig holds the kubernetes client configuration.
+	// This value is set by RecommendedOptions.CoreAPI.ApplyTo called by RecommendedOptions.ApplyTo.
+	// By default in-cluster client config is used.
+	ClientConfig *restclient.Config
+}
+
+type SecureServingInfo struct {
+	// Listener is the secure server network listener.
+	Listener net.Listener
+
+	// Cert is the main server cert which is used if SNI does not match. Cert must be non-nil and is
+	// allowed to be in SNICerts.
+	Cert *tls.Certificate
+
+	// SNICerts are the TLS certificates by name used for SNI.
+	SNICerts map[string]*tls.Certificate
+
+	// ClientCA is the certificate bundle for all the signers that you'll recognize for incoming client certificates
+	ClientCA *x509.CertPool
+
+	// MinTLSVersion optionally overrides the minimum TLS version supported.
+	// Values are from tls package constants (https://golang.org/pkg/crypto/tls/#pkg-constants).
+	MinTLSVersion uint16
+
+	// CipherSuites optionally overrides the list of allowed cipher suites for the server.
+	// Values are from tls package constants (https://golang.org/pkg/crypto/tls/#pkg-constants).
+	CipherSuites []uint16
+
+	// HTTP2MaxStreamsPerConnection is the limit that the api server imposes on each client.
+	// A value of zero means to use the default provided by golang's HTTP/2 support.
+	HTTP2MaxStreamsPerConnection int
+}
+
+type AuthenticationInfo struct {
+	// Authenticator determines which subject is making the request
+	Authenticator authenticator.Request
+	// SupportsBasicAuth indicates that's at least one Authenticator supports basic auth
+	// If this is true, a basic auth challenge is returned on authentication failure
+	// TODO(roberthbailey): Remove once the server no longer supports http basic auth.
+	SupportsBasicAuth bool
+}
+
+type AuthorizationInfo struct {
+	// Authorizer determines whether the subject is allowed to make the request based only
+	// on the RequestURI
+	Authorizer authorizer.Authorizer
+}
+
+// NewConfig returns a Config struct with the default values
+func NewConfig(codecs serializer.CodecFactory) *Config {
+	return &Config{
+		Serializer:                   codecs,
+		ReadWritePort:                443,
+		BuildHandlerChainFunc:        DefaultBuildHandlerChain,
+		HandlerChainWaitGroup:        new(utilwaitgroup.SafeWaitGroup),
+		LegacyAPIGroupPrefixes:       sets.NewString(DefaultLegacyAPIPrefix),
+		DisabledPostStartHooks:       sets.NewString(),
+		HealthzChecks:                []healthz.HealthzChecker{healthz.PingHealthz},
+		EnableIndex:                  true,
+		EnableDiscovery:              true,
+		EnableProfiling:              true,
+		EnableMetrics:                true,
+		MaxRequestsInFlight:          400,
+		MaxMutatingRequestsInFlight:  200,
+		RequestTimeout:               time.Duration(60) * time.Second,
+		MinRequestTimeout:            1800,
+		EnableAPIResponseCompression: utilfeature.DefaultFeatureGate.Enabled(features.APIResponseCompression),
+
+		// Default to treating watch as a long-running operation
+		// Generic API servers have no inherent long-running subresources
+		LongRunningFunc: genericfilters.BasicLongRunningRequestCheck(sets.NewString("watch"), sets.NewString()),
+	}
+}
+
+// NewRecommendedConfig returns a RecommendedConfig struct with the default values
+func NewRecommendedConfig(codecs serializer.CodecFactory) *RecommendedConfig {
+	return &RecommendedConfig{
+		Config: *NewConfig(codecs),
+	}
+}
+
+func DefaultOpenAPIConfig(getDefinitions openapicommon.GetOpenAPIDefinitions, defNamer *apiopenapi.DefinitionNamer) *openapicommon.Config {
+	return &openapicommon.Config{
+		ProtocolList:   []string{"https"},
+		IgnorePrefixes: []string{"/swaggerapi"},
+		Info: &spec.Info{
+			InfoProps: spec.InfoProps{
+				Title: "Generic API Server",
+			},
+		},
+		DefaultResponse: &spec.Response{
+			ResponseProps: spec.ResponseProps{
+				Description: "Default Response.",
+			},
+		},
+		GetOperationIDAndTags: apiopenapi.GetOperationIDAndTags,
+		GetDefinitionName:     defNamer.GetDefinitionName,
+		GetDefinitions:        getDefinitions,
+	}
+}
+
+// DefaultSwaggerConfig returns a default configuration without WebServiceURL and
+// WebServices set.
+func DefaultSwaggerConfig() *swagger.Config {
+	return &swagger.Config{
+		ApiPath:         "/swaggerapi",
+		SwaggerPath:     "/swaggerui/",
+		SwaggerFilePath: "/swagger-ui/",
+		SchemaFormatHandler: func(typeName string) string {
+			switch typeName {
+			case "metav1.Time", "*metav1.Time":
+				return "date-time"
+			}
+			return ""
+		},
+	}
+}
+
+func (c *AuthenticationInfo) ApplyClientCert(clientCAFile string, servingInfo *SecureServingInfo) error {
+	if servingInfo != nil {
+		if len(clientCAFile) > 0 {
+			clientCAs, err := certutil.CertsFromFile(clientCAFile)
+			if err != nil {
+				return fmt.Errorf("unable to load client CA file: %v", err)
+			}
+			if servingInfo.ClientCA == nil {
+				servingInfo.ClientCA = x509.NewCertPool()
+			}
+			for _, cert := range clientCAs {
+				servingInfo.ClientCA.AddCert(cert)
+			}
+		}
+	}
+
+	return nil
+}
+
+type completedConfig struct {
+	*Config
+
+	//===========================================================================
+	// values below here are filled in during completion
+	//===========================================================================
+
+	// SharedInformerFactory provides shared informers for resources
+	SharedInformerFactory informers.SharedInformerFactory
+}
+
+type CompletedConfig struct {
+	// Embed a private pointer that cannot be instantiated outside of this package.
+	*completedConfig
+}
+
+// Complete fills in any fields not set that are required to have valid data and can be derived
+// from other fields. If you're going to `ApplyOptions`, do that first. It's mutating the receiver.
+func (c *Config) Complete(informers informers.SharedInformerFactory) CompletedConfig {
+	host := c.ExternalAddress
+	if host == "" && c.PublicAddress != nil {
+		host = c.PublicAddress.String()
+	}
+
+	// if there is no port, and we have a ReadWritePort, use that
+	if _, _, err := net.SplitHostPort(host); err != nil && c.ReadWritePort != 0 {
+		host = net.JoinHostPort(host, strconv.Itoa(c.ReadWritePort))
+	}
+	c.ExternalAddress = host
+
+	if c.OpenAPIConfig != nil && c.OpenAPIConfig.SecurityDefinitions != nil {
+		// Setup OpenAPI security: all APIs will have the same authentication for now.
+		c.OpenAPIConfig.DefaultSecurity = []map[string][]string{}
+		keys := []string{}
+		for k := range *c.OpenAPIConfig.SecurityDefinitions {
+			keys = append(keys, k)
+		}
+		sort.Strings(keys)
+		for _, k := range keys {
+			c.OpenAPIConfig.DefaultSecurity = append(c.OpenAPIConfig.DefaultSecurity, map[string][]string{k: {}})
+		}
+		if c.OpenAPIConfig.CommonResponses == nil {
+			c.OpenAPIConfig.CommonResponses = map[int]spec.Response{}
+		}
+		if _, exists := c.OpenAPIConfig.CommonResponses[http.StatusUnauthorized]; !exists {
+			c.OpenAPIConfig.CommonResponses[http.StatusUnauthorized] = spec.Response{
+				ResponseProps: spec.ResponseProps{
+					Description: "Unauthorized",
+				},
+			}
+		}
+
+		if c.OpenAPIConfig.Info == nil {
+			c.OpenAPIConfig.Info = &spec.Info{}
+		}
+		if c.OpenAPIConfig.Info.Version == "" {
+			if c.Version != nil {
+				c.OpenAPIConfig.Info.Version = strings.Split(c.Version.String(), "-")[0]
+			} else {
+				c.OpenAPIConfig.Info.Version = "unversioned"
+			}
+		}
+	}
+	if c.SwaggerConfig != nil && len(c.SwaggerConfig.WebServicesUrl) == 0 {
+		if c.SecureServing != nil {
+			c.SwaggerConfig.WebServicesUrl = "https://" + c.ExternalAddress
+		} else {
+			c.SwaggerConfig.WebServicesUrl = "http://" + c.ExternalAddress
+		}
+	}
+	if c.DiscoveryAddresses == nil {
+		c.DiscoveryAddresses = discovery.DefaultAddresses{DefaultAddress: c.ExternalAddress}
+	}
+
+	// If the loopbackclientconfig is specified AND it has a token for use against the API server
+	// wrap the authenticator and authorizer in loopback authentication logic
+	if c.Authentication.Authenticator != nil && c.Authorization.Authorizer != nil && c.LoopbackClientConfig != nil && len(c.LoopbackClientConfig.BearerToken) > 0 {
+		privilegedLoopbackToken := c.LoopbackClientConfig.BearerToken
+		var uid = uuid.NewRandom().String()
+		tokens := make(map[string]*user.DefaultInfo)
+		tokens[privilegedLoopbackToken] = &user.DefaultInfo{
+			Name:   user.APIServerUser,
+			UID:    uid,
+			Groups: []string{user.SystemPrivilegedGroup},
+		}
+
+		tokenAuthenticator := authenticatorfactory.NewFromTokens(tokens)
+		c.Authentication.Authenticator = authenticatorunion.New(tokenAuthenticator, c.Authentication.Authenticator)
+
+		tokenAuthorizer := authorizerfactory.NewPrivilegedGroups(user.SystemPrivilegedGroup)
+		c.Authorization.Authorizer = authorizerunion.New(tokenAuthorizer, c.Authorization.Authorizer)
+	}
+
+	if c.RequestInfoResolver == nil {
+		c.RequestInfoResolver = NewRequestInfoResolver(c)
+	}
+
+	return CompletedConfig{&completedConfig{c, informers}}
+}
+
+// Complete fills in any fields not set that are required to have valid data and can be derived
+// from other fields. If you're going to `ApplyOptions`, do that first. It's mutating the receiver.
+func (c *RecommendedConfig) Complete() CompletedConfig {
+	return c.Config.Complete(c.SharedInformerFactory)
+}
+
+// New creates a new server which logically combines the handling chain with the passed server.
+// name is used to differentiate for logging. The handler chain in particular can be difficult as it starts delgating.
+// delegationTarget may not be nil.
+func (c completedConfig) New(name string, delegationTarget DelegationTarget) (*GenericAPIServer, error) {
+	if c.Serializer == nil {
+		return nil, fmt.Errorf("Genericapiserver.New() called with config.Serializer == nil")
+	}
+	if c.LoopbackClientConfig == nil {
+		return nil, fmt.Errorf("Genericapiserver.New() called with config.LoopbackClientConfig == nil")
+	}
+
+	handlerChainBuilder := func(handler http.Handler) http.Handler {
+		return c.BuildHandlerChainFunc(handler, c.Config)
+	}
+	apiServerHandler := NewAPIServerHandler(name, c.Serializer, handlerChainBuilder, delegationTarget.UnprotectedHandler())
+
+	s := &GenericAPIServer{
+		discoveryAddresses:     c.DiscoveryAddresses,
+		LoopbackClientConfig:   c.LoopbackClientConfig,
+		legacyAPIGroupPrefixes: c.LegacyAPIGroupPrefixes,
+		admissionControl:       c.AdmissionControl,
+		Serializer:             c.Serializer,
+		AuditBackend:           c.AuditBackend,
+		delegationTarget:       delegationTarget,
+		HandlerChainWaitGroup:  c.HandlerChainWaitGroup,
+
+		minRequestTimeout: time.Duration(c.MinRequestTimeout) * time.Second,
+		ShutdownTimeout:   c.RequestTimeout,
+
+		SecureServingInfo: c.SecureServing,
+		ExternalAddress:   c.ExternalAddress,
+
+		Handler: apiServerHandler,
+
+		listedPathProvider: apiServerHandler,
+
+		swaggerConfig: c.SwaggerConfig,
+		openAPIConfig: c.OpenAPIConfig,
+
+		postStartHooks:         map[string]postStartHookEntry{},
+		preShutdownHooks:       map[string]preShutdownHookEntry{},
+		disabledPostStartHooks: c.DisabledPostStartHooks,
+
+		healthzChecks: c.HealthzChecks,
+
+		DiscoveryGroupManager: discovery.NewRootAPIsHandler(c.DiscoveryAddresses, c.Serializer),
+
+		enableAPIResponseCompression: c.EnableAPIResponseCompression,
+	}
+
+	for k, v := range delegationTarget.PostStartHooks() {
+		s.postStartHooks[k] = v
+	}
+
+	for k, v := range delegationTarget.PreShutdownHooks() {
+		s.preShutdownHooks[k] = v
+	}
+
+	genericApiServerHookName := "generic-apiserver-start-informers"
+	if c.SharedInformerFactory != nil && !s.isPostStartHookRegistered(genericApiServerHookName) {
+		err := s.AddPostStartHook(genericApiServerHookName, func(context PostStartHookContext) error {
+			c.SharedInformerFactory.Start(context.StopCh)
+			return nil
+		})
+		if err != nil {
+			return nil, err
+		}
+	}
+
+	for _, delegateCheck := range delegationTarget.HealthzChecks() {
+		skip := false
+		for _, existingCheck := range c.HealthzChecks {
+			if existingCheck.Name() == delegateCheck.Name() {
+				skip = true
+				break
+			}
+		}
+		if skip {
+			continue
+		}
+
+		s.healthzChecks = append(s.healthzChecks, delegateCheck)
+	}
+
+	s.listedPathProvider = routes.ListedPathProviders{s.listedPathProvider, delegationTarget}
+
+	installAPI(s, c.Config)
+
+	// use the UnprotectedHandler from the delegation target to ensure that we don't attempt to double authenticator, authorize,
+	// or some other part of the filter chain in delegation cases.
+	if delegationTarget.UnprotectedHandler() == nil && c.EnableIndex {
+		s.Handler.NonGoRestfulMux.NotFoundHandler(routes.IndexLister{
+			StatusCode:   http.StatusNotFound,
+			PathProvider: s.listedPathProvider,
+		})
+	}
+
+	return s, nil
+}
+
+func DefaultBuildHandlerChain(apiHandler http.Handler, c *Config) http.Handler {
+	handler := genericapifilters.WithAuthorization(apiHandler, c.Authorization.Authorizer, c.Serializer)
+	handler = genericfilters.WithMaxInFlightLimit(handler, c.MaxRequestsInFlight, c.MaxMutatingRequestsInFlight, c.LongRunningFunc)
+	handler = genericapifilters.WithImpersonation(handler, c.Authorization.Authorizer, c.Serializer)
+	if utilfeature.DefaultFeatureGate.Enabled(features.AdvancedAuditing) {
+		handler = genericapifilters.WithAudit(handler, c.AuditBackend, c.AuditPolicyChecker, c.LongRunningFunc)
+	} else {
+		handler = genericapifilters.WithLegacyAudit(handler, c.LegacyAuditWriter)
+	}
+	failedHandler := genericapifilters.Unauthorized(c.Serializer, c.Authentication.SupportsBasicAuth)
+	if utilfeature.DefaultFeatureGate.Enabled(features.AdvancedAuditing) {
+		failedHandler = genericapifilters.WithFailedAuthenticationAudit(failedHandler, c.AuditBackend, c.AuditPolicyChecker)
+	}
+	handler = genericapifilters.WithAuthentication(handler, c.Authentication.Authenticator, failedHandler)
+	handler = genericfilters.WithCORS(handler, c.CorsAllowedOriginList, nil, nil, nil, "true")
+	handler = genericfilters.WithTimeoutForNonLongRunningRequests(handler, c.LongRunningFunc, c.RequestTimeout)
+	handler = genericfilters.WithWaitGroup(handler, c.LongRunningFunc, c.HandlerChainWaitGroup)
+	handler = genericapifilters.WithRequestInfo(handler, c.RequestInfoResolver)
+	handler = genericfilters.WithPanicRecovery(handler)
+	return handler
+}
+
+func installAPI(s *GenericAPIServer, c *Config) {
+	if c.EnableIndex {
+		routes.Index{}.Install(s.listedPathProvider, s.Handler.NonGoRestfulMux)
+	}
+	if c.SwaggerConfig != nil && c.EnableSwaggerUI {
+		routes.SwaggerUI{}.Install(s.Handler.NonGoRestfulMux)
+	}
+	if c.EnableProfiling {
+		routes.Profiling{}.Install(s.Handler.NonGoRestfulMux)
+		if c.EnableContentionProfiling {
+			goruntime.SetBlockProfileRate(1)
+		}
+		// so far, only logging related endpoints are considered valid to add for these debug flags.
+		routes.DebugFlags{}.Install(s.Handler.NonGoRestfulMux, "v", routes.StringFlagPutHandler(
+			routes.StringFlagSetterFunc(func(val string) (string, error) {
+				var level glog.Level
+				if err := level.Set(val); err != nil {
+					return "", fmt.Errorf("failed set glog.logging.verbosity %s: %v", val, err)
+				}
+				return "successfully set glog.logging.verbosity to " + val, nil
+			}),
+		))
+	}
+	if c.EnableMetrics {
+		if c.EnableProfiling {
+			routes.MetricsWithReset{}.Install(s.Handler.NonGoRestfulMux)
+		} else {
+			routes.DefaultMetrics{}.Install(s.Handler.NonGoRestfulMux)
+		}
+	}
+
+	routes.Version{Version: c.Version}.Install(s.Handler.GoRestfulContainer)
+
+	if c.EnableDiscovery {
+		s.Handler.GoRestfulContainer.Add(s.DiscoveryGroupManager.WebService())
+	}
+}
+
+func NewRequestInfoResolver(c *Config) *apirequest.RequestInfoFactory {
+	apiPrefixes := sets.NewString(strings.Trim(APIGroupPrefix, "/")) // all possible API prefixes
+	legacyAPIPrefixes := sets.String{}                               // APIPrefixes that won't have groups (legacy)
+	for legacyAPIPrefix := range c.LegacyAPIGroupPrefixes {
+		apiPrefixes.Insert(strings.Trim(legacyAPIPrefix, "/"))
+		legacyAPIPrefixes.Insert(strings.Trim(legacyAPIPrefix, "/"))
+	}
+
+	return &apirequest.RequestInfoFactory{
+		APIPrefixes:          apiPrefixes,
+		GrouplessAPIPrefixes: legacyAPIPrefixes,
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/config_selfclient.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/config_selfclient.go
new file mode 100644
index 0000000..bf09161
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/config_selfclient.go
@@ -0,0 +1,83 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package server
+
+import (
+	"fmt"
+	"net"
+
+	restclient "k8s.io/client-go/rest"
+)
+
+// LoopbackClientServerNameOverride is passed to the apiserver from the loopback client in order to
+// select the loopback certificate via SNI if TLS is used.
+const LoopbackClientServerNameOverride = "apiserver-loopback-client"
+
+func (s *SecureServingInfo) NewLoopbackClientConfig(token string, loopbackCert []byte) (*restclient.Config, error) {
+	if s == nil || (s.Cert == nil && len(s.SNICerts) == 0) {
+		return nil, nil
+	}
+
+	host, port, err := LoopbackHostPort(s.Listener.Addr().String())
+	if err != nil {
+		return nil, err
+	}
+
+	return &restclient.Config{
+		// Increase QPS limits. The client is currently passed to all admission plugins,
+		// and those can be throttled in case of higher load on apiserver - see #22340 and #22422
+		// for more details. Once #22422 is fixed, we may want to remove it.
+		QPS:         50,
+		Burst:       100,
+		Host:        "https://" + net.JoinHostPort(host, port),
+		BearerToken: token,
+		// override the ServerName to select our loopback certificate via SNI. This name is also
+		// used by the client to compare the returns server certificate against.
+		TLSClientConfig: restclient.TLSClientConfig{
+			ServerName: LoopbackClientServerNameOverride,
+			CAData:     loopbackCert,
+		},
+	}, nil
+}
+
+// LoopbackHostPort returns the host and port loopback REST clients should use
+// to contact the server.
+func LoopbackHostPort(bindAddress string) (string, string, error) {
+	host, port, err := net.SplitHostPort(bindAddress)
+	if err != nil {
+		// should never happen
+		return "", "", fmt.Errorf("invalid server bind address: %q", bindAddress)
+	}
+
+	// Value is expected to be an IP or DNS name, not "0.0.0.0".
+	if host == "0.0.0.0" || host == "::" {
+		host = "localhost"
+		// Get ip of local interface, but fall back to "localhost".
+		// Note that "localhost" is resolved with the external nameserver first with Go's stdlib.
+		// So if localhost.<yoursearchdomain> resolves, we don't get a 127.0.0.1 as expected.
+		addrs, err := net.InterfaceAddrs()
+		if err == nil {
+			for _, address := range addrs {
+				if ipnet, ok := address.(*net.IPNet); ok && ipnet.IP.IsLoopback() {
+					host = ipnet.IP.String()
+					break
+				}
+			}
+		}
+	}
+	return host, port, nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/doc.go
new file mode 100644
index 0000000..b5f97c6
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/doc.go
@@ -0,0 +1,18 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+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.
+*/
+
+// Package server contains the plumbing to create kubernetes-like API server command.
+package server
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/filters/OWNERS b/metrics-server/vendor/k8s.io/apiserver/pkg/server/filters/OWNERS
new file mode 100755
index 0000000..121af95
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/filters/OWNERS
@@ -0,0 +1,3 @@
+reviewers:
+- sttts
+- dims
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/filters/compression.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/filters/compression.go
new file mode 100644
index 0000000..625cd5c
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/filters/compression.go
@@ -0,0 +1,181 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package filters
+
+import (
+	"compress/gzip"
+	"compress/zlib"
+	"errors"
+	"fmt"
+	"io"
+	"net/http"
+	"strings"
+
+	"github.com/emicklei/go-restful"
+
+	"k8s.io/apimachinery/pkg/util/runtime"
+	"k8s.io/apiserver/pkg/endpoints/request"
+)
+
+// Compressor is an interface to compression writers
+type Compressor interface {
+	io.WriteCloser
+	Flush() error
+}
+
+const (
+	headerAcceptEncoding  = "Accept-Encoding"
+	headerContentEncoding = "Content-Encoding"
+
+	encodingGzip    = "gzip"
+	encodingDeflate = "deflate"
+)
+
+// WithCompression wraps an http.Handler with the Compression Handler
+func WithCompression(handler http.Handler) http.Handler {
+	return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
+		wantsCompression, encoding := wantsCompressedResponse(req)
+		w.Header().Set("Vary", "Accept-Encoding")
+		if wantsCompression {
+			compressionWriter, err := NewCompressionResponseWriter(w, encoding)
+			if err != nil {
+				handleError(w, req, err)
+				runtime.HandleError(fmt.Errorf("failed to compress HTTP response: %v", err))
+				return
+			}
+			compressionWriter.Header().Set("Content-Encoding", encoding)
+			handler.ServeHTTP(compressionWriter, req)
+			compressionWriter.(*compressionResponseWriter).Close()
+		} else {
+			handler.ServeHTTP(w, req)
+		}
+	})
+}
+
+// wantsCompressedResponse reads the Accept-Encoding header to see if and which encoding is requested.
+func wantsCompressedResponse(req *http.Request) (bool, string) {
+	// don't compress watches
+	ctx := req.Context()
+	info, ok := request.RequestInfoFrom(ctx)
+	if !ok {
+		return false, ""
+	}
+	if !info.IsResourceRequest {
+		return false, ""
+	}
+	if info.Verb == "watch" {
+		return false, ""
+	}
+	header := req.Header.Get(headerAcceptEncoding)
+	gi := strings.Index(header, encodingGzip)
+	zi := strings.Index(header, encodingDeflate)
+	// use in order of appearance
+	switch {
+	case gi == -1:
+		return zi != -1, encodingDeflate
+	case zi == -1:
+		return gi != -1, encodingGzip
+	case gi < zi:
+		return true, encodingGzip
+	default:
+		return true, encodingDeflate
+	}
+}
+
+type compressionResponseWriter struct {
+	writer     http.ResponseWriter
+	compressor Compressor
+	encoding   string
+}
+
+// NewCompressionResponseWriter returns wraps w with a compression ResponseWriter, using the given encoding
+func NewCompressionResponseWriter(w http.ResponseWriter, encoding string) (http.ResponseWriter, error) {
+	var compressor Compressor
+	switch encoding {
+	case encodingGzip:
+		compressor = gzip.NewWriter(w)
+	case encodingDeflate:
+		compressor = zlib.NewWriter(w)
+	default:
+		return nil, fmt.Errorf("%s is not a supported encoding type", encoding)
+	}
+	return &compressionResponseWriter{
+		writer:     w,
+		compressor: compressor,
+		encoding:   encoding,
+	}, nil
+}
+
+// compressionResponseWriter implements http.Responsewriter Interface
+var _ http.ResponseWriter = &compressionResponseWriter{}
+
+func (c *compressionResponseWriter) Header() http.Header {
+	return c.writer.Header()
+}
+
+// compress data according to compression method
+func (c *compressionResponseWriter) Write(p []byte) (int, error) {
+	if c.compressorClosed() {
+		return -1, errors.New("compressing error: tried to write data using closed compressor")
+	}
+	c.Header().Set(headerContentEncoding, c.encoding)
+	defer c.compressor.Flush()
+	return c.compressor.Write(p)
+}
+
+func (c *compressionResponseWriter) WriteHeader(status int) {
+	c.writer.WriteHeader(status)
+}
+
+// CloseNotify is part of http.CloseNotifier interface
+func (c *compressionResponseWriter) CloseNotify() <-chan bool {
+	return c.writer.(http.CloseNotifier).CloseNotify()
+}
+
+// Close the underlying compressor
+func (c *compressionResponseWriter) Close() error {
+	if c.compressorClosed() {
+		return errors.New("Compressing error: tried to close already closed compressor")
+	}
+
+	c.compressor.Close()
+	c.compressor = nil
+	return nil
+}
+
+func (c *compressionResponseWriter) Flush() {
+	if c.compressorClosed() {
+		return
+	}
+	c.compressor.Flush()
+}
+
+func (c *compressionResponseWriter) compressorClosed() bool {
+	return nil == c.compressor
+}
+
+// RestfulWithCompression wraps WithCompression to be compatible with go-restful
+func RestfulWithCompression(function restful.RouteFunction) restful.RouteFunction {
+	return restful.RouteFunction(func(request *restful.Request, response *restful.Response) {
+		handler := WithCompression(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
+			response.ResponseWriter = w
+			request.Request = req
+			function(request, response)
+		}))
+		handler.ServeHTTP(response.ResponseWriter, request.Request)
+	})
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/filters/cors.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/filters/cors.go
new file mode 100644
index 0000000..2c6e66e
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/filters/cors.go
@@ -0,0 +1,98 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package filters
+
+import (
+	"net/http"
+	"regexp"
+	"strings"
+
+	"github.com/golang/glog"
+)
+
+// TODO: use restful.CrossOriginResourceSharing
+// See github.com/emicklei/go-restful/blob/master/examples/restful-CORS-filter.go, and
+// github.com/emicklei/go-restful/blob/master/examples/restful-basic-authentication.go
+// Or, for a more detailed implementation use https://github.com/martini-contrib/cors
+// or implement CORS at your proxy layer.
+
+// WithCORS is a simple CORS implementation that wraps an http Handler.
+// Pass nil for allowedMethods and allowedHeaders to use the defaults. If allowedOriginPatterns
+// is empty or nil, no CORS support is installed.
+func WithCORS(handler http.Handler, allowedOriginPatterns []string, allowedMethods []string, allowedHeaders []string, exposedHeaders []string, allowCredentials string) http.Handler {
+	if len(allowedOriginPatterns) == 0 {
+		return handler
+	}
+	allowedOriginPatternsREs := allowedOriginRegexps(allowedOriginPatterns)
+	return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
+		origin := req.Header.Get("Origin")
+		if origin != "" {
+			allowed := false
+			for _, re := range allowedOriginPatternsREs {
+				if allowed = re.MatchString(origin); allowed {
+					break
+				}
+			}
+			if allowed {
+				w.Header().Set("Access-Control-Allow-Origin", origin)
+				// Set defaults for methods and headers if nothing was passed
+				if allowedMethods == nil {
+					allowedMethods = []string{"POST", "GET", "OPTIONS", "PUT", "DELETE", "PATCH"}
+				}
+				if allowedHeaders == nil {
+					allowedHeaders = []string{"Content-Type", "Content-Length", "Accept-Encoding", "X-CSRF-Token", "Authorization", "X-Requested-With", "If-Modified-Since"}
+				}
+				if exposedHeaders == nil {
+					exposedHeaders = []string{"Date"}
+				}
+				w.Header().Set("Access-Control-Allow-Methods", strings.Join(allowedMethods, ", "))
+				w.Header().Set("Access-Control-Allow-Headers", strings.Join(allowedHeaders, ", "))
+				w.Header().Set("Access-Control-Expose-Headers", strings.Join(exposedHeaders, ", "))
+				w.Header().Set("Access-Control-Allow-Credentials", allowCredentials)
+
+				// Stop here if its a preflight OPTIONS request
+				if req.Method == "OPTIONS" {
+					w.WriteHeader(http.StatusNoContent)
+					return
+				}
+			}
+		}
+		// Dispatch to the next handler
+		handler.ServeHTTP(w, req)
+	})
+}
+
+func allowedOriginRegexps(allowedOrigins []string) []*regexp.Regexp {
+	res, err := compileRegexps(allowedOrigins)
+	if err != nil {
+		glog.Fatalf("Invalid CORS allowed origin, --cors-allowed-origins flag was set to %v - %v", strings.Join(allowedOrigins, ","), err)
+	}
+	return res
+}
+
+// Takes a list of strings and compiles them into a list of regular expressions
+func compileRegexps(regexpStrings []string) ([]*regexp.Regexp, error) {
+	regexps := []*regexp.Regexp{}
+	for _, regexpStr := range regexpStrings {
+		r, err := regexp.Compile(regexpStr)
+		if err != nil {
+			return []*regexp.Regexp{}, err
+		}
+		regexps = append(regexps, r)
+	}
+	return regexps, nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/filters/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/filters/doc.go
new file mode 100644
index 0000000..a90cc3b
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/filters/doc.go
@@ -0,0 +1,19 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+// Package filters contains all the http handler chain filters which
+// are not api related.
+package filters // import "k8s.io/apiserver/pkg/server/filters"
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/filters/longrunning.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/filters/longrunning.go
new file mode 100644
index 0000000..1b58f16
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/filters/longrunning.go
@@ -0,0 +1,41 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package filters
+
+import (
+	"net/http"
+	"strings"
+
+	"k8s.io/apimachinery/pkg/util/sets"
+	apirequest "k8s.io/apiserver/pkg/endpoints/request"
+)
+
+// BasicLongRunningRequestCheck returns true if the given request has one of the specified verbs or one of the specified subresources, or is a profiler request.
+func BasicLongRunningRequestCheck(longRunningVerbs, longRunningSubresources sets.String) apirequest.LongRunningRequestCheck {
+	return func(r *http.Request, requestInfo *apirequest.RequestInfo) bool {
+		if longRunningVerbs.Has(requestInfo.Verb) {
+			return true
+		}
+		if requestInfo.IsResourceRequest && longRunningSubresources.Has(requestInfo.Subresource) {
+			return true
+		}
+		if !requestInfo.IsResourceRequest && strings.HasPrefix(requestInfo.Path, "/debug/pprof/") {
+			return true
+		}
+		return false
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/filters/maxinflight.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/filters/maxinflight.go
new file mode 100644
index 0000000..78700c3
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/filters/maxinflight.go
@@ -0,0 +1,190 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package filters
+
+import (
+	"fmt"
+	"net/http"
+	"sync"
+	"time"
+
+	"k8s.io/apimachinery/pkg/util/sets"
+	"k8s.io/apimachinery/pkg/util/wait"
+	"k8s.io/apiserver/pkg/authentication/user"
+	"k8s.io/apiserver/pkg/endpoints/metrics"
+	apirequest "k8s.io/apiserver/pkg/endpoints/request"
+
+	"github.com/golang/glog"
+)
+
+const (
+	// Constant for the retry-after interval on rate limiting.
+	// TODO: maybe make this dynamic? or user-adjustable?
+	retryAfter = "1"
+
+	// How often inflight usage metric should be updated. Because
+	// the metrics tracks maximal value over period making this
+	// longer will increase the metric value.
+	inflightUsageMetricUpdatePeriod = time.Second
+)
+
+var nonMutatingRequestVerbs = sets.NewString("get", "list", "watch")
+
+func handleError(w http.ResponseWriter, r *http.Request, err error) {
+	w.WriteHeader(http.StatusInternalServerError)
+	fmt.Fprintf(w, "Internal Server Error: %#v", r.RequestURI)
+	glog.Errorf(err.Error())
+}
+
+// requestWatermark is used to trak maximal usage of inflight requests.
+type requestWatermark struct {
+	lock                                 sync.Mutex
+	readOnlyWatermark, mutatingWatermark int
+}
+
+func (w *requestWatermark) recordMutating(mutatingVal int) {
+	w.lock.Lock()
+	defer w.lock.Unlock()
+
+	if w.mutatingWatermark < mutatingVal {
+		w.mutatingWatermark = mutatingVal
+	}
+}
+
+func (w *requestWatermark) recordReadOnly(readOnlyVal int) {
+	w.lock.Lock()
+	defer w.lock.Unlock()
+
+	if w.readOnlyWatermark < readOnlyVal {
+		w.readOnlyWatermark = readOnlyVal
+	}
+}
+
+var watermark = &requestWatermark{}
+
+func startRecordingUsage() {
+	go func() {
+		wait.Forever(func() {
+			watermark.lock.Lock()
+			readOnlyWatermark := watermark.readOnlyWatermark
+			mutatingWatermark := watermark.mutatingWatermark
+			watermark.readOnlyWatermark = 0
+			watermark.mutatingWatermark = 0
+			watermark.lock.Unlock()
+
+			metrics.UpdateInflightRequestMetrics(readOnlyWatermark, mutatingWatermark)
+		}, inflightUsageMetricUpdatePeriod)
+	}()
+}
+
+var startOnce sync.Once
+
+// WithMaxInFlightLimit limits the number of in-flight requests to buffer size of the passed in channel.
+func WithMaxInFlightLimit(
+	handler http.Handler,
+	nonMutatingLimit int,
+	mutatingLimit int,
+	longRunningRequestCheck apirequest.LongRunningRequestCheck,
+) http.Handler {
+	startOnce.Do(startRecordingUsage)
+	if nonMutatingLimit == 0 && mutatingLimit == 0 {
+		return handler
+	}
+	var nonMutatingChan chan bool
+	var mutatingChan chan bool
+	if nonMutatingLimit != 0 {
+		nonMutatingChan = make(chan bool, nonMutatingLimit)
+	}
+	if mutatingLimit != 0 {
+		mutatingChan = make(chan bool, mutatingLimit)
+	}
+
+	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+		ctx := r.Context()
+		requestInfo, ok := apirequest.RequestInfoFrom(ctx)
+		if !ok {
+			handleError(w, r, fmt.Errorf("no RequestInfo found in context, handler chain must be wrong"))
+			return
+		}
+
+		// Skip tracking long running events.
+		if longRunningRequestCheck != nil && longRunningRequestCheck(r, requestInfo) {
+			handler.ServeHTTP(w, r)
+			return
+		}
+
+		var c chan bool
+		isMutatingRequest := !nonMutatingRequestVerbs.Has(requestInfo.Verb)
+		if isMutatingRequest {
+			c = mutatingChan
+		} else {
+			c = nonMutatingChan
+		}
+
+		if c == nil {
+			handler.ServeHTTP(w, r)
+		} else {
+
+			select {
+			case c <- true:
+				var mutatingLen, readOnlyLen int
+				if isMutatingRequest {
+					mutatingLen = len(mutatingChan)
+				} else {
+					readOnlyLen = len(nonMutatingChan)
+				}
+
+				defer func() {
+					<-c
+					if isMutatingRequest {
+						watermark.recordMutating(mutatingLen)
+					} else {
+						watermark.recordReadOnly(readOnlyLen)
+					}
+
+				}()
+				handler.ServeHTTP(w, r)
+
+			default:
+				// We need to split this data between buckets used for throttling.
+				if isMutatingRequest {
+					metrics.DroppedRequests.WithLabelValues(metrics.MutatingKind).Inc()
+				} else {
+					metrics.DroppedRequests.WithLabelValues(metrics.ReadOnlyKind).Inc()
+				}
+				// at this point we're about to return a 429, BUT not all actors should be rate limited.  A system:master is so powerful
+				// that they should always get an answer.  It's a super-admin or a loopback connection.
+				if currUser, ok := apirequest.UserFrom(ctx); ok {
+					for _, group := range currUser.GetGroups() {
+						if group == user.SystemPrivilegedGroup {
+							handler.ServeHTTP(w, r)
+							return
+						}
+					}
+				}
+				metrics.Record(r, requestInfo, "", http.StatusTooManyRequests, 0, 0)
+				tooManyRequests(r, w)
+			}
+		}
+	})
+}
+
+func tooManyRequests(req *http.Request, w http.ResponseWriter) {
+	// Return a 429 status indicating "Too Many Requests"
+	w.Header().Set("Retry-After", retryAfter)
+	http.Error(w, "Too many requests, please try again later.", http.StatusTooManyRequests)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/filters/timeout.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/filters/timeout.go
new file mode 100644
index 0000000..eaf767f
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/filters/timeout.go
@@ -0,0 +1,278 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package filters
+
+import (
+	"bufio"
+	"context"
+	"encoding/json"
+	"fmt"
+	"net"
+	"net/http"
+	"sync"
+	"time"
+
+	apierrors "k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apiserver/pkg/endpoints/metrics"
+	apirequest "k8s.io/apiserver/pkg/endpoints/request"
+)
+
+var errConnKilled = fmt.Errorf("killing connection/stream because serving request timed out and response had been started")
+
+// WithTimeoutForNonLongRunningRequests times out non-long-running requests after the time given by timeout.
+func WithTimeoutForNonLongRunningRequests(handler http.Handler, longRunning apirequest.LongRunningRequestCheck, timeout time.Duration) http.Handler {
+	if longRunning == nil {
+		return handler
+	}
+	timeoutFunc := func(req *http.Request) (*http.Request, <-chan time.Time, func(), *apierrors.StatusError) {
+		// TODO unify this with apiserver.MaxInFlightLimit
+		ctx := req.Context()
+
+		requestInfo, ok := apirequest.RequestInfoFrom(ctx)
+		if !ok {
+			// if this happens, the handler chain isn't setup correctly because there is no request info
+			return req, time.After(timeout), func() {}, apierrors.NewInternalError(fmt.Errorf("no request info found for request during timeout"))
+		}
+
+		if longRunning(req, requestInfo) {
+			return req, nil, nil, nil
+		}
+
+		ctx, cancel := context.WithCancel(ctx)
+		req = req.WithContext(ctx)
+
+		postTimeoutFn := func() {
+			cancel()
+			metrics.Record(req, requestInfo, "", http.StatusGatewayTimeout, 0, 0)
+		}
+		return req, time.After(timeout), postTimeoutFn, apierrors.NewTimeoutError(fmt.Sprintf("request did not complete within %s", timeout), 0)
+	}
+	return WithTimeout(handler, timeoutFunc)
+}
+
+type timeoutFunc = func(*http.Request) (req *http.Request, timeout <-chan time.Time, postTimeoutFunc func(), err *apierrors.StatusError)
+
+// WithTimeout returns an http.Handler that runs h with a timeout
+// determined by timeoutFunc. The new http.Handler calls h.ServeHTTP to handle
+// each request, but if a call runs for longer than its time limit, the
+// handler responds with a 504 Gateway Timeout error and the message
+// provided. (If msg is empty, a suitable default message will be sent.) After
+// the handler times out, writes by h to its http.ResponseWriter will return
+// http.ErrHandlerTimeout. If timeoutFunc returns a nil timeout channel, no
+// timeout will be enforced. recordFn is a function that will be invoked whenever
+// a timeout happens.
+func WithTimeout(h http.Handler, timeoutFunc timeoutFunc) http.Handler {
+	return &timeoutHandler{h, timeoutFunc}
+}
+
+type timeoutHandler struct {
+	handler http.Handler
+	timeout timeoutFunc
+}
+
+func (t *timeoutHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+	r, after, postTimeoutFn, err := t.timeout(r)
+	if after == nil {
+		t.handler.ServeHTTP(w, r)
+		return
+	}
+
+	done := make(chan struct{})
+	tw := newTimeoutWriter(w)
+	go func() {
+		t.handler.ServeHTTP(tw, r)
+		close(done)
+	}()
+	select {
+	case <-done:
+		return
+	case <-after:
+		postTimeoutFn()
+		tw.timeout(err)
+	}
+}
+
+type timeoutWriter interface {
+	http.ResponseWriter
+	timeout(*apierrors.StatusError)
+}
+
+func newTimeoutWriter(w http.ResponseWriter) timeoutWriter {
+	base := &baseTimeoutWriter{w: w}
+
+	_, notifiable := w.(http.CloseNotifier)
+	_, hijackable := w.(http.Hijacker)
+
+	switch {
+	case notifiable && hijackable:
+		return &closeHijackTimeoutWriter{base}
+	case notifiable:
+		return &closeTimeoutWriter{base}
+	case hijackable:
+		return &hijackTimeoutWriter{base}
+	default:
+		return base
+	}
+}
+
+type baseTimeoutWriter struct {
+	w http.ResponseWriter
+
+	mu sync.Mutex
+	// if the timeout handler has timeout
+	timedOut bool
+	// if this timeout writer has wrote header
+	wroteHeader bool
+	// if this timeout writer has been hijacked
+	hijacked bool
+}
+
+func (tw *baseTimeoutWriter) Header() http.Header {
+	tw.mu.Lock()
+	defer tw.mu.Unlock()
+
+	if tw.timedOut {
+		return http.Header{}
+	}
+
+	return tw.w.Header()
+}
+
+func (tw *baseTimeoutWriter) Write(p []byte) (int, error) {
+	tw.mu.Lock()
+	defer tw.mu.Unlock()
+
+	if tw.timedOut {
+		return 0, http.ErrHandlerTimeout
+	}
+	if tw.hijacked {
+		return 0, http.ErrHijacked
+	}
+
+	tw.wroteHeader = true
+	return tw.w.Write(p)
+}
+
+func (tw *baseTimeoutWriter) Flush() {
+	tw.mu.Lock()
+	defer tw.mu.Unlock()
+
+	if tw.timedOut {
+		return
+	}
+
+	if flusher, ok := tw.w.(http.Flusher); ok {
+		flusher.Flush()
+	}
+}
+
+func (tw *baseTimeoutWriter) WriteHeader(code int) {
+	tw.mu.Lock()
+	defer tw.mu.Unlock()
+
+	if tw.timedOut || tw.wroteHeader || tw.hijacked {
+		return
+	}
+
+	tw.wroteHeader = true
+	tw.w.WriteHeader(code)
+}
+
+func (tw *baseTimeoutWriter) timeout(err *apierrors.StatusError) {
+	tw.mu.Lock()
+	defer tw.mu.Unlock()
+
+	tw.timedOut = true
+
+	// The timeout writer has not been used by the inner handler.
+	// We can safely timeout the HTTP request by sending by a timeout
+	// handler
+	if !tw.wroteHeader && !tw.hijacked {
+		tw.w.WriteHeader(http.StatusGatewayTimeout)
+		enc := json.NewEncoder(tw.w)
+		enc.Encode(&err.ErrStatus)
+	} else {
+		// The timeout writer has been used by the inner handler. There is
+		// no way to timeout the HTTP request at the point. We have to shutdown
+		// the connection for HTTP1 or reset stream for HTTP2.
+		//
+		// Note from: Brad Fitzpatrick
+		// if the ServeHTTP goroutine panics, that will do the best possible thing for both
+		// HTTP/1 and HTTP/2. In HTTP/1, assuming you're replying with at least HTTP/1.1 and
+		// you've already flushed the headers so it's using HTTP chunking, it'll kill the TCP
+		// connection immediately without a proper 0-byte EOF chunk, so the peer will recognize
+		// the response as bogus. In HTTP/2 the server will just RST_STREAM the stream, leaving
+		// the TCP connection open, but resetting the stream to the peer so it'll have an error,
+		// like the HTTP/1 case.
+		panic(errConnKilled)
+	}
+}
+
+func (tw *baseTimeoutWriter) closeNotify() <-chan bool {
+	tw.mu.Lock()
+	defer tw.mu.Unlock()
+
+	if tw.timedOut {
+		done := make(chan bool)
+		close(done)
+		return done
+	}
+
+	return tw.w.(http.CloseNotifier).CloseNotify()
+}
+
+func (tw *baseTimeoutWriter) hijack() (net.Conn, *bufio.ReadWriter, error) {
+	tw.mu.Lock()
+	defer tw.mu.Unlock()
+
+	if tw.timedOut {
+		return nil, nil, http.ErrHandlerTimeout
+	}
+	conn, rw, err := tw.w.(http.Hijacker).Hijack()
+	if err == nil {
+		tw.hijacked = true
+	}
+	return conn, rw, err
+}
+
+type closeTimeoutWriter struct {
+	*baseTimeoutWriter
+}
+
+func (tw *closeTimeoutWriter) CloseNotify() <-chan bool {
+	return tw.closeNotify()
+}
+
+type hijackTimeoutWriter struct {
+	*baseTimeoutWriter
+}
+
+func (tw *hijackTimeoutWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+	return tw.hijack()
+}
+
+type closeHijackTimeoutWriter struct {
+	*baseTimeoutWriter
+}
+
+func (tw *closeHijackTimeoutWriter) CloseNotify() <-chan bool {
+	return tw.closeNotify()
+}
+
+func (tw *closeHijackTimeoutWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+	return tw.hijack()
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/filters/waitgroup.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/filters/waitgroup.go
new file mode 100644
index 0000000..b40a422
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/filters/waitgroup.go
@@ -0,0 +1,49 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package filters
+
+import (
+	"errors"
+	"net/http"
+
+	utilwaitgroup "k8s.io/apimachinery/pkg/util/waitgroup"
+	"k8s.io/apiserver/pkg/endpoints/handlers/responsewriters"
+	apirequest "k8s.io/apiserver/pkg/endpoints/request"
+)
+
+// WithWaitGroup adds all non long-running requests to wait group, which is used for graceful shutdown.
+func WithWaitGroup(handler http.Handler, longRunning apirequest.LongRunningRequestCheck, wg *utilwaitgroup.SafeWaitGroup) http.Handler {
+	return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
+		ctx := req.Context()
+		requestInfo, ok := apirequest.RequestInfoFrom(ctx)
+		if !ok {
+			// if this happens, the handler chain isn't setup correctly because there is no request info
+			responsewriters.InternalError(w, req, errors.New("no RequestInfo found in the context"))
+			return
+		}
+
+		if !longRunning(req, requestInfo) {
+			if err := wg.Add(1); err != nil {
+				http.Error(w, "apiserver is shutting down.", http.StatusInternalServerError)
+				return
+			}
+			defer wg.Done()
+		}
+
+		handler.ServeHTTP(w, req)
+	})
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/filters/wrap.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/filters/wrap.go
new file mode 100644
index 0000000..38742ff
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/filters/wrap.go
@@ -0,0 +1,43 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package filters
+
+import (
+	"net/http"
+	"runtime/debug"
+
+	"github.com/golang/glog"
+
+	"k8s.io/apimachinery/pkg/util/runtime"
+	"k8s.io/apiserver/pkg/server/httplog"
+)
+
+// WithPanicRecovery wraps an http Handler to recover and log panics.
+func WithPanicRecovery(handler http.Handler) http.Handler {
+	return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
+		defer runtime.HandleCrash(func(err interface{}) {
+			http.Error(w, "This request caused apiserver to panic. Look in the logs for details.", http.StatusInternalServerError)
+			glog.Errorf("apiserver panic'd on %v %v: %v\n%s\n", req.Method, req.RequestURI, err, debug.Stack())
+		})
+
+		logger := httplog.NewLogged(req, &w)
+		defer logger.Log()
+
+		// Dispatch to the internal handler
+		handler.ServeHTTP(w, req)
+	})
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/genericapiserver.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/genericapiserver.go
new file mode 100644
index 0000000..9beba73
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/genericapiserver.go
@@ -0,0 +1,445 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package server
+
+import (
+	"fmt"
+	"net/http"
+	"strings"
+	"sync"
+	"time"
+
+	systemd "github.com/coreos/go-systemd/daemon"
+	"github.com/emicklei/go-restful-swagger12"
+	"github.com/golang/glog"
+
+	"k8s.io/apimachinery/pkg/api/meta"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apimachinery/pkg/runtime/serializer"
+	"k8s.io/apimachinery/pkg/util/sets"
+	utilwaitgroup "k8s.io/apimachinery/pkg/util/waitgroup"
+	"k8s.io/apiserver/pkg/admission"
+	"k8s.io/apiserver/pkg/audit"
+	genericapi "k8s.io/apiserver/pkg/endpoints"
+	"k8s.io/apiserver/pkg/endpoints/discovery"
+	"k8s.io/apiserver/pkg/registry/rest"
+	"k8s.io/apiserver/pkg/server/healthz"
+	"k8s.io/apiserver/pkg/server/routes"
+	restclient "k8s.io/client-go/rest"
+	openapicommon "k8s.io/kube-openapi/pkg/common"
+)
+
+// Info about an API group.
+type APIGroupInfo struct {
+	PrioritizedVersions []schema.GroupVersion
+	// Info about the resources in this group. It's a map from version to resource to the storage.
+	VersionedResourcesStorageMap map[string]map[string]rest.Storage
+	// OptionsExternalVersion controls the APIVersion used for common objects in the
+	// schema like api.Status, api.DeleteOptions, and metav1.ListOptions. Other implementors may
+	// define a version "v1beta1" but want to use the Kubernetes "v1" internal objects.
+	// If nil, defaults to groupMeta.GroupVersion.
+	// TODO: Remove this when https://github.com/kubernetes/kubernetes/issues/19018 is fixed.
+	OptionsExternalVersion *schema.GroupVersion
+	// MetaGroupVersion defaults to "meta.k8s.io/v1" and is the scheme group version used to decode
+	// common API implementations like ListOptions. Future changes will allow this to vary by group
+	// version (for when the inevitable meta/v2 group emerges).
+	MetaGroupVersion *schema.GroupVersion
+
+	// Scheme includes all of the types used by this group and how to convert between them (or
+	// to convert objects from outside of this group that are accepted in this API).
+	// TODO: replace with interfaces
+	Scheme *runtime.Scheme
+	// NegotiatedSerializer controls how this group encodes and decodes data
+	NegotiatedSerializer runtime.NegotiatedSerializer
+	// ParameterCodec performs conversions for query parameters passed to API calls
+	ParameterCodec runtime.ParameterCodec
+}
+
+// GenericAPIServer contains state for a Kubernetes cluster api server.
+type GenericAPIServer struct {
+	// discoveryAddresses is used to build cluster IPs for discovery.
+	discoveryAddresses discovery.Addresses
+
+	// LoopbackClientConfig is a config for a privileged loopback connection to the API server
+	LoopbackClientConfig *restclient.Config
+
+	// minRequestTimeout is how short the request timeout can be.  This is used to build the RESTHandler
+	minRequestTimeout time.Duration
+
+	// ShutdownTimeout is the timeout used for server shutdown. This specifies the timeout before server
+	// gracefully shutdown returns.
+	ShutdownTimeout time.Duration
+
+	// legacyAPIGroupPrefixes is used to set up URL parsing for authorization and for validating requests
+	// to InstallLegacyAPIGroup
+	legacyAPIGroupPrefixes sets.String
+
+	// admissionControl is used to build the RESTStorage that backs an API Group.
+	admissionControl admission.Interface
+
+	// SecureServingInfo holds configuration of the TLS server.
+	SecureServingInfo *SecureServingInfo
+
+	// ExternalAddress is the address (hostname or IP and port) that should be used in
+	// external (public internet) URLs for this GenericAPIServer.
+	ExternalAddress string
+
+	// Serializer controls how common API objects not in a group/version prefix are serialized for this server.
+	// Individual APIGroups may define their own serializers.
+	Serializer runtime.NegotiatedSerializer
+
+	// "Outputs"
+	// Handler holds the handlers being used by this API server
+	Handler *APIServerHandler
+
+	// listedPathProvider is a lister which provides the set of paths to show at /
+	listedPathProvider routes.ListedPathProvider
+
+	// DiscoveryGroupManager serves /apis
+	DiscoveryGroupManager discovery.GroupManager
+
+	// Enable swagger and/or OpenAPI if these configs are non-nil.
+	swaggerConfig *swagger.Config
+	openAPIConfig *openapicommon.Config
+
+	// PostStartHooks are each called after the server has started listening, in a separate go func for each
+	// with no guarantee of ordering between them.  The map key is a name used for error reporting.
+	// It may kill the process with a panic if it wishes to by returning an error.
+	postStartHookLock      sync.Mutex
+	postStartHooks         map[string]postStartHookEntry
+	postStartHooksCalled   bool
+	disabledPostStartHooks sets.String
+
+	preShutdownHookLock    sync.Mutex
+	preShutdownHooks       map[string]preShutdownHookEntry
+	preShutdownHooksCalled bool
+
+	// healthz checks
+	healthzLock    sync.Mutex
+	healthzChecks  []healthz.HealthzChecker
+	healthzCreated bool
+
+	// auditing. The backend is started after the server starts listening.
+	AuditBackend audit.Backend
+
+	// enableAPIResponseCompression indicates whether API Responses should support compression
+	// if the client requests it via Accept-Encoding
+	enableAPIResponseCompression bool
+
+	// delegationTarget is the next delegate in the chain. This is never nil.
+	delegationTarget DelegationTarget
+
+	// HandlerChainWaitGroup allows you to wait for all chain handlers finish after the server shutdown.
+	HandlerChainWaitGroup *utilwaitgroup.SafeWaitGroup
+}
+
+// DelegationTarget is an interface which allows for composition of API servers with top level handling that works
+// as expected.
+type DelegationTarget interface {
+	// UnprotectedHandler returns a handler that is NOT protected by a normal chain
+	UnprotectedHandler() http.Handler
+
+	// PostStartHooks returns the post-start hooks that need to be combined
+	PostStartHooks() map[string]postStartHookEntry
+
+	// PreShutdownHooks returns the pre-stop hooks that need to be combined
+	PreShutdownHooks() map[string]preShutdownHookEntry
+
+	// HealthzChecks returns the healthz checks that need to be combined
+	HealthzChecks() []healthz.HealthzChecker
+
+	// ListedPaths returns the paths for supporting an index
+	ListedPaths() []string
+
+	// NextDelegate returns the next delegationTarget in the chain of delegations
+	NextDelegate() DelegationTarget
+}
+
+func (s *GenericAPIServer) UnprotectedHandler() http.Handler {
+	// when we delegate, we need the server we're delegating to choose whether or not to use gorestful
+	return s.Handler.Director
+}
+func (s *GenericAPIServer) PostStartHooks() map[string]postStartHookEntry {
+	return s.postStartHooks
+}
+func (s *GenericAPIServer) PreShutdownHooks() map[string]preShutdownHookEntry {
+	return s.preShutdownHooks
+}
+func (s *GenericAPIServer) HealthzChecks() []healthz.HealthzChecker {
+	return s.healthzChecks
+}
+func (s *GenericAPIServer) ListedPaths() []string {
+	return s.listedPathProvider.ListedPaths()
+}
+
+func (s *GenericAPIServer) NextDelegate() DelegationTarget {
+	return s.delegationTarget
+}
+
+type emptyDelegate struct {
+}
+
+func NewEmptyDelegate() DelegationTarget {
+	return emptyDelegate{}
+}
+
+func (s emptyDelegate) UnprotectedHandler() http.Handler {
+	return nil
+}
+func (s emptyDelegate) PostStartHooks() map[string]postStartHookEntry {
+	return map[string]postStartHookEntry{}
+}
+func (s emptyDelegate) PreShutdownHooks() map[string]preShutdownHookEntry {
+	return map[string]preShutdownHookEntry{}
+}
+func (s emptyDelegate) HealthzChecks() []healthz.HealthzChecker {
+	return []healthz.HealthzChecker{}
+}
+func (s emptyDelegate) ListedPaths() []string {
+	return []string{}
+}
+func (s emptyDelegate) NextDelegate() DelegationTarget {
+	return nil
+}
+
+// preparedGenericAPIServer is a private wrapper that enforces a call of PrepareRun() before Run can be invoked.
+type preparedGenericAPIServer struct {
+	*GenericAPIServer
+}
+
+// PrepareRun does post API installation setup steps.
+func (s *GenericAPIServer) PrepareRun() preparedGenericAPIServer {
+	if s.swaggerConfig != nil {
+		routes.Swagger{Config: s.swaggerConfig}.Install(s.Handler.GoRestfulContainer)
+	}
+	if s.openAPIConfig != nil {
+		routes.OpenAPI{
+			Config: s.openAPIConfig,
+		}.Install(s.Handler.GoRestfulContainer, s.Handler.NonGoRestfulMux)
+	}
+
+	s.installHealthz()
+
+	// Register audit backend preShutdownHook.
+	if s.AuditBackend != nil {
+		s.AddPreShutdownHook("audit-backend", func() error {
+			s.AuditBackend.Shutdown()
+			return nil
+		})
+	}
+
+	return preparedGenericAPIServer{s}
+}
+
+// Run spawns the secure http server. It only returns if stopCh is closed
+// or the secure port cannot be listened on initially.
+func (s preparedGenericAPIServer) Run(stopCh <-chan struct{}) error {
+	err := s.NonBlockingRun(stopCh)
+	if err != nil {
+		return err
+	}
+
+	<-stopCh
+
+	err = s.RunPreShutdownHooks()
+	if err != nil {
+		return err
+	}
+
+	// Wait for all requests to finish, which are bounded by the RequestTimeout variable.
+	s.HandlerChainWaitGroup.Wait()
+
+	return nil
+}
+
+// NonBlockingRun spawns the secure http server. An error is
+// returned if the secure port cannot be listened on.
+func (s preparedGenericAPIServer) NonBlockingRun(stopCh <-chan struct{}) error {
+	// Use an stop channel to allow graceful shutdown without dropping audit events
+	// after http server shutdown.
+	auditStopCh := make(chan struct{})
+
+	// Start the audit backend before any request comes in. This means we must call Backend.Run
+	// before http server start serving. Otherwise the Backend.ProcessEvents call might block.
+	if s.AuditBackend != nil {
+		if err := s.AuditBackend.Run(auditStopCh); err != nil {
+			return fmt.Errorf("failed to run the audit backend: %v", err)
+		}
+	}
+
+	// Use an internal stop channel to allow cleanup of the listeners on error.
+	internalStopCh := make(chan struct{})
+
+	if s.SecureServingInfo != nil && s.Handler != nil {
+		if err := s.SecureServingInfo.Serve(s.Handler, s.ShutdownTimeout, internalStopCh); err != nil {
+			close(internalStopCh)
+			return err
+		}
+	}
+
+	// Now that listener have bound successfully, it is the
+	// responsibility of the caller to close the provided channel to
+	// ensure cleanup.
+	go func() {
+		<-stopCh
+		close(internalStopCh)
+		s.HandlerChainWaitGroup.Wait()
+		close(auditStopCh)
+	}()
+
+	s.RunPostStartHooks(stopCh)
+
+	if _, err := systemd.SdNotify(true, "READY=1\n"); err != nil {
+		glog.Errorf("Unable to send systemd daemon successful start message: %v\n", err)
+	}
+
+	return nil
+}
+
+// installAPIResources is a private method for installing the REST storage backing each api groupversionresource
+func (s *GenericAPIServer) installAPIResources(apiPrefix string, apiGroupInfo *APIGroupInfo) error {
+	for _, groupVersion := range apiGroupInfo.PrioritizedVersions {
+		if len(apiGroupInfo.VersionedResourcesStorageMap[groupVersion.Version]) == 0 {
+			glog.Warningf("Skipping API %v because it has no resources.", groupVersion)
+			continue
+		}
+
+		apiGroupVersion := s.getAPIGroupVersion(apiGroupInfo, groupVersion, apiPrefix)
+		if apiGroupInfo.OptionsExternalVersion != nil {
+			apiGroupVersion.OptionsExternalVersion = apiGroupInfo.OptionsExternalVersion
+		}
+
+		if err := apiGroupVersion.InstallREST(s.Handler.GoRestfulContainer); err != nil {
+			return fmt.Errorf("unable to setup API %v: %v", apiGroupInfo, err)
+		}
+	}
+
+	return nil
+}
+
+func (s *GenericAPIServer) InstallLegacyAPIGroup(apiPrefix string, apiGroupInfo *APIGroupInfo) error {
+	if !s.legacyAPIGroupPrefixes.Has(apiPrefix) {
+		return fmt.Errorf("%q is not in the allowed legacy API prefixes: %v", apiPrefix, s.legacyAPIGroupPrefixes.List())
+	}
+	if err := s.installAPIResources(apiPrefix, apiGroupInfo); err != nil {
+		return err
+	}
+
+	// setup discovery
+	apiVersions := []string{}
+	for _, groupVersion := range apiGroupInfo.PrioritizedVersions {
+		apiVersions = append(apiVersions, groupVersion.Version)
+	}
+	// Install the version handler.
+	// Add a handler at /<apiPrefix> to enumerate the supported api versions.
+	s.Handler.GoRestfulContainer.Add(discovery.NewLegacyRootAPIHandler(s.discoveryAddresses, s.Serializer, apiPrefix, apiVersions).WebService())
+
+	return nil
+}
+
+// Exposes the given api group in the API.
+func (s *GenericAPIServer) InstallAPIGroup(apiGroupInfo *APIGroupInfo) error {
+	// Do not register empty group or empty version.  Doing so claims /apis/ for the wrong entity to be returned.
+	// Catching these here places the error  much closer to its origin
+	if len(apiGroupInfo.PrioritizedVersions[0].Group) == 0 {
+		return fmt.Errorf("cannot register handler with an empty group for %#v", *apiGroupInfo)
+	}
+	if len(apiGroupInfo.PrioritizedVersions[0].Version) == 0 {
+		return fmt.Errorf("cannot register handler with an empty version for %#v", *apiGroupInfo)
+	}
+
+	if err := s.installAPIResources(APIGroupPrefix, apiGroupInfo); err != nil {
+		return err
+	}
+
+	// setup discovery
+	// Install the version handler.
+	// Add a handler at /apis/<groupName> to enumerate all versions supported by this group.
+	apiVersionsForDiscovery := []metav1.GroupVersionForDiscovery{}
+	for _, groupVersion := range apiGroupInfo.PrioritizedVersions {
+		// Check the config to make sure that we elide versions that don't have any resources
+		if len(apiGroupInfo.VersionedResourcesStorageMap[groupVersion.Version]) == 0 {
+			continue
+		}
+		apiVersionsForDiscovery = append(apiVersionsForDiscovery, metav1.GroupVersionForDiscovery{
+			GroupVersion: groupVersion.String(),
+			Version:      groupVersion.Version,
+		})
+	}
+	preferredVersionForDiscovery := metav1.GroupVersionForDiscovery{
+		GroupVersion: apiGroupInfo.PrioritizedVersions[0].String(),
+		Version:      apiGroupInfo.PrioritizedVersions[0].Version,
+	}
+	apiGroup := metav1.APIGroup{
+		Name:             apiGroupInfo.PrioritizedVersions[0].Group,
+		Versions:         apiVersionsForDiscovery,
+		PreferredVersion: preferredVersionForDiscovery,
+	}
+
+	s.DiscoveryGroupManager.AddGroup(apiGroup)
+	s.Handler.GoRestfulContainer.Add(discovery.NewAPIGroupHandler(s.Serializer, apiGroup).WebService())
+
+	return nil
+}
+
+func (s *GenericAPIServer) getAPIGroupVersion(apiGroupInfo *APIGroupInfo, groupVersion schema.GroupVersion, apiPrefix string) *genericapi.APIGroupVersion {
+	storage := make(map[string]rest.Storage)
+	for k, v := range apiGroupInfo.VersionedResourcesStorageMap[groupVersion.Version] {
+		storage[strings.ToLower(k)] = v
+	}
+	version := s.newAPIGroupVersion(apiGroupInfo, groupVersion)
+	version.Root = apiPrefix
+	version.Storage = storage
+	return version
+}
+
+func (s *GenericAPIServer) newAPIGroupVersion(apiGroupInfo *APIGroupInfo, groupVersion schema.GroupVersion) *genericapi.APIGroupVersion {
+	return &genericapi.APIGroupVersion{
+		GroupVersion:     groupVersion,
+		MetaGroupVersion: apiGroupInfo.MetaGroupVersion,
+
+		ParameterCodec:  apiGroupInfo.ParameterCodec,
+		Serializer:      apiGroupInfo.NegotiatedSerializer,
+		Creater:         apiGroupInfo.Scheme,
+		Convertor:       apiGroupInfo.Scheme,
+		UnsafeConvertor: runtime.UnsafeObjectConvertor(apiGroupInfo.Scheme),
+		Defaulter:       apiGroupInfo.Scheme,
+		Typer:           apiGroupInfo.Scheme,
+		Linker:          runtime.SelfLinker(meta.NewAccessor()),
+
+		Admit:                        s.admissionControl,
+		MinRequestTimeout:            s.minRequestTimeout,
+		EnableAPIResponseCompression: s.enableAPIResponseCompression,
+		OpenAPIConfig:                s.openAPIConfig,
+	}
+}
+
+// NewDefaultAPIGroupInfo returns an APIGroupInfo stubbed with "normal" values
+// exposed for easier composition from other packages
+func NewDefaultAPIGroupInfo(group string, scheme *runtime.Scheme, parameterCodec runtime.ParameterCodec, codecs serializer.CodecFactory) APIGroupInfo {
+	return APIGroupInfo{
+		PrioritizedVersions:          scheme.PrioritizedVersionsForGroup(group),
+		VersionedResourcesStorageMap: map[string]map[string]rest.Storage{},
+		// TODO unhardcode this.  It was hardcoded before, but we need to re-evaluate
+		OptionsExternalVersion: &schema.GroupVersion{Version: "v1"},
+		Scheme:                 scheme,
+		ParameterCodec:         parameterCodec,
+		NegotiatedSerializer:   codecs,
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/handler.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/handler.go
new file mode 100644
index 0000000..e4e7d9a
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/handler.go
@@ -0,0 +1,190 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package server
+
+import (
+	"bytes"
+	"fmt"
+	"net/http"
+	rt "runtime"
+	"sort"
+	"strings"
+
+	"github.com/emicklei/go-restful"
+	"github.com/golang/glog"
+
+	apierrors "k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apiserver/pkg/endpoints/handlers/responsewriters"
+	"k8s.io/apiserver/pkg/server/mux"
+)
+
+// APIServerHandlers holds the different http.Handlers used by the API server.
+// This includes the full handler chain, the director (which chooses between gorestful and nonGoRestful,
+// the gorestful handler (used for the API) which falls through to the nonGoRestful handler on unregistered paths,
+// and the nonGoRestful handler (which can contain a fallthrough of its own)
+// FullHandlerChain -> Director -> {GoRestfulContainer,NonGoRestfulMux} based on inspection of registered web services
+type APIServerHandler struct {
+	// FullHandlerChain is the one that is eventually served with.  It should include the full filter
+	// chain and then call the Director.
+	FullHandlerChain http.Handler
+	// The registered APIs.  InstallAPIs uses this.  Other servers probably shouldn't access this directly.
+	GoRestfulContainer *restful.Container
+	// NonGoRestfulMux is the final HTTP handler in the chain.
+	// It comes after all filters and the API handling
+	// This is where other servers can attach handler to various parts of the chain.
+	NonGoRestfulMux *mux.PathRecorderMux
+
+	// Director is here so that we can properly handle fall through and proxy cases.
+	// This looks a bit bonkers, but here's what's happening.  We need to have /apis handling registered in gorestful in order to have
+	// swagger generated for compatibility.  Doing that with `/apis` as a webservice, means that it forcibly 404s (no defaulting allowed)
+	// all requests which are not /apis or /apis/.  We need those calls to fall through behind goresful for proper delegation.  Trying to
+	// register for a pattern which includes everything behind it doesn't work because gorestful negotiates for verbs and content encoding
+	// and all those things go crazy when gorestful really just needs to pass through.  In addition, openapi enforces unique verb constraints
+	// which we don't fit into and it still muddies up swagger.  Trying to switch the webservices into a route doesn't work because the
+	//  containing webservice faces all the same problems listed above.
+	// This leads to the crazy thing done here.  Our mux does what we need, so we'll place it in front of gorestful.  It will introspect to
+	// decide if the route is likely to be handled by goresful and route there if needed.  Otherwise, it goes to PostGoRestful mux in
+	// order to handle "normal" paths and delegation. Hopefully no API consumers will ever have to deal with this level of detail.  I think
+	// we should consider completely removing gorestful.
+	// Other servers should only use this opaquely to delegate to an API server.
+	Director http.Handler
+}
+
+// HandlerChainBuilderFn is used to wrap the GoRestfulContainer handler using the provided handler chain.
+// It is normally used to apply filtering like authentication and authorization
+type HandlerChainBuilderFn func(apiHandler http.Handler) http.Handler
+
+func NewAPIServerHandler(name string, s runtime.NegotiatedSerializer, handlerChainBuilder HandlerChainBuilderFn, notFoundHandler http.Handler) *APIServerHandler {
+	nonGoRestfulMux := mux.NewPathRecorderMux(name)
+	if notFoundHandler != nil {
+		nonGoRestfulMux.NotFoundHandler(notFoundHandler)
+	}
+
+	gorestfulContainer := restful.NewContainer()
+	gorestfulContainer.ServeMux = http.NewServeMux()
+	gorestfulContainer.Router(restful.CurlyRouter{}) // e.g. for proxy/{kind}/{name}/{*}
+	gorestfulContainer.RecoverHandler(func(panicReason interface{}, httpWriter http.ResponseWriter) {
+		logStackOnRecover(s, panicReason, httpWriter)
+	})
+	gorestfulContainer.ServiceErrorHandler(func(serviceErr restful.ServiceError, request *restful.Request, response *restful.Response) {
+		serviceErrorHandler(s, serviceErr, request, response)
+	})
+
+	director := director{
+		name:               name,
+		goRestfulContainer: gorestfulContainer,
+		nonGoRestfulMux:    nonGoRestfulMux,
+	}
+
+	return &APIServerHandler{
+		FullHandlerChain:   handlerChainBuilder(director),
+		GoRestfulContainer: gorestfulContainer,
+		NonGoRestfulMux:    nonGoRestfulMux,
+		Director:           director,
+	}
+}
+
+// ListedPaths returns the paths that should be shown under /
+func (a *APIServerHandler) ListedPaths() []string {
+	var handledPaths []string
+	// Extract the paths handled using restful.WebService
+	for _, ws := range a.GoRestfulContainer.RegisteredWebServices() {
+		handledPaths = append(handledPaths, ws.RootPath())
+	}
+	handledPaths = append(handledPaths, a.NonGoRestfulMux.ListedPaths()...)
+	sort.Strings(handledPaths)
+
+	return handledPaths
+}
+
+type director struct {
+	name               string
+	goRestfulContainer *restful.Container
+	nonGoRestfulMux    *mux.PathRecorderMux
+}
+
+func (d director) ServeHTTP(w http.ResponseWriter, req *http.Request) {
+	path := req.URL.Path
+
+	// check to see if our webservices want to claim this path
+	for _, ws := range d.goRestfulContainer.RegisteredWebServices() {
+		switch {
+		case ws.RootPath() == "/apis":
+			// if we are exactly /apis or /apis/, then we need special handling in loop.
+			// normally these are passed to the nonGoRestfulMux, but if discovery is enabled, it will go directly.
+			// We can't rely on a prefix match since /apis matches everything (see the big comment on Director above)
+			if path == "/apis" || path == "/apis/" {
+				glog.V(5).Infof("%v: %v %q satisfied by gorestful with webservice %v", d.name, req.Method, path, ws.RootPath())
+				// don't use servemux here because gorestful servemuxes get messed up when removing webservices
+				// TODO fix gorestful, remove TPRs, or stop using gorestful
+				d.goRestfulContainer.Dispatch(w, req)
+				return
+			}
+
+		case strings.HasPrefix(path, ws.RootPath()):
+			// ensure an exact match or a path boundary match
+			if len(path) == len(ws.RootPath()) || path[len(ws.RootPath())] == '/' {
+				glog.V(5).Infof("%v: %v %q satisfied by gorestful with webservice %v", d.name, req.Method, path, ws.RootPath())
+				// don't use servemux here because gorestful servemuxes get messed up when removing webservices
+				// TODO fix gorestful, remove TPRs, or stop using gorestful
+				d.goRestfulContainer.Dispatch(w, req)
+				return
+			}
+		}
+	}
+
+	// if we didn't find a match, then we just skip gorestful altogether
+	glog.V(5).Infof("%v: %v %q satisfied by nonGoRestful", d.name, req.Method, path)
+	d.nonGoRestfulMux.ServeHTTP(w, req)
+}
+
+//TODO: Unify with RecoverPanics?
+func logStackOnRecover(s runtime.NegotiatedSerializer, panicReason interface{}, w http.ResponseWriter) {
+	var buffer bytes.Buffer
+	buffer.WriteString(fmt.Sprintf("recover from panic situation: - %v\r\n", panicReason))
+	for i := 2; ; i++ {
+		_, file, line, ok := rt.Caller(i)
+		if !ok {
+			break
+		}
+		buffer.WriteString(fmt.Sprintf("    %s:%d\r\n", file, line))
+	}
+	glog.Errorln(buffer.String())
+
+	headers := http.Header{}
+	if ct := w.Header().Get("Content-Type"); len(ct) > 0 {
+		headers.Set("Accept", ct)
+	}
+	responsewriters.ErrorNegotiated(apierrors.NewGenericServerResponse(http.StatusInternalServerError, "", schema.GroupResource{}, "", "", 0, false), s, schema.GroupVersion{}, w, &http.Request{Header: headers})
+}
+
+func serviceErrorHandler(s runtime.NegotiatedSerializer, serviceErr restful.ServiceError, request *restful.Request, resp *restful.Response) {
+	responsewriters.ErrorNegotiated(
+		apierrors.NewGenericServerResponse(serviceErr.Code, "", schema.GroupResource{}, "", serviceErr.Message, 0, false),
+		s,
+		schema.GroupVersion{},
+		resp,
+		request.Request,
+	)
+}
+
+// ServeHTTP makes it an http.Handler
+func (a *APIServerHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+	a.FullHandlerChain.ServeHTTP(w, r)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/healthz.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/healthz.go
new file mode 100644
index 0000000..43e102b
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/healthz.go
@@ -0,0 +1,45 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package server
+
+import (
+	"fmt"
+
+	"k8s.io/apiserver/pkg/server/healthz"
+)
+
+// AddHealthzCheck allows you to add a HealthzCheck.
+func (s *GenericAPIServer) AddHealthzChecks(checks ...healthz.HealthzChecker) error {
+	s.healthzLock.Lock()
+	defer s.healthzLock.Unlock()
+
+	if s.healthzCreated {
+		return fmt.Errorf("unable to add because the healthz endpoint has already been created")
+	}
+
+	s.healthzChecks = append(s.healthzChecks, checks...)
+	return nil
+}
+
+// installHealthz creates the healthz endpoint for this server
+func (s *GenericAPIServer) installHealthz() {
+	s.healthzLock.Lock()
+	defer s.healthzLock.Unlock()
+	s.healthzCreated = true
+
+	healthz.InstallHandler(s.Handler.NonGoRestfulMux, s.healthzChecks...)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/healthz/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/healthz/doc.go
new file mode 100644
index 0000000..06e67f6
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/healthz/doc.go
@@ -0,0 +1,21 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+// Package healthz implements basic http server health checking.
+// Usage:
+//   import "k8s.io/apiserver/pkg/server/healthz"
+//   healthz.DefaultHealthz()
+package healthz // import "k8s.io/apiserver/pkg/server/healthz"
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/healthz/healthz.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/healthz/healthz.go
new file mode 100644
index 0000000..224f1ed
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/healthz/healthz.go
@@ -0,0 +1,168 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package healthz
+
+import (
+	"bytes"
+	"fmt"
+	"net/http"
+	"strings"
+	"sync"
+
+	"github.com/golang/glog"
+)
+
+// HealthzChecker is a named healthz checker.
+type HealthzChecker interface {
+	Name() string
+	Check(req *http.Request) error
+}
+
+var defaultHealthz = sync.Once{}
+
+// DefaultHealthz installs the default healthz check to the http.DefaultServeMux.
+func DefaultHealthz(checks ...HealthzChecker) {
+	defaultHealthz.Do(func() {
+		InstallHandler(http.DefaultServeMux, checks...)
+	})
+}
+
+// PingHealthz returns true automatically when checked
+var PingHealthz HealthzChecker = ping{}
+
+// ping implements the simplest possible healthz checker.
+type ping struct{}
+
+func (ping) Name() string {
+	return "ping"
+}
+
+// PingHealthz is a health check that returns true.
+func (ping) Check(_ *http.Request) error {
+	return nil
+}
+
+// NamedCheck returns a healthz checker for the given name and function.
+func NamedCheck(name string, check func(r *http.Request) error) HealthzChecker {
+	return &healthzCheck{name, check}
+}
+
+// InstallHandler registers handlers for health checking on the path
+// "/healthz" to mux. *All handlers* for mux must be specified in
+// exactly one call to InstallHandler. Calling InstallHandler more
+// than once for the same mux will result in a panic.
+func InstallHandler(mux mux, checks ...HealthzChecker) {
+	InstallPathHandler(mux, "/healthz", checks...)
+}
+
+// InstallPathHandler registers handlers for health checking on
+// a specific path to mux. *All handlers* for the path must be
+// specified in exactly one call to InstallPathHandler. Calling
+// InstallPathHandler more than once for the same path and mux will
+// result in a panic.
+func InstallPathHandler(mux mux, path string, checks ...HealthzChecker) {
+	if len(checks) == 0 {
+		glog.V(5).Info("No default health checks specified. Installing the ping handler.")
+		checks = []HealthzChecker{PingHealthz}
+	}
+
+	glog.V(5).Info("Installing healthz checkers:", strings.Join(checkerNames(checks...), ", "))
+
+	mux.Handle(path, handleRootHealthz(checks...))
+	for _, check := range checks {
+		mux.Handle(fmt.Sprintf("%s/%v", path, check.Name()), adaptCheckToHandler(check.Check))
+	}
+}
+
+// mux is an interface describing the methods InstallHandler requires.
+type mux interface {
+	Handle(pattern string, handler http.Handler)
+}
+
+// healthzCheck implements HealthzChecker on an arbitrary name and check function.
+type healthzCheck struct {
+	name  string
+	check func(r *http.Request) error
+}
+
+var _ HealthzChecker = &healthzCheck{}
+
+func (c *healthzCheck) Name() string {
+	return c.name
+}
+
+func (c *healthzCheck) Check(r *http.Request) error {
+	return c.check(r)
+}
+
+// handleRootHealthz returns an http.HandlerFunc that serves the provided checks.
+func handleRootHealthz(checks ...HealthzChecker) http.HandlerFunc {
+	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+		failed := false
+		var verboseOut bytes.Buffer
+		for _, check := range checks {
+			if err := check.Check(r); err != nil {
+				// don't include the error since this endpoint is public.  If someone wants more detail
+				// they should have explicit permission to the detailed checks.
+				glog.V(6).Infof("healthz check %v failed: %v", check.Name(), err)
+				fmt.Fprintf(&verboseOut, "[-]%v failed: reason withheld\n", check.Name())
+				failed = true
+			} else {
+				fmt.Fprintf(&verboseOut, "[+]%v ok\n", check.Name())
+			}
+		}
+		// always be verbose on failure
+		if failed {
+			http.Error(w, fmt.Sprintf("%vhealthz check failed", verboseOut.String()), http.StatusInternalServerError)
+			return
+		}
+
+		if _, found := r.URL.Query()["verbose"]; !found {
+			fmt.Fprint(w, "ok")
+			return
+		}
+
+		verboseOut.WriteTo(w)
+		fmt.Fprint(w, "healthz check passed\n")
+	})
+}
+
+// adaptCheckToHandler returns an http.HandlerFunc that serves the provided checks.
+func adaptCheckToHandler(c func(r *http.Request) error) http.HandlerFunc {
+	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+		err := c(r)
+		if err != nil {
+			http.Error(w, fmt.Sprintf("internal server error: %v", err), http.StatusInternalServerError)
+		} else {
+			fmt.Fprint(w, "ok")
+		}
+	})
+}
+
+// checkerNames returns the names of the checks in the same order as passed in.
+func checkerNames(checks ...HealthzChecker) []string {
+	if len(checks) > 0 {
+		// accumulate the names of checks for printing them out.
+		checkerNames := make([]string, 0, len(checks))
+		for _, check := range checks {
+			// quote the Name so we can disambiguate
+			checkerNames = append(checkerNames, fmt.Sprintf("%q", check.Name()))
+		}
+		return checkerNames
+	}
+	return nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/hooks.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/hooks.go
new file mode 100644
index 0000000..ccf8ee1
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/hooks.go
@@ -0,0 +1,230 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package server
+
+import (
+	"errors"
+	"fmt"
+	"net/http"
+
+	"github.com/golang/glog"
+
+	utilerrors "k8s.io/apimachinery/pkg/util/errors"
+	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
+	"k8s.io/apiserver/pkg/server/healthz"
+	restclient "k8s.io/client-go/rest"
+)
+
+// PostStartHookFunc is a function that is called after the server has started.
+// It must properly handle cases like:
+//  1. asynchronous start in multiple API server processes
+//  2. conflicts between the different processes all trying to perform the same action
+//  3. partially complete work (API server crashes while running your hook)
+//  4. API server access **BEFORE** your hook has completed
+// Think of it like a mini-controller that is super privileged and gets to run in-process
+// If you use this feature, tag @deads2k on github who has promised to review code for anyone's PostStartHook
+// until it becomes easier to use.
+type PostStartHookFunc func(context PostStartHookContext) error
+
+// PreShutdownHookFunc is a function that can be added to the shutdown logic.
+type PreShutdownHookFunc func() error
+
+// PostStartHookContext provides information about this API server to a PostStartHookFunc
+type PostStartHookContext struct {
+	// LoopbackClientConfig is a config for a privileged loopback connection to the API server
+	LoopbackClientConfig *restclient.Config
+	// StopCh is the channel that will be closed when the server stops
+	StopCh <-chan struct{}
+}
+
+// PostStartHookProvider is an interface in addition to provide a post start hook for the api server
+type PostStartHookProvider interface {
+	PostStartHook() (string, PostStartHookFunc, error)
+}
+
+type postStartHookEntry struct {
+	hook PostStartHookFunc
+
+	// done will be closed when the postHook is finished
+	done chan struct{}
+}
+
+type preShutdownHookEntry struct {
+	hook PreShutdownHookFunc
+}
+
+// AddPostStartHook allows you to add a PostStartHook.
+func (s *GenericAPIServer) AddPostStartHook(name string, hook PostStartHookFunc) error {
+	if len(name) == 0 {
+		return fmt.Errorf("missing name")
+	}
+	if hook == nil {
+		return nil
+	}
+	if s.disabledPostStartHooks.Has(name) {
+		return nil
+	}
+
+	s.postStartHookLock.Lock()
+	defer s.postStartHookLock.Unlock()
+
+	if s.postStartHooksCalled {
+		return fmt.Errorf("unable to add %q because PostStartHooks have already been called", name)
+	}
+	if _, exists := s.postStartHooks[name]; exists {
+		return fmt.Errorf("unable to add %q because it is already registered", name)
+	}
+
+	// done is closed when the poststarthook is finished.  This is used by the health check to be able to indicate
+	// that the poststarthook is finished
+	done := make(chan struct{})
+	s.AddHealthzChecks(postStartHookHealthz{name: "poststarthook/" + name, done: done})
+	s.postStartHooks[name] = postStartHookEntry{hook: hook, done: done}
+
+	return nil
+}
+
+// AddPostStartHookOrDie allows you to add a PostStartHook, but dies on failure
+func (s *GenericAPIServer) AddPostStartHookOrDie(name string, hook PostStartHookFunc) {
+	if err := s.AddPostStartHook(name, hook); err != nil {
+		glog.Fatalf("Error registering PostStartHook %q: %v", name, err)
+	}
+}
+
+// AddPreShutdownHook allows you to add a PreShutdownHook.
+func (s *GenericAPIServer) AddPreShutdownHook(name string, hook PreShutdownHookFunc) error {
+	if len(name) == 0 {
+		return fmt.Errorf("missing name")
+	}
+	if hook == nil {
+		return nil
+	}
+
+	s.preShutdownHookLock.Lock()
+	defer s.preShutdownHookLock.Unlock()
+
+	if s.preShutdownHooksCalled {
+		return fmt.Errorf("unable to add %q because PreShutdownHooks have already been called", name)
+	}
+	if _, exists := s.preShutdownHooks[name]; exists {
+		return fmt.Errorf("unable to add %q because it is already registered", name)
+	}
+
+	s.preShutdownHooks[name] = preShutdownHookEntry{hook: hook}
+
+	return nil
+}
+
+// AddPreShutdownHookOrDie allows you to add a PostStartHook, but dies on failure
+func (s *GenericAPIServer) AddPreShutdownHookOrDie(name string, hook PreShutdownHookFunc) {
+	if err := s.AddPreShutdownHook(name, hook); err != nil {
+		glog.Fatalf("Error registering PreShutdownHook %q: %v", name, err)
+	}
+}
+
+// RunPostStartHooks runs the PostStartHooks for the server
+func (s *GenericAPIServer) RunPostStartHooks(stopCh <-chan struct{}) {
+	s.postStartHookLock.Lock()
+	defer s.postStartHookLock.Unlock()
+	s.postStartHooksCalled = true
+
+	context := PostStartHookContext{
+		LoopbackClientConfig: s.LoopbackClientConfig,
+		StopCh:               stopCh,
+	}
+
+	for hookName, hookEntry := range s.postStartHooks {
+		go runPostStartHook(hookName, hookEntry, context)
+	}
+}
+
+// RunPreShutdownHooks runs the PreShutdownHooks for the server
+func (s *GenericAPIServer) RunPreShutdownHooks() error {
+	var errorList []error
+
+	s.preShutdownHookLock.Lock()
+	defer s.preShutdownHookLock.Unlock()
+	s.preShutdownHooksCalled = true
+
+	for hookName, hookEntry := range s.preShutdownHooks {
+		if err := runPreShutdownHook(hookName, hookEntry); err != nil {
+			errorList = append(errorList, err)
+		}
+	}
+	return utilerrors.NewAggregate(errorList)
+}
+
+// isPostStartHookRegistered checks whether a given PostStartHook is registered
+func (s *GenericAPIServer) isPostStartHookRegistered(name string) bool {
+	s.postStartHookLock.Lock()
+	defer s.postStartHookLock.Unlock()
+	_, exists := s.postStartHooks[name]
+	return exists
+}
+
+func runPostStartHook(name string, entry postStartHookEntry, context PostStartHookContext) {
+	var err error
+	func() {
+		// don't let the hook *accidentally* panic and kill the server
+		defer utilruntime.HandleCrash()
+		err = entry.hook(context)
+	}()
+	// if the hook intentionally wants to kill server, let it.
+	if err != nil {
+		glog.Fatalf("PostStartHook %q failed: %v", name, err)
+	}
+	close(entry.done)
+}
+
+func runPreShutdownHook(name string, entry preShutdownHookEntry) error {
+	var err error
+	func() {
+		// don't let the hook *accidentally* panic and kill the server
+		defer utilruntime.HandleCrash()
+		err = entry.hook()
+	}()
+	if err != nil {
+		return fmt.Errorf("PreShutdownHook %q failed: %v", name, err)
+	}
+	return nil
+}
+
+// postStartHookHealthz implements a healthz check for poststarthooks.  It will return a "hookNotFinished"
+// error until the poststarthook is finished.
+type postStartHookHealthz struct {
+	name string
+
+	// done will be closed when the postStartHook is finished
+	done chan struct{}
+}
+
+var _ healthz.HealthzChecker = postStartHookHealthz{}
+
+func (h postStartHookHealthz) Name() string {
+	return h.name
+}
+
+var hookNotFinished = errors.New("not finished")
+
+func (h postStartHookHealthz) Check(req *http.Request) error {
+	select {
+	case <-h.done:
+		return nil
+	default:
+		return hookNotFinished
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/httplog/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/httplog/doc.go
new file mode 100644
index 0000000..caa6572
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/httplog/doc.go
@@ -0,0 +1,19 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+// Package httplog contains a helper object and functions to maintain a log
+// along with an http response.
+package httplog // import "k8s.io/apiserver/pkg/server/httplog"
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/httplog/httplog.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/httplog/httplog.go
new file mode 100644
index 0000000..ee8e05f
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/httplog/httplog.go
@@ -0,0 +1,213 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package httplog
+
+import (
+	"bufio"
+	"fmt"
+	"net"
+	"net/http"
+	"runtime"
+	"time"
+
+	"github.com/golang/glog"
+)
+
+// StacktracePred returns true if a stacktrace should be logged for this status.
+type StacktracePred func(httpStatus int) (logStacktrace bool)
+
+type logger interface {
+	Addf(format string, data ...interface{})
+}
+
+// Add a layer on top of ResponseWriter, so we can track latency and error
+// message sources.
+//
+// TODO now that we're using go-restful, we shouldn't need to be wrapping
+// the http.ResponseWriter. We can recover panics from go-restful, and
+// the logging value is questionable.
+type respLogger struct {
+	hijacked       bool
+	statusRecorded bool
+	status         int
+	statusStack    string
+	addedInfo      string
+	startTime      time.Time
+
+	captureErrorOutput bool
+
+	req *http.Request
+	w   http.ResponseWriter
+
+	logStacktracePred StacktracePred
+}
+
+// Simple logger that logs immediately when Addf is called
+type passthroughLogger struct{}
+
+// Addf logs info immediately.
+func (passthroughLogger) Addf(format string, data ...interface{}) {
+	glog.V(2).Info(fmt.Sprintf(format, data...))
+}
+
+// DefaultStacktracePred is the default implementation of StacktracePred.
+func DefaultStacktracePred(status int) bool {
+	return (status < http.StatusOK || status >= http.StatusInternalServerError) && status != http.StatusSwitchingProtocols
+}
+
+// NewLogged turns a normal response writer into a logged response writer.
+//
+// Usage:
+//
+// defer NewLogged(req, &w).StacktraceWhen(StatusIsNot(200, 202)).Log()
+//
+// (Only the call to Log() is deferred, so you can set everything up in one line!)
+//
+// Note that this *changes* your writer, to route response writing actions
+// through the logger.
+//
+// Use LogOf(w).Addf(...) to log something along with the response result.
+func NewLogged(req *http.Request, w *http.ResponseWriter) *respLogger {
+	if _, ok := (*w).(*respLogger); ok {
+		// Don't double-wrap!
+		panic("multiple NewLogged calls!")
+	}
+	rl := &respLogger{
+		startTime:         time.Now(),
+		req:               req,
+		w:                 *w,
+		logStacktracePred: DefaultStacktracePred,
+	}
+	*w = rl // hijack caller's writer!
+	return rl
+}
+
+// LogOf returns the logger hiding in w. If there is not an existing logger
+// then a passthroughLogger will be created which will log to stdout immediately
+// when Addf is called.
+func LogOf(req *http.Request, w http.ResponseWriter) logger {
+	if _, exists := w.(*respLogger); !exists {
+		pl := &passthroughLogger{}
+		return pl
+	}
+	if rl, ok := w.(*respLogger); ok {
+		return rl
+	}
+	panic("Unable to find or create the logger!")
+}
+
+// Unlogged returns the original ResponseWriter, or w if it is not our inserted logger.
+func Unlogged(w http.ResponseWriter) http.ResponseWriter {
+	if rl, ok := w.(*respLogger); ok {
+		return rl.w
+	}
+	return w
+}
+
+// StacktraceWhen sets the stacktrace logging predicate, which decides when to log a stacktrace.
+// There's a default, so you don't need to call this unless you don't like the default.
+func (rl *respLogger) StacktraceWhen(pred StacktracePred) *respLogger {
+	rl.logStacktracePred = pred
+	return rl
+}
+
+// StatusIsNot returns a StacktracePred which will cause stacktraces to be logged
+// for any status *not* in the given list.
+func StatusIsNot(statuses ...int) StacktracePred {
+	return func(status int) bool {
+		for _, s := range statuses {
+			if status == s {
+				return false
+			}
+		}
+		return true
+	}
+}
+
+// Addf adds additional data to be logged with this request.
+func (rl *respLogger) Addf(format string, data ...interface{}) {
+	rl.addedInfo += "\n" + fmt.Sprintf(format, data...)
+}
+
+// Log is intended to be called once at the end of your request handler, via defer
+func (rl *respLogger) Log() {
+	latency := time.Since(rl.startTime)
+	if glog.V(3) {
+		if !rl.hijacked {
+			glog.InfoDepth(1, fmt.Sprintf("%s %s: (%v) %v%v%v [%s %s]", rl.req.Method, rl.req.RequestURI, latency, rl.status, rl.statusStack, rl.addedInfo, rl.req.Header["User-Agent"], rl.req.RemoteAddr))
+		} else {
+			glog.InfoDepth(1, fmt.Sprintf("%s %s: (%v) hijacked [%s %s]", rl.req.Method, rl.req.RequestURI, latency, rl.req.Header["User-Agent"], rl.req.RemoteAddr))
+		}
+	}
+}
+
+// Header implements http.ResponseWriter.
+func (rl *respLogger) Header() http.Header {
+	return rl.w.Header()
+}
+
+// Write implements http.ResponseWriter.
+func (rl *respLogger) Write(b []byte) (int, error) {
+	if !rl.statusRecorded {
+		rl.recordStatus(http.StatusOK) // Default if WriteHeader hasn't been called
+	}
+	if rl.captureErrorOutput {
+		rl.Addf("logging error output: %q\n", string(b))
+	}
+	return rl.w.Write(b)
+}
+
+// Flush implements http.Flusher even if the underlying http.Writer doesn't implement it.
+// Flush is used for streaming purposes and allows to flush buffered data to the client.
+func (rl *respLogger) Flush() {
+	if flusher, ok := rl.w.(http.Flusher); ok {
+		flusher.Flush()
+	} else if glog.V(2) {
+		glog.InfoDepth(1, fmt.Sprintf("Unable to convert %+v into http.Flusher", rl.w))
+	}
+}
+
+// WriteHeader implements http.ResponseWriter.
+func (rl *respLogger) WriteHeader(status int) {
+	rl.recordStatus(status)
+	rl.w.WriteHeader(status)
+}
+
+// Hijack implements http.Hijacker.
+func (rl *respLogger) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+	rl.hijacked = true
+	return rl.w.(http.Hijacker).Hijack()
+}
+
+// CloseNotify implements http.CloseNotifier
+func (rl *respLogger) CloseNotify() <-chan bool {
+	return rl.w.(http.CloseNotifier).CloseNotify()
+}
+
+func (rl *respLogger) recordStatus(status int) {
+	rl.status = status
+	rl.statusRecorded = true
+	if rl.logStacktracePred(status) {
+		// Only log stacks for errors
+		stack := make([]byte, 50*1024)
+		stack = stack[:runtime.Stack(stack, false)]
+		rl.statusStack = "\n" + string(stack)
+		rl.captureErrorOutput = true
+	} else {
+		rl.statusStack = ""
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/mux/OWNERS b/metrics-server/vendor/k8s.io/apiserver/pkg/server/mux/OWNERS
new file mode 100755
index 0000000..9d268c4
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/mux/OWNERS
@@ -0,0 +1,2 @@
+reviewers:
+- sttts
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/mux/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/mux/doc.go
new file mode 100644
index 0000000..da9fb8e
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/mux/doc.go
@@ -0,0 +1,18 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+// Package mux contains abstractions for http multiplexing of APIs.
+package mux
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/mux/pathrecorder.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/mux/pathrecorder.go
new file mode 100644
index 0000000..2f0eb7a
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/mux/pathrecorder.go
@@ -0,0 +1,278 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package mux
+
+import (
+	"fmt"
+	"net/http"
+	"runtime/debug"
+	"sort"
+	"strings"
+	"sync"
+	"sync/atomic"
+
+	"github.com/golang/glog"
+
+	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
+	"k8s.io/apimachinery/pkg/util/sets"
+)
+
+// PathRecorderMux wraps a mux object and records the registered exposedPaths.
+type PathRecorderMux struct {
+	// name is used for logging so you can trace requests through
+	name string
+
+	lock            sync.Mutex
+	notFoundHandler http.Handler
+	pathToHandler   map[string]http.Handler
+	prefixToHandler map[string]http.Handler
+
+	// mux stores a pathHandler and is used to handle the actual serving.
+	// Turns out, we want to accept trailing slashes, BUT we don't care about handling
+	// everything under them.  This does exactly matches only unless its explicitly requested to
+	// do something different
+	mux atomic.Value
+
+	// exposedPaths is the list of paths that should be shown at /
+	exposedPaths []string
+
+	// pathStacks holds the stacks of all registered paths.  This allows us to show a more helpful message
+	// before the "http: multiple registrations for %s" panic.
+	pathStacks map[string]string
+}
+
+// pathHandler is an http.Handler that will satify requests first by exact match, then by prefix,
+// then by notFoundHandler
+type pathHandler struct {
+	// muxName is used for logging so you can trace requests through
+	muxName string
+
+	// pathToHandler is a map of exactly matching request to its handler
+	pathToHandler map[string]http.Handler
+
+	// this has to be sorted by most slashes then by length
+	prefixHandlers []prefixHandler
+
+	// notFoundHandler is the handler to use for satisfying requests with no other match
+	notFoundHandler http.Handler
+}
+
+// prefixHandler holds the prefix it should match and the handler to use
+type prefixHandler struct {
+	// prefix is the prefix to test for a request match
+	prefix string
+	// handler is used to satisfy matching requests
+	handler http.Handler
+}
+
+// NewPathRecorderMux creates a new PathRecorderMux
+func NewPathRecorderMux(name string) *PathRecorderMux {
+	ret := &PathRecorderMux{
+		name:            name,
+		pathToHandler:   map[string]http.Handler{},
+		prefixToHandler: map[string]http.Handler{},
+		mux:             atomic.Value{},
+		exposedPaths:    []string{},
+		pathStacks:      map[string]string{},
+	}
+
+	ret.mux.Store(&pathHandler{notFoundHandler: http.NotFoundHandler()})
+	return ret
+}
+
+// ListedPaths returns the registered handler exposedPaths.
+func (m *PathRecorderMux) ListedPaths() []string {
+	handledPaths := append([]string{}, m.exposedPaths...)
+	sort.Strings(handledPaths)
+
+	return handledPaths
+}
+
+func (m *PathRecorderMux) trackCallers(path string) {
+	if existingStack, ok := m.pathStacks[path]; ok {
+		utilruntime.HandleError(fmt.Errorf("registered %q from %v", path, existingStack))
+	}
+	m.pathStacks[path] = string(debug.Stack())
+}
+
+// refreshMuxLocked creates a new mux and must be called while locked.  Otherwise the view of handlers may
+// not be consistent
+func (m *PathRecorderMux) refreshMuxLocked() {
+	newMux := &pathHandler{
+		muxName:         m.name,
+		pathToHandler:   map[string]http.Handler{},
+		prefixHandlers:  []prefixHandler{},
+		notFoundHandler: http.NotFoundHandler(),
+	}
+	if m.notFoundHandler != nil {
+		newMux.notFoundHandler = m.notFoundHandler
+	}
+	for path, handler := range m.pathToHandler {
+		newMux.pathToHandler[path] = handler
+	}
+
+	keys := sets.StringKeySet(m.prefixToHandler).List()
+	sort.Sort(sort.Reverse(byPrefixPriority(keys)))
+	for _, prefix := range keys {
+		newMux.prefixHandlers = append(newMux.prefixHandlers, prefixHandler{
+			prefix:  prefix,
+			handler: m.prefixToHandler[prefix],
+		})
+	}
+
+	m.mux.Store(newMux)
+}
+
+// NotFoundHandler sets the handler to use if there's no match for a give path
+func (m *PathRecorderMux) NotFoundHandler(notFoundHandler http.Handler) {
+	m.lock.Lock()
+	defer m.lock.Unlock()
+
+	m.notFoundHandler = notFoundHandler
+
+	m.refreshMuxLocked()
+}
+
+// Unregister removes a path from the mux.
+func (m *PathRecorderMux) Unregister(path string) {
+	m.lock.Lock()
+	defer m.lock.Unlock()
+
+	delete(m.pathToHandler, path)
+	delete(m.prefixToHandler, path)
+	delete(m.pathStacks, path)
+	for i := range m.exposedPaths {
+		if m.exposedPaths[i] == path {
+			m.exposedPaths = append(m.exposedPaths[:i], m.exposedPaths[i+1:]...)
+			break
+		}
+	}
+
+	m.refreshMuxLocked()
+}
+
+// Handle registers the handler for the given pattern.
+// If a handler already exists for pattern, Handle panics.
+func (m *PathRecorderMux) Handle(path string, handler http.Handler) {
+	m.lock.Lock()
+	defer m.lock.Unlock()
+	m.trackCallers(path)
+
+	m.exposedPaths = append(m.exposedPaths, path)
+	m.pathToHandler[path] = handler
+	m.refreshMuxLocked()
+}
+
+// HandleFunc registers the handler function for the given pattern.
+// If a handler already exists for pattern, Handle panics.
+func (m *PathRecorderMux) HandleFunc(path string, handler func(http.ResponseWriter, *http.Request)) {
+	m.Handle(path, http.HandlerFunc(handler))
+}
+
+// UnlistedHandle registers the handler for the given pattern, but doesn't list it.
+// If a handler already exists for pattern, Handle panics.
+func (m *PathRecorderMux) UnlistedHandle(path string, handler http.Handler) {
+	m.lock.Lock()
+	defer m.lock.Unlock()
+	m.trackCallers(path)
+
+	m.pathToHandler[path] = handler
+	m.refreshMuxLocked()
+}
+
+// UnlistedHandleFunc registers the handler function for the given pattern, but doesn't list it.
+// If a handler already exists for pattern, Handle panics.
+func (m *PathRecorderMux) UnlistedHandleFunc(path string, handler func(http.ResponseWriter, *http.Request)) {
+	m.UnlistedHandle(path, http.HandlerFunc(handler))
+}
+
+// HandlePrefix is like Handle, but matches for anything under the path.  Like a standard golang trailing slash.
+func (m *PathRecorderMux) HandlePrefix(path string, handler http.Handler) {
+	if !strings.HasSuffix(path, "/") {
+		panic(fmt.Sprintf("%q must end in a trailing slash", path))
+	}
+
+	m.lock.Lock()
+	defer m.lock.Unlock()
+	m.trackCallers(path)
+
+	m.exposedPaths = append(m.exposedPaths, path)
+	m.prefixToHandler[path] = handler
+	m.refreshMuxLocked()
+}
+
+// UnlistedHandlePrefix is like UnlistedHandle, but matches for anything under the path.  Like a standard golang trailing slash.
+func (m *PathRecorderMux) UnlistedHandlePrefix(path string, handler http.Handler) {
+	if !strings.HasSuffix(path, "/") {
+		panic(fmt.Sprintf("%q must end in a trailing slash", path))
+	}
+
+	m.lock.Lock()
+	defer m.lock.Unlock()
+	m.trackCallers(path)
+
+	m.prefixToHandler[path] = handler
+	m.refreshMuxLocked()
+}
+
+// ServeHTTP makes it an http.Handler
+func (m *PathRecorderMux) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+	m.mux.Load().(*pathHandler).ServeHTTP(w, r)
+}
+
+// ServeHTTP makes it an http.Handler
+func (h *pathHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+	if exactHandler, ok := h.pathToHandler[r.URL.Path]; ok {
+		glog.V(5).Infof("%v: %q satisfied by exact match", h.muxName, r.URL.Path)
+		exactHandler.ServeHTTP(w, r)
+		return
+	}
+
+	for _, prefixHandler := range h.prefixHandlers {
+		if strings.HasPrefix(r.URL.Path, prefixHandler.prefix) {
+			glog.V(5).Infof("%v: %q satisfied by prefix %v", h.muxName, r.URL.Path, prefixHandler.prefix)
+			prefixHandler.handler.ServeHTTP(w, r)
+			return
+		}
+	}
+
+	glog.V(5).Infof("%v: %q satisfied by NotFoundHandler", h.muxName, r.URL.Path)
+	h.notFoundHandler.ServeHTTP(w, r)
+}
+
+// byPrefixPriority sorts url prefixes by the order in which they should be tested by the mux
+// this has to be sorted by most slashes then by length so that we can iterate straight
+// through to match the "best" one first.
+type byPrefixPriority []string
+
+func (s byPrefixPriority) Len() int      { return len(s) }
+func (s byPrefixPriority) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
+func (s byPrefixPriority) Less(i, j int) bool {
+	lhsNumParts := strings.Count(s[i], "/")
+	rhsNumParts := strings.Count(s[j], "/")
+	if lhsNumParts != rhsNumParts {
+		return lhsNumParts < rhsNumParts
+	}
+
+	lhsLen := len(s[i])
+	rhsLen := len(s[j])
+	if lhsLen != rhsLen {
+		return lhsLen < rhsLen
+	}
+
+	return strings.Compare(s[i], s[j]) < 0
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/OWNERS b/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/OWNERS
new file mode 100755
index 0000000..6371177
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/OWNERS
@@ -0,0 +1,15 @@
+reviewers:
+- smarterclayton
+- wojtek-t
+- deads2k
+- liggitt
+- nikhiljindal
+- sttts
+- jlowdermilk
+- soltysh
+- dims
+- cjcullen
+- ericchiang
+- ping035627
+- xiangpengzhao
+- enj
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/admission.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/admission.go
new file mode 100644
index 0000000..37d0457
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/admission.go
@@ -0,0 +1,219 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package options
+
+import (
+	"fmt"
+	"strings"
+
+	"github.com/spf13/pflag"
+
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/util/sets"
+	"k8s.io/apiserver/pkg/admission"
+	"k8s.io/apiserver/pkg/admission/initializer"
+	admissionmetrics "k8s.io/apiserver/pkg/admission/metrics"
+	"k8s.io/apiserver/pkg/admission/plugin/initialization"
+	"k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle"
+	mutatingwebhook "k8s.io/apiserver/pkg/admission/plugin/webhook/mutating"
+	validatingwebhook "k8s.io/apiserver/pkg/admission/plugin/webhook/validating"
+	apiserverapi "k8s.io/apiserver/pkg/apis/apiserver"
+	apiserverapiv1alpha1 "k8s.io/apiserver/pkg/apis/apiserver/v1alpha1"
+	"k8s.io/apiserver/pkg/server"
+	"k8s.io/client-go/informers"
+	"k8s.io/client-go/kubernetes"
+	"k8s.io/client-go/rest"
+)
+
+var configScheme = runtime.NewScheme()
+
+func init() {
+	apiserverapi.AddToScheme(configScheme)
+	apiserverapiv1alpha1.AddToScheme(configScheme)
+}
+
+// AdmissionOptions holds the admission options
+type AdmissionOptions struct {
+	// RecommendedPluginOrder holds an ordered list of plugin names we recommend to use by default
+	RecommendedPluginOrder []string
+	// DefaultOffPlugins is a set of plugin names that is disabled by default
+	DefaultOffPlugins sets.String
+
+	// EnablePlugins indicates plugins to be enabled passed through `--enable-admission-plugins`.
+	EnablePlugins []string
+	// DisablePlugins indicates plugins to be disabled passed through `--disable-admission-plugins`.
+	DisablePlugins []string
+	// ConfigFile is the file path with admission control configuration.
+	ConfigFile string
+	// Plugins contains all registered plugins.
+	Plugins *admission.Plugins
+}
+
+// NewAdmissionOptions creates a new instance of AdmissionOptions
+// Note:
+//  In addition it calls RegisterAllAdmissionPlugins to register
+//  all generic admission plugins.
+//
+//  Provides the list of RecommendedPluginOrder that holds sane values
+//  that can be used by servers that don't care about admission chain.
+//  Servers that do care can overwrite/append that field after creation.
+func NewAdmissionOptions() *AdmissionOptions {
+	options := &AdmissionOptions{
+		Plugins: admission.NewPlugins(),
+		// This list is mix of mutating admission plugins and validating
+		// admission plugins. The apiserver always runs the validating ones
+		// after all the mutating ones, so their relative order in this list
+		// doesn't matter.
+		RecommendedPluginOrder: []string{lifecycle.PluginName, initialization.PluginName, mutatingwebhook.PluginName, validatingwebhook.PluginName},
+		DefaultOffPlugins:      sets.NewString(initialization.PluginName),
+	}
+	server.RegisterAllAdmissionPlugins(options.Plugins)
+	return options
+}
+
+// AddFlags adds flags related to admission for a specific APIServer to the specified FlagSet
+func (a *AdmissionOptions) AddFlags(fs *pflag.FlagSet) {
+	if a == nil {
+		return
+	}
+
+	fs.StringSliceVar(&a.EnablePlugins, "enable-admission-plugins", a.EnablePlugins, ""+
+		"admission plugins that should be enabled in addition to default enabled ones. "+
+		"Comma-delimited list of admission plugins: "+strings.Join(a.Plugins.Registered(), ", ")+". "+
+		"The order of plugins in this flag does not matter.")
+	fs.StringSliceVar(&a.DisablePlugins, "disable-admission-plugins", a.DisablePlugins, ""+
+		"admission plugins that should be disabled although they are in the default enabled plugins list. "+
+		"Comma-delimited list of admission plugins: "+strings.Join(a.Plugins.Registered(), ", ")+". "+
+		"The order of plugins in this flag does not matter.")
+	fs.StringVar(&a.ConfigFile, "admission-control-config-file", a.ConfigFile,
+		"File with admission control configuration.")
+}
+
+// ApplyTo adds the admission chain to the server configuration.
+// In case admission plugin names were not provided by a custer-admin they will be prepared from the recommended/default values.
+// In addition the method lazily initializes a generic plugin that is appended to the list of pluginInitializers
+// note this method uses:
+//  genericconfig.Authorizer
+func (a *AdmissionOptions) ApplyTo(
+	c *server.Config,
+	informers informers.SharedInformerFactory,
+	kubeAPIServerClientConfig *rest.Config,
+	scheme *runtime.Scheme,
+	pluginInitializers ...admission.PluginInitializer,
+) error {
+	if a == nil {
+		return nil
+	}
+
+	// Admission need scheme to construct admission initializer.
+	if scheme == nil {
+		return fmt.Errorf("admission depends on a scheme, it cannot be nil")
+	}
+
+	// Admission depends on CoreAPI to set SharedInformerFactory and ClientConfig.
+	if informers == nil {
+		return fmt.Errorf("admission depends on a Kubernetes core API shared informer, it cannot be nil")
+	}
+
+	pluginNames := a.enabledPluginNames()
+
+	pluginsConfigProvider, err := admission.ReadAdmissionConfiguration(pluginNames, a.ConfigFile, configScheme)
+	if err != nil {
+		return fmt.Errorf("failed to read plugin config: %v", err)
+	}
+
+	clientset, err := kubernetes.NewForConfig(kubeAPIServerClientConfig)
+	if err != nil {
+		return err
+	}
+	genericInitializer := initializer.New(clientset, informers, c.Authorization.Authorizer, scheme)
+	initializersChain := admission.PluginInitializers{}
+	pluginInitializers = append(pluginInitializers, genericInitializer)
+	initializersChain = append(initializersChain, pluginInitializers...)
+
+	admissionChain, err := a.Plugins.NewFromPlugins(pluginNames, pluginsConfigProvider, initializersChain, admission.DecoratorFunc(admissionmetrics.WithControllerMetrics))
+	if err != nil {
+		return err
+	}
+
+	c.AdmissionControl = admissionmetrics.WithStepMetrics(admissionChain)
+	return nil
+}
+
+// Validate verifies flags passed to AdmissionOptions.
+func (a *AdmissionOptions) Validate() []error {
+	if a == nil {
+		return nil
+	}
+
+	errs := []error{}
+
+	registeredPlugins := sets.NewString(a.Plugins.Registered()...)
+	for _, name := range a.EnablePlugins {
+		if !registeredPlugins.Has(name) {
+			errs = append(errs, fmt.Errorf("enable-admission-plugins plugin %q is unknown", name))
+		}
+	}
+
+	for _, name := range a.DisablePlugins {
+		if !registeredPlugins.Has(name) {
+			errs = append(errs, fmt.Errorf("disable-admission-plugins plugin %q is unknown", name))
+		}
+	}
+
+	enablePlugins := sets.NewString(a.EnablePlugins...)
+	disablePlugins := sets.NewString(a.DisablePlugins...)
+	if len(enablePlugins.Intersection(disablePlugins).List()) > 0 {
+		errs = append(errs, fmt.Errorf("%v in enable-admission-plugins and disable-admission-plugins "+
+			"overlapped", enablePlugins.Intersection(disablePlugins).List()))
+	}
+
+	// Verify RecommendedPluginOrder.
+	recommendPlugins := sets.NewString(a.RecommendedPluginOrder...)
+	intersections := registeredPlugins.Intersection(recommendPlugins)
+	if !intersections.Equal(recommendPlugins) {
+		// Developer error, this should never run in.
+		errs = append(errs, fmt.Errorf("plugins %v in RecommendedPluginOrder are not registered",
+			recommendPlugins.Difference(intersections).List()))
+	}
+	if !intersections.Equal(registeredPlugins) {
+		// Developer error, this should never run in.
+		errs = append(errs, fmt.Errorf("plugins %v registered are not in RecommendedPluginOrder",
+			registeredPlugins.Difference(intersections).List()))
+	}
+
+	return errs
+}
+
+// enabledPluginNames makes use of RecommendedPluginOrder, DefaultOffPlugins,
+// EnablePlugins, DisablePlugins fields
+// to prepare a list of ordered plugin names that are enabled.
+func (a *AdmissionOptions) enabledPluginNames() []string {
+	allOffPlugins := append(a.DefaultOffPlugins.List(), a.DisablePlugins...)
+	disabledPlugins := sets.NewString(allOffPlugins...)
+	enabledPlugins := sets.NewString(a.EnablePlugins...)
+	disabledPlugins = disabledPlugins.Difference(enabledPlugins)
+
+	orderedPlugins := []string{}
+	for _, plugin := range a.RecommendedPluginOrder {
+		if !disabledPlugins.Has(plugin) {
+			orderedPlugins = append(orderedPlugins, plugin)
+		}
+	}
+
+	return orderedPlugins
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/api_enablement.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/api_enablement.go
new file mode 100644
index 0000000..8c64bee
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/api_enablement.go
@@ -0,0 +1,111 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package options
+
+import (
+	"fmt"
+	"strings"
+
+	"github.com/spf13/pflag"
+
+	"k8s.io/apiserver/pkg/server"
+	"k8s.io/apiserver/pkg/server/resourceconfig"
+	serverstore "k8s.io/apiserver/pkg/server/storage"
+	utilflag "k8s.io/apiserver/pkg/util/flag"
+)
+
+// APIEnablementOptions contains the options for which resources to turn on and off.
+// Given small aggregated API servers, this option isn't required for "normal" API servers
+type APIEnablementOptions struct {
+	RuntimeConfig utilflag.ConfigurationMap
+}
+
+func NewAPIEnablementOptions() *APIEnablementOptions {
+	return &APIEnablementOptions{
+		RuntimeConfig: make(utilflag.ConfigurationMap),
+	}
+}
+
+// AddFlags adds flags for a specific APIServer to the specified FlagSet
+func (s *APIEnablementOptions) AddFlags(fs *pflag.FlagSet) {
+	fs.Var(&s.RuntimeConfig, "runtime-config", ""+
+		"A set of key=value pairs that describe runtime configuration that may be passed "+
+		"to apiserver. <group>/<version> (or <version> for the core group) key can be used to "+
+		"turn on/off specific api versions. api/all is special key to control all api versions, "+
+		"be careful setting it false, unless you know what you do. api/legacy is deprecated, "+
+		"we will remove it in the future, so stop using it.")
+}
+
+// Validate validates RuntimeConfig with a list of registries.
+// Usually this list only has one element, the apiserver registry of the process.
+// But in the advanced (and usually not recommended) case of delegated apiservers there can be more.
+// Validate will filter out the known groups of each registry.
+// If anything is left over after that, an error is returned.
+func (s *APIEnablementOptions) Validate(registries ...GroupRegisty) []error {
+	if s == nil {
+		return nil
+	}
+
+	errors := []error{}
+	if s.RuntimeConfig["api/all"] == "false" && len(s.RuntimeConfig) == 1 {
+		// Do not allow only set api/all=false, in such case apiserver startup has no meaning.
+		return append(errors, fmt.Errorf("invliad key with only api/all=false"))
+	}
+
+	groups, err := resourceconfig.ParseGroups(s.RuntimeConfig)
+	if err != nil {
+		return append(errors, err)
+	}
+
+	for _, registry := range registries {
+		// filter out known groups
+		groups = unknownGroups(groups, registry)
+	}
+	if len(groups) != 0 {
+		errors = append(errors, fmt.Errorf("unknown api groups %s", strings.Join(groups, ",")))
+	}
+
+	return errors
+}
+
+// ApplyTo override MergedResourceConfig with defaults and registry
+func (s *APIEnablementOptions) ApplyTo(c *server.Config, defaultResourceConfig *serverstore.ResourceConfig, registry resourceconfig.GroupVersionRegistry) error {
+	if s == nil {
+		return nil
+	}
+
+	mergedResourceConfig, err := resourceconfig.MergeAPIResourceConfigs(defaultResourceConfig, s.RuntimeConfig, registry)
+	c.MergedResourceConfig = mergedResourceConfig
+
+	return err
+}
+
+func unknownGroups(groups []string, registry GroupRegisty) []string {
+	unknownGroups := []string{}
+	for _, group := range groups {
+		if !registry.IsGroupRegistered(group) {
+			unknownGroups = append(unknownGroups, group)
+		}
+	}
+	return unknownGroups
+}
+
+// GroupRegisty provides a method to check whether given group is registered.
+type GroupRegisty interface {
+	// IsRegistered returns true if given group is registered.
+	IsGroupRegistered(group string) bool
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/audit.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/audit.go
new file mode 100644
index 0000000..ab77812
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/audit.go
@@ -0,0 +1,523 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package options
+
+import (
+	"fmt"
+	"io"
+	"os"
+	"strings"
+	"time"
+
+	"github.com/golang/glog"
+	"github.com/spf13/pflag"
+	"gopkg.in/natefinch/lumberjack.v2"
+
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	auditv1alpha1 "k8s.io/apiserver/pkg/apis/audit/v1alpha1"
+	auditv1beta1 "k8s.io/apiserver/pkg/apis/audit/v1beta1"
+	"k8s.io/apiserver/pkg/audit"
+	"k8s.io/apiserver/pkg/audit/policy"
+	"k8s.io/apiserver/pkg/features"
+	"k8s.io/apiserver/pkg/server"
+	utilfeature "k8s.io/apiserver/pkg/util/feature"
+	pluginbuffered "k8s.io/apiserver/plugin/pkg/audit/buffered"
+	pluginlog "k8s.io/apiserver/plugin/pkg/audit/log"
+	plugintruncate "k8s.io/apiserver/plugin/pkg/audit/truncate"
+	pluginwebhook "k8s.io/apiserver/plugin/pkg/audit/webhook"
+)
+
+func appendBackend(existing, newBackend audit.Backend) audit.Backend {
+	if existing == nil {
+		return newBackend
+	}
+	return audit.Union(existing, newBackend)
+}
+
+func advancedAuditingEnabled() bool {
+	return utilfeature.DefaultFeatureGate.Enabled(features.AdvancedAuditing)
+}
+
+type AuditOptions struct {
+	// Policy configuration file for filtering audit events that are captured.
+	// If unspecified, a default is provided.
+	PolicyFile string
+
+	// Plugin options
+
+	LogOptions     AuditLogOptions
+	WebhookOptions AuditWebhookOptions
+}
+
+const (
+	// ModeBatch indicates that the audit backend should buffer audit events
+	// internally, sending batch updates either once a certain number of
+	// events have been received or a certain amount of time has passed.
+	ModeBatch = "batch"
+	// ModeBlocking causes the audit backend to block on every attempt to process
+	// a set of events. This causes requests to the API server to wait for the
+	// flush before sending a response.
+	ModeBlocking = "blocking"
+)
+
+// AllowedModes is the modes known for audit backends.
+var AllowedModes = []string{
+	ModeBatch,
+	ModeBlocking,
+}
+
+type AuditBatchOptions struct {
+	// Should the backend asynchronous batch events to the webhook backend or
+	// should the backend block responses?
+	//
+	// Defaults to asynchronous batch events.
+	Mode string
+	// Configuration for batching backend. Only used in batch mode.
+	BatchConfig pluginbuffered.BatchConfig
+}
+
+type AuditTruncateOptions struct {
+	// Whether truncating is enabled or not.
+	Enabled bool
+
+	// Truncating configuration.
+	TruncateConfig plugintruncate.Config
+}
+
+// AuditLogOptions determines the output of the structured audit log by default.
+// If the AdvancedAuditing feature is set to false, AuditLogOptions holds the legacy
+// audit log writer.
+type AuditLogOptions struct {
+	Path       string
+	MaxAge     int
+	MaxBackups int
+	MaxSize    int
+	Format     string
+
+	BatchOptions    AuditBatchOptions
+	TruncateOptions AuditTruncateOptions
+
+	// API group version used for serializing audit events.
+	GroupVersionString string
+}
+
+// AuditWebhookOptions control the webhook configuration for audit events.
+type AuditWebhookOptions struct {
+	ConfigFile     string
+	InitialBackoff time.Duration
+
+	BatchOptions    AuditBatchOptions
+	TruncateOptions AuditTruncateOptions
+
+	// API group version used for serializing audit events.
+	GroupVersionString string
+}
+
+func NewAuditOptions() *AuditOptions {
+	defaultLogBatchConfig := pluginbuffered.NewDefaultBatchConfig()
+	defaultLogBatchConfig.ThrottleEnable = false
+
+	return &AuditOptions{
+		WebhookOptions: AuditWebhookOptions{
+			InitialBackoff: pluginwebhook.DefaultInitialBackoff,
+			BatchOptions: AuditBatchOptions{
+				Mode:        ModeBatch,
+				BatchConfig: pluginbuffered.NewDefaultBatchConfig(),
+			},
+			TruncateOptions:    NewAuditTruncateOptions(),
+			GroupVersionString: "audit.k8s.io/v1beta1",
+		},
+		LogOptions: AuditLogOptions{
+			Format: pluginlog.FormatJson,
+			BatchOptions: AuditBatchOptions{
+				Mode:        ModeBlocking,
+				BatchConfig: defaultLogBatchConfig,
+			},
+			TruncateOptions:    NewAuditTruncateOptions(),
+			GroupVersionString: "audit.k8s.io/v1beta1",
+		},
+	}
+}
+
+func NewAuditTruncateOptions() AuditTruncateOptions {
+	return AuditTruncateOptions{
+		Enabled: false,
+		TruncateConfig: plugintruncate.Config{
+			MaxBatchSize: 10 * 1024 * 1024, // 10MB
+			MaxEventSize: 100 * 1024,       // 100KB
+		},
+	}
+}
+
+// Validate checks invalid config combination
+func (o *AuditOptions) Validate() []error {
+	if o == nil {
+		return nil
+	}
+
+	allErrors := []error{}
+
+	if !advancedAuditingEnabled() {
+		if len(o.PolicyFile) > 0 {
+			allErrors = append(allErrors, fmt.Errorf("feature '%s' must be enabled to set option --audit-policy-file", features.AdvancedAuditing))
+		}
+		if len(o.WebhookOptions.ConfigFile) > 0 {
+			allErrors = append(allErrors, fmt.Errorf("feature '%s' must be enabled to set option --audit-webhook-config-file", features.AdvancedAuditing))
+		}
+	}
+
+	allErrors = append(allErrors, o.LogOptions.Validate()...)
+	allErrors = append(allErrors, o.WebhookOptions.Validate()...)
+
+	return allErrors
+}
+
+func validateBackendMode(pluginName string, mode string) error {
+	for _, m := range AllowedModes {
+		if m == mode {
+			return nil
+		}
+	}
+	return fmt.Errorf("invalid audit %s mode %s, allowed modes are %q", pluginName, mode, strings.Join(AllowedModes, ","))
+}
+
+func validateBackendBatchOptions(pluginName string, options AuditBatchOptions) error {
+	if err := validateBackendMode(pluginName, options.Mode); err != nil {
+		return err
+	}
+	if options.Mode != ModeBatch {
+		// Don't validate the unused options.
+		return nil
+	}
+	config := options.BatchConfig
+	if config.BufferSize <= 0 {
+		return fmt.Errorf("invalid audit batch %s buffer size %v, must be a positive number", pluginName, config.BufferSize)
+	}
+	if config.MaxBatchSize <= 0 {
+		return fmt.Errorf("invalid audit batch %s max batch size %v, must be a positive number", pluginName, config.MaxBatchSize)
+	}
+	if config.ThrottleQPS <= 0 {
+		return fmt.Errorf("invalid audit batch %s throttle QPS %v, must be a positive number", pluginName, config.ThrottleQPS)
+	}
+	if config.ThrottleBurst <= 0 {
+		return fmt.Errorf("invalid audit batch %s throttle burst %v, must be a positive number", pluginName, config.ThrottleBurst)
+	}
+	return nil
+}
+
+var knownGroupVersions = []schema.GroupVersion{
+	auditv1alpha1.SchemeGroupVersion,
+	auditv1beta1.SchemeGroupVersion,
+}
+
+func validateGroupVersionString(groupVersion string) error {
+	gv, err := schema.ParseGroupVersion(groupVersion)
+	if err != nil {
+		return err
+	}
+	if !knownGroupVersion(gv) {
+		return fmt.Errorf("invalid group version, allowed versions are %q", knownGroupVersions)
+	}
+	return nil
+}
+
+func knownGroupVersion(gv schema.GroupVersion) bool {
+	for _, knownGv := range knownGroupVersions {
+		if gv == knownGv {
+			return true
+		}
+	}
+	return false
+}
+
+func (o *AuditOptions) AddFlags(fs *pflag.FlagSet) {
+	if o == nil {
+		return
+	}
+
+	fs.StringVar(&o.PolicyFile, "audit-policy-file", o.PolicyFile,
+		"Path to the file that defines the audit policy configuration. Requires the 'AdvancedAuditing' feature gate."+
+			" With AdvancedAuditing, a profile is required to enable auditing.")
+
+	o.LogOptions.AddFlags(fs)
+	o.LogOptions.BatchOptions.AddFlags(pluginlog.PluginName, fs)
+	o.LogOptions.TruncateOptions.AddFlags(pluginlog.PluginName, fs)
+	o.WebhookOptions.AddFlags(fs)
+	o.WebhookOptions.BatchOptions.AddFlags(pluginwebhook.PluginName, fs)
+	o.WebhookOptions.TruncateOptions.AddFlags(pluginwebhook.PluginName, fs)
+}
+
+func (o *AuditOptions) ApplyTo(c *server.Config) error {
+	if o == nil {
+		return nil
+	}
+
+	// Apply legacy audit options if advanced audit is not enabled.
+	if !advancedAuditingEnabled() {
+		return o.LogOptions.legacyApplyTo(c)
+	}
+
+	// Apply advanced options if advanced audit is enabled.
+	// 1. Apply generic options.
+	if err := o.applyTo(c); err != nil {
+		return err
+	}
+
+	// 2. Apply plugin options.
+	if err := o.LogOptions.advancedApplyTo(c); err != nil {
+		return err
+	}
+	if err := o.WebhookOptions.applyTo(c); err != nil {
+		return err
+	}
+
+	if c.AuditBackend != nil && c.AuditPolicyChecker == nil {
+		glog.V(2).Info("No audit policy file provided for AdvancedAuditing, no events will be recorded.")
+	}
+	return nil
+}
+
+func (o *AuditOptions) applyTo(c *server.Config) error {
+	if o.PolicyFile == "" {
+		return nil
+	}
+
+	p, err := policy.LoadPolicyFromFile(o.PolicyFile)
+	if err != nil {
+		return fmt.Errorf("loading audit policy file: %v", err)
+	}
+	c.AuditPolicyChecker = policy.NewChecker(p)
+	return nil
+}
+
+func (o *AuditBatchOptions) AddFlags(pluginName string, fs *pflag.FlagSet) {
+	fs.StringVar(&o.Mode, fmt.Sprintf("audit-%s-mode", pluginName), o.Mode,
+		"Strategy for sending audit events. Blocking indicates sending events should block"+
+			" server responses. Batch causes the backend to buffer and write events"+
+			" asynchronously. Known modes are "+strings.Join(AllowedModes, ",")+".")
+	fs.IntVar(&o.BatchConfig.BufferSize, fmt.Sprintf("audit-%s-batch-buffer-size", pluginName),
+		o.BatchConfig.BufferSize, "The size of the buffer to store events before "+
+			"batching and writing. Only used in batch mode.")
+	fs.IntVar(&o.BatchConfig.MaxBatchSize, fmt.Sprintf("audit-%s-batch-max-size", pluginName),
+		o.BatchConfig.MaxBatchSize, "The maximum size of a batch. Only used in batch mode.")
+	fs.DurationVar(&o.BatchConfig.MaxBatchWait, fmt.Sprintf("audit-%s-batch-max-wait", pluginName),
+		o.BatchConfig.MaxBatchWait, "The amount of time to wait before force writing the "+
+			"batch that hadn't reached the max size. Only used in batch mode.")
+	fs.BoolVar(&o.BatchConfig.ThrottleEnable, fmt.Sprintf("audit-%s-batch-throttle-enable", pluginName),
+		o.BatchConfig.ThrottleEnable, "Whether batching throttling is enabled. Only used in batch mode.")
+	fs.Float32Var(&o.BatchConfig.ThrottleQPS, fmt.Sprintf("audit-%s-batch-throttle-qps", pluginName),
+		o.BatchConfig.ThrottleQPS, "Maximum average number of batches per second. "+
+			"Only used in batch mode.")
+	fs.IntVar(&o.BatchConfig.ThrottleBurst, fmt.Sprintf("audit-%s-batch-throttle-burst", pluginName),
+		o.BatchConfig.ThrottleBurst, "Maximum number of requests sent at the same "+
+			"moment if ThrottleQPS was not utilized before. Only used in batch mode.")
+}
+
+func (o *AuditBatchOptions) wrapBackend(delegate audit.Backend) audit.Backend {
+	if o.Mode == ModeBlocking {
+		return delegate
+	}
+	return pluginbuffered.NewBackend(delegate, o.BatchConfig)
+}
+
+func (o *AuditTruncateOptions) Validate(pluginName string) error {
+	config := o.TruncateConfig
+	if config.MaxEventSize <= 0 {
+		return fmt.Errorf("invalid audit truncate %s max event size %v, must be a positive number", pluginName, config.MaxEventSize)
+	}
+	if config.MaxBatchSize < config.MaxEventSize {
+		return fmt.Errorf("invalid audit truncate %s max batch size %v, must be greater than "+
+			"max event size (%v)", pluginName, config.MaxBatchSize, config.MaxEventSize)
+	}
+	return nil
+}
+
+func (o *AuditTruncateOptions) AddFlags(pluginName string, fs *pflag.FlagSet) {
+	fs.BoolVar(&o.Enabled, fmt.Sprintf("audit-%s-truncate-enabled", pluginName),
+		o.Enabled, "Whether event and batch truncating is enabled.")
+	fs.Int64Var(&o.TruncateConfig.MaxBatchSize, fmt.Sprintf("audit-%s-truncate-max-batch-size", pluginName),
+		o.TruncateConfig.MaxBatchSize, "Maximum size of the batch sent to the underlying backend. "+
+			"Actual serialized size can be several hundreds of bytes greater. If a batch exceeds this limit, "+
+			"it is split into several batches of smaller size.")
+	fs.Int64Var(&o.TruncateConfig.MaxEventSize, fmt.Sprintf("audit-%s-truncate-max-event-size", pluginName),
+		o.TruncateConfig.MaxEventSize, "Maximum size of the audit event sent to the underlying backend. "+
+			"If the size of an event is greater than this number, first request and response are removed, and"+
+			"if this doesn't reduce the size enough, event is discarded.")
+}
+
+func (o *AuditTruncateOptions) wrapBackend(delegate audit.Backend, gv schema.GroupVersion) audit.Backend {
+	if !o.Enabled {
+		return delegate
+	}
+	return plugintruncate.NewBackend(delegate, o.TruncateConfig, gv)
+}
+
+func (o *AuditLogOptions) AddFlags(fs *pflag.FlagSet) {
+	fs.StringVar(&o.Path, "audit-log-path", o.Path,
+		"If set, all requests coming to the apiserver will be logged to this file.  '-' means standard out.")
+	fs.IntVar(&o.MaxAge, "audit-log-maxage", o.MaxBackups,
+		"The maximum number of days to retain old audit log files based on the timestamp encoded in their filename.")
+	fs.IntVar(&o.MaxBackups, "audit-log-maxbackup", o.MaxBackups,
+		"The maximum number of old audit log files to retain.")
+	fs.IntVar(&o.MaxSize, "audit-log-maxsize", o.MaxSize,
+		"The maximum size in megabytes of the audit log file before it gets rotated.")
+	fs.StringVar(&o.Format, "audit-log-format", o.Format,
+		"Format of saved audits. \"legacy\" indicates 1-line text format for each event."+
+			" \"json\" indicates structured json format. Requires the 'AdvancedAuditing' feature"+
+			" gate. Known formats are "+strings.Join(pluginlog.AllowedFormats, ",")+".")
+	fs.StringVar(&o.GroupVersionString, "audit-log-version", o.GroupVersionString,
+		"API group and version used for serializing audit events written to log.")
+}
+
+func (o *AuditLogOptions) Validate() []error {
+	// Check whether the log backend is enabled based on the options.
+	if !o.enabled() {
+		return nil
+	}
+
+	var allErrors []error
+	if advancedAuditingEnabled() {
+		if err := validateBackendBatchOptions(pluginlog.PluginName, o.BatchOptions); err != nil {
+			allErrors = append(allErrors, err)
+		}
+		if err := o.TruncateOptions.Validate(pluginlog.PluginName); err != nil {
+			allErrors = append(allErrors, err)
+		}
+
+		if err := validateGroupVersionString(o.GroupVersionString); err != nil {
+			allErrors = append(allErrors, err)
+		}
+
+		// Check log format
+		validFormat := false
+		for _, f := range pluginlog.AllowedFormats {
+			if f == o.Format {
+				validFormat = true
+				break
+			}
+		}
+		if !validFormat {
+			allErrors = append(allErrors, fmt.Errorf("invalid audit log format %s, allowed formats are %q", o.Format, strings.Join(pluginlog.AllowedFormats, ",")))
+		}
+	}
+
+	// Check validities of MaxAge, MaxBackups and MaxSize of log options, if file log backend is enabled.
+	if o.MaxAge < 0 {
+		allErrors = append(allErrors, fmt.Errorf("--audit-log-maxage %v can't be a negative number", o.MaxAge))
+	}
+	if o.MaxBackups < 0 {
+		allErrors = append(allErrors, fmt.Errorf("--audit-log-maxbackup %v can't be a negative number", o.MaxBackups))
+	}
+	if o.MaxSize < 0 {
+		allErrors = append(allErrors, fmt.Errorf("--audit-log-maxsize %v can't be a negative number", o.MaxSize))
+	}
+
+	return allErrors
+}
+
+// Check whether the log backend is enabled based on the options.
+func (o *AuditLogOptions) enabled() bool {
+	return o != nil && o.Path != ""
+}
+
+func (o *AuditLogOptions) getWriter() io.Writer {
+	if !o.enabled() {
+		return nil
+	}
+
+	var w io.Writer = os.Stdout
+	if o.Path != "-" {
+		w = &lumberjack.Logger{
+			Filename:   o.Path,
+			MaxAge:     o.MaxAge,
+			MaxBackups: o.MaxBackups,
+			MaxSize:    o.MaxSize,
+		}
+	}
+	return w
+}
+
+func (o *AuditLogOptions) advancedApplyTo(c *server.Config) error {
+	if w := o.getWriter(); w != nil {
+		groupVersion, _ := schema.ParseGroupVersion(o.GroupVersionString)
+		log := pluginlog.NewBackend(w, o.Format, groupVersion)
+		log = o.BatchOptions.wrapBackend(log)
+		log = o.TruncateOptions.wrapBackend(log, groupVersion)
+		c.AuditBackend = appendBackend(c.AuditBackend, log)
+	}
+	return nil
+}
+
+func (o *AuditLogOptions) legacyApplyTo(c *server.Config) error {
+	c.LegacyAuditWriter = o.getWriter()
+	return nil
+}
+
+func (o *AuditWebhookOptions) AddFlags(fs *pflag.FlagSet) {
+	fs.StringVar(&o.ConfigFile, "audit-webhook-config-file", o.ConfigFile,
+		"Path to a kubeconfig formatted file that defines the audit webhook configuration."+
+			" Requires the 'AdvancedAuditing' feature gate.")
+	fs.DurationVar(&o.InitialBackoff, "audit-webhook-initial-backoff",
+		o.InitialBackoff, "The amount of time to wait before retrying the first failed request.")
+	fs.DurationVar(&o.InitialBackoff, "audit-webhook-batch-initial-backoff",
+		o.InitialBackoff, "The amount of time to wait before retrying the first failed request.")
+	fs.MarkDeprecated("audit-webhook-batch-initial-backoff",
+		"Deprecated, use --audit-webhook-initial-backoff instead.")
+	fs.StringVar(&o.GroupVersionString, "audit-webhook-version", o.GroupVersionString,
+		"API group and version used for serializing audit events written to webhook.")
+}
+
+func (o *AuditWebhookOptions) Validate() []error {
+	if !o.enabled() {
+		return nil
+	}
+
+	var allErrors []error
+	if advancedAuditingEnabled() {
+		if err := validateBackendBatchOptions(pluginwebhook.PluginName, o.BatchOptions); err != nil {
+			allErrors = append(allErrors, err)
+		}
+		if err := o.TruncateOptions.Validate(pluginwebhook.PluginName); err != nil {
+			allErrors = append(allErrors, err)
+		}
+
+		if err := validateGroupVersionString(o.GroupVersionString); err != nil {
+			allErrors = append(allErrors, err)
+		}
+	}
+	return allErrors
+}
+
+func (o *AuditWebhookOptions) enabled() bool {
+	return o != nil && o.ConfigFile != ""
+}
+
+func (o *AuditWebhookOptions) applyTo(c *server.Config) error {
+	if !o.enabled() {
+		return nil
+	}
+
+	groupVersion, _ := schema.ParseGroupVersion(o.GroupVersionString)
+	webhook, err := pluginwebhook.NewBackend(o.ConfigFile, groupVersion, o.InitialBackoff)
+	if err != nil {
+		return fmt.Errorf("initializing audit webhook: %v", err)
+	}
+	webhook = o.BatchOptions.wrapBackend(webhook)
+	webhook = o.TruncateOptions.wrapBackend(webhook, groupVersion)
+	c.AuditBackend = appendBackend(c.AuditBackend, webhook)
+	return nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/authentication.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/authentication.go
new file mode 100644
index 0000000..2ec5024
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/authentication.go
@@ -0,0 +1,406 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package options
+
+import (
+	"encoding/json"
+	"fmt"
+	"io/ioutil"
+	"time"
+
+	"github.com/golang/glog"
+	"github.com/spf13/pflag"
+
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apiserver/pkg/authentication/authenticatorfactory"
+	"k8s.io/apiserver/pkg/server"
+	authenticationclient "k8s.io/client-go/kubernetes/typed/authentication/v1beta1"
+	coreclient "k8s.io/client-go/kubernetes/typed/core/v1"
+	"k8s.io/client-go/rest"
+	"k8s.io/client-go/tools/clientcmd"
+	openapicommon "k8s.io/kube-openapi/pkg/common"
+)
+
+type RequestHeaderAuthenticationOptions struct {
+	UsernameHeaders     []string
+	GroupHeaders        []string
+	ExtraHeaderPrefixes []string
+	ClientCAFile        string
+	AllowedNames        []string
+}
+
+func (s *RequestHeaderAuthenticationOptions) AddFlags(fs *pflag.FlagSet) {
+	if s == nil {
+		return
+	}
+
+	fs.StringSliceVar(&s.UsernameHeaders, "requestheader-username-headers", s.UsernameHeaders, ""+
+		"List of request headers to inspect for usernames. X-Remote-User is common.")
+
+	fs.StringSliceVar(&s.GroupHeaders, "requestheader-group-headers", s.GroupHeaders, ""+
+		"List of request headers to inspect for groups. X-Remote-Group is suggested.")
+
+	fs.StringSliceVar(&s.ExtraHeaderPrefixes, "requestheader-extra-headers-prefix", s.ExtraHeaderPrefixes, ""+
+		"List of request header prefixes to inspect. X-Remote-Extra- is suggested.")
+
+	fs.StringVar(&s.ClientCAFile, "requestheader-client-ca-file", s.ClientCAFile, ""+
+		"Root certificate bundle to use to verify client certificates on incoming requests "+
+		"before trusting usernames in headers specified by --requestheader-username-headers. "+
+		"WARNING: generally do not depend on authorization being already done for incoming requests.")
+
+	fs.StringSliceVar(&s.AllowedNames, "requestheader-allowed-names", s.AllowedNames, ""+
+		"List of client certificate common names to allow to provide usernames in headers "+
+		"specified by --requestheader-username-headers. If empty, any client certificate validated "+
+		"by the authorities in --requestheader-client-ca-file is allowed.")
+}
+
+// ToAuthenticationRequestHeaderConfig returns a RequestHeaderConfig config object for these options
+// if necessary, nil otherwise.
+func (s *RequestHeaderAuthenticationOptions) ToAuthenticationRequestHeaderConfig() *authenticatorfactory.RequestHeaderConfig {
+	if len(s.ClientCAFile) == 0 {
+		return nil
+	}
+
+	return &authenticatorfactory.RequestHeaderConfig{
+		UsernameHeaders:     s.UsernameHeaders,
+		GroupHeaders:        s.GroupHeaders,
+		ExtraHeaderPrefixes: s.ExtraHeaderPrefixes,
+		ClientCA:            s.ClientCAFile,
+		AllowedClientNames:  s.AllowedNames,
+	}
+}
+
+type ClientCertAuthenticationOptions struct {
+	// ClientCA is the certificate bundle for all the signers that you'll recognize for incoming client certificates
+	ClientCA string
+}
+
+func (s *ClientCertAuthenticationOptions) AddFlags(fs *pflag.FlagSet) {
+	fs.StringVar(&s.ClientCA, "client-ca-file", s.ClientCA, ""+
+		"If set, any request presenting a client certificate signed by one of "+
+		"the authorities in the client-ca-file is authenticated with an identity "+
+		"corresponding to the CommonName of the client certificate.")
+}
+
+// DelegatingAuthenticationOptions provides an easy way for composing API servers to delegate their authentication to
+// the root kube API server.  The API federator will act as
+// a front proxy and direction connections will be able to delegate to the core kube API server
+type DelegatingAuthenticationOptions struct {
+	// RemoteKubeConfigFile is the file to use to connect to a "normal" kube API server which hosts the
+	// TokenAccessReview.authentication.k8s.io endpoint for checking tokens.
+	RemoteKubeConfigFile string
+
+	// CacheTTL is the length of time that a token authentication answer will be cached.
+	CacheTTL time.Duration
+
+	ClientCert    ClientCertAuthenticationOptions
+	RequestHeader RequestHeaderAuthenticationOptions
+
+	SkipInClusterLookup bool
+}
+
+func NewDelegatingAuthenticationOptions() *DelegatingAuthenticationOptions {
+	return &DelegatingAuthenticationOptions{
+		// very low for responsiveness, but high enough to handle storms
+		CacheTTL:   10 * time.Second,
+		ClientCert: ClientCertAuthenticationOptions{},
+		RequestHeader: RequestHeaderAuthenticationOptions{
+			UsernameHeaders:     []string{"x-remote-user"},
+			GroupHeaders:        []string{"x-remote-group"},
+			ExtraHeaderPrefixes: []string{"x-remote-extra-"},
+		},
+	}
+}
+
+func (s *DelegatingAuthenticationOptions) Validate() []error {
+	allErrors := []error{}
+	return allErrors
+}
+
+func (s *DelegatingAuthenticationOptions) AddFlags(fs *pflag.FlagSet) {
+	if s == nil {
+		return
+	}
+
+	fs.StringVar(&s.RemoteKubeConfigFile, "authentication-kubeconfig", s.RemoteKubeConfigFile, ""+
+		"kubeconfig file pointing at the 'core' kubernetes server with enough rights to create "+
+		"tokenaccessreviews.authentication.k8s.io.")
+
+	fs.DurationVar(&s.CacheTTL, "authentication-token-webhook-cache-ttl", s.CacheTTL,
+		"The duration to cache responses from the webhook token authenticator.")
+
+	s.ClientCert.AddFlags(fs)
+	s.RequestHeader.AddFlags(fs)
+
+	fs.BoolVar(&s.SkipInClusterLookup, "authentication-skip-lookup", s.SkipInClusterLookup, ""+
+		"If false, the authentication-kubeconfig will be used to lookup missing authentication "+
+		"configuration from the cluster.")
+
+}
+
+func (s *DelegatingAuthenticationOptions) ApplyTo(c *server.AuthenticationInfo, servingInfo *server.SecureServingInfo, openAPIConfig *openapicommon.Config) error {
+	if s == nil {
+		c.Authenticator = nil
+		return nil
+	}
+
+	clientCA, err := s.getClientCA()
+	if err != nil {
+		if _, ignorable := err.(ignorableError); !ignorable {
+			return err
+		} else {
+			glog.Warning(err)
+		}
+	}
+	if err = c.ApplyClientCert(clientCA.ClientCA, servingInfo); err != nil {
+		return fmt.Errorf("unable to load client CA file: %v", err)
+	}
+
+	requestHeader, err := s.getRequestHeader()
+	if err != nil {
+		return err
+	}
+	if err = c.ApplyClientCert(requestHeader.ClientCAFile, servingInfo); err != nil {
+		return fmt.Errorf("unable to load client CA file: %v", err)
+	}
+
+	cfg, err := s.ToAuthenticationConfig()
+	if err != nil {
+		return err
+	}
+	authenticator, securityDefinitions, err := cfg.New()
+	if err != nil {
+		return err
+	}
+
+	c.Authenticator = authenticator
+	if openAPIConfig != nil {
+		openAPIConfig.SecurityDefinitions = securityDefinitions
+	}
+	c.SupportsBasicAuth = false
+
+	return nil
+}
+
+func (s *DelegatingAuthenticationOptions) ToAuthenticationConfig() (authenticatorfactory.DelegatingAuthenticatorConfig, error) {
+	tokenClient, err := s.newTokenAccessReview()
+	if err != nil {
+		return authenticatorfactory.DelegatingAuthenticatorConfig{}, err
+	}
+
+	clientCA, err := s.getClientCA()
+	if err != nil {
+		if _, ignorable := err.(ignorableError); !ignorable {
+			return authenticatorfactory.DelegatingAuthenticatorConfig{}, err
+		} else {
+			glog.Warning(err)
+		}
+	}
+	requestHeader, err := s.getRequestHeader()
+	if err != nil {
+		return authenticatorfactory.DelegatingAuthenticatorConfig{}, err
+	}
+
+	ret := authenticatorfactory.DelegatingAuthenticatorConfig{
+		Anonymous:               true,
+		TokenAccessReviewClient: tokenClient,
+		CacheTTL:                s.CacheTTL,
+		ClientCAFile:            clientCA.ClientCA,
+		RequestHeaderConfig:     requestHeader.ToAuthenticationRequestHeaderConfig(),
+	}
+	return ret, nil
+}
+
+const (
+	authenticationConfigMapNamespace = metav1.NamespaceSystem
+	// authenticationConfigMapName is the name of ConfigMap in the kube-system namespace holding the root certificate
+	// bundle to use to verify client certificates on incoming requests before trusting usernames in headers specified
+	// by --requestheader-username-headers. This is created in the cluster by the kube-apiserver.
+	// "WARNING: generally do not depend on authorization being already done for incoming requests.")
+	authenticationConfigMapName = "extension-apiserver-authentication"
+	authenticationRoleName      = "extension-apiserver-authentication-reader"
+)
+
+func (s *DelegatingAuthenticationOptions) getClientCA() (*ClientCertAuthenticationOptions, error) {
+	if len(s.ClientCert.ClientCA) > 0 || s.SkipInClusterLookup {
+		return &s.ClientCert, nil
+	}
+
+	incluster, err := s.lookupInClusterClientCA()
+	if err != nil {
+		glog.Warningf("Unable to get configmap/%s in %s.  Usually fixed by "+
+			"'kubectl create rolebinding -n %s ROLE_NAME --role=%s --serviceaccount=YOUR_NS:YOUR_SA'",
+			authenticationConfigMapName, authenticationConfigMapNamespace, authenticationConfigMapNamespace, authenticationRoleName)
+		return nil, err
+	}
+	if incluster == nil {
+		return &s.ClientCert, ignorableError{fmt.Errorf("cluster doesn't provide client-ca-file in configmap/%s in %s, so client certificate authentication to extension api-server won't work.", authenticationConfigMapName, authenticationConfigMapNamespace)}
+	}
+	return incluster, nil
+}
+
+func (s *DelegatingAuthenticationOptions) getRequestHeader() (*RequestHeaderAuthenticationOptions, error) {
+	if len(s.RequestHeader.ClientCAFile) > 0 || s.SkipInClusterLookup {
+		return &s.RequestHeader, nil
+	}
+
+	incluster, err := s.lookupInClusterRequestHeader()
+	if err != nil {
+		glog.Warningf("Unable to get configmap/%s in %s.  Usually fixed by "+
+			"'kubectl create rolebinding -n %s ROLE_NAME --role=%s --serviceaccount=YOUR_NS:YOUR_SA'",
+			authenticationConfigMapName, authenticationConfigMapNamespace, authenticationConfigMapNamespace, authenticationRoleName)
+		return nil, err
+	}
+	if incluster == nil {
+		return nil, fmt.Errorf("cluster doesn't provide requestheader-client-ca-file")
+	}
+	return incluster, nil
+}
+
+func (s *DelegatingAuthenticationOptions) lookupInClusterClientCA() (*ClientCertAuthenticationOptions, error) {
+	clientConfig, err := s.getClientConfig()
+	if err != nil {
+		return nil, err
+	}
+	client, err := coreclient.NewForConfig(clientConfig)
+	if err != nil {
+		return nil, err
+	}
+
+	authConfigMap, err := client.ConfigMaps(authenticationConfigMapNamespace).Get(authenticationConfigMapName, metav1.GetOptions{})
+	if err != nil {
+		return nil, err
+	}
+
+	clientCA, ok := authConfigMap.Data["client-ca-file"]
+	if !ok {
+		return nil, nil
+	}
+
+	f, err := ioutil.TempFile("", "client-ca-file")
+	if err != nil {
+		return nil, err
+	}
+	if err := ioutil.WriteFile(f.Name(), []byte(clientCA), 0600); err != nil {
+		return nil, err
+	}
+	return &ClientCertAuthenticationOptions{ClientCA: f.Name()}, nil
+}
+
+func (s *DelegatingAuthenticationOptions) lookupInClusterRequestHeader() (*RequestHeaderAuthenticationOptions, error) {
+	clientConfig, err := s.getClientConfig()
+	if err != nil {
+		return nil, err
+	}
+	client, err := coreclient.NewForConfig(clientConfig)
+	if err != nil {
+		return nil, err
+	}
+
+	authConfigMap, err := client.ConfigMaps(authenticationConfigMapNamespace).Get(authenticationConfigMapName, metav1.GetOptions{})
+	if err != nil {
+		return nil, err
+	}
+
+	requestHeaderCA, ok := authConfigMap.Data["requestheader-client-ca-file"]
+	if !ok {
+		return nil, nil
+	}
+
+	f, err := ioutil.TempFile("", "requestheader-client-ca-file")
+	if err != nil {
+		return nil, err
+	}
+	if err := ioutil.WriteFile(f.Name(), []byte(requestHeaderCA), 0600); err != nil {
+		return nil, err
+	}
+	usernameHeaders, err := deserializeStrings(authConfigMap.Data["requestheader-username-headers"])
+	if err != nil {
+		return nil, err
+	}
+	groupHeaders, err := deserializeStrings(authConfigMap.Data["requestheader-group-headers"])
+	if err != nil {
+		return nil, err
+	}
+	extraHeaderPrefixes, err := deserializeStrings(authConfigMap.Data["requestheader-extra-headers-prefix"])
+	if err != nil {
+		return nil, err
+	}
+	allowedNames, err := deserializeStrings(authConfigMap.Data["requestheader-allowed-names"])
+	if err != nil {
+		return nil, err
+	}
+
+	return &RequestHeaderAuthenticationOptions{
+		UsernameHeaders:     usernameHeaders,
+		GroupHeaders:        groupHeaders,
+		ExtraHeaderPrefixes: extraHeaderPrefixes,
+		ClientCAFile:        f.Name(),
+		AllowedNames:        allowedNames,
+	}, nil
+}
+
+func deserializeStrings(in string) ([]string, error) {
+	if len(in) == 0 {
+		return nil, nil
+	}
+	var ret []string
+	if err := json.Unmarshal([]byte(in), &ret); err != nil {
+		return nil, err
+	}
+	return ret, nil
+}
+
+func (s *DelegatingAuthenticationOptions) getClientConfig() (*rest.Config, error) {
+	var clientConfig *rest.Config
+	var err error
+	if len(s.RemoteKubeConfigFile) > 0 {
+		loadingRules := &clientcmd.ClientConfigLoadingRules{ExplicitPath: s.RemoteKubeConfigFile}
+		loader := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, &clientcmd.ConfigOverrides{})
+
+		clientConfig, err = loader.ClientConfig()
+
+	} else {
+		// without the remote kubeconfig file, try to use the in-cluster config.  Most addon API servers will
+		// use this path
+		clientConfig, err = rest.InClusterConfig()
+	}
+	if err != nil {
+		return nil, err
+	}
+
+	// set high qps/burst limits since this will effectively limit API server responsiveness
+	clientConfig.QPS = 200
+	clientConfig.Burst = 400
+
+	return clientConfig, nil
+}
+
+func (s *DelegatingAuthenticationOptions) newTokenAccessReview() (authenticationclient.TokenReviewInterface, error) {
+	clientConfig, err := s.getClientConfig()
+	if err != nil {
+		return nil, err
+	}
+	client, err := authenticationclient.NewForConfig(clientConfig)
+	if err != nil {
+		return nil, err
+	}
+
+	return client.TokenReviews(), nil
+}
+
+type ignorableError struct{ error }
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/authorization.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/authorization.go
new file mode 100644
index 0000000..a845921
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/authorization.go
@@ -0,0 +1,141 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package options
+
+import (
+	"time"
+
+	"github.com/spf13/pflag"
+
+	"k8s.io/apiserver/pkg/authorization/authorizerfactory"
+	"k8s.io/apiserver/pkg/server"
+	authorizationclient "k8s.io/client-go/kubernetes/typed/authorization/v1beta1"
+	"k8s.io/client-go/rest"
+	"k8s.io/client-go/tools/clientcmd"
+)
+
+// DelegatingAuthorizationOptions provides an easy way for composing API servers to delegate their authorization to
+// the root kube API server.
+// WARNING: never assume that every authenticated incoming request already does authorization.
+//          The aggregator in the kube API server does this today, but this behaviour is not
+//          guaranteed in the future.
+type DelegatingAuthorizationOptions struct {
+	// RemoteKubeConfigFile is the file to use to connect to a "normal" kube API server which hosts the
+	// SubjectAccessReview.authorization.k8s.io endpoint for checking tokens.
+	RemoteKubeConfigFile string
+
+	// AllowCacheTTL is the length of time that a successful authorization response will be cached
+	AllowCacheTTL time.Duration
+
+	// DenyCacheTTL is the length of time that an unsuccessful authorization response will be cached.
+	// You generally want more responsive, "deny, try again" flows.
+	DenyCacheTTL time.Duration
+}
+
+func NewDelegatingAuthorizationOptions() *DelegatingAuthorizationOptions {
+	return &DelegatingAuthorizationOptions{
+		// very low for responsiveness, but high enough to handle storms
+		AllowCacheTTL: 10 * time.Second,
+		DenyCacheTTL:  10 * time.Second,
+	}
+}
+
+func (s *DelegatingAuthorizationOptions) Validate() []error {
+	allErrors := []error{}
+	return allErrors
+}
+
+func (s *DelegatingAuthorizationOptions) AddFlags(fs *pflag.FlagSet) {
+	if s == nil {
+		return
+	}
+
+	fs.StringVar(&s.RemoteKubeConfigFile, "authorization-kubeconfig", s.RemoteKubeConfigFile, ""+
+		"kubeconfig file pointing at the 'core' kubernetes server with enough rights to create "+
+		" subjectaccessreviews.authorization.k8s.io.")
+
+	fs.DurationVar(&s.AllowCacheTTL, "authorization-webhook-cache-authorized-ttl",
+		s.AllowCacheTTL,
+		"The duration to cache 'authorized' responses from the webhook authorizer.")
+
+	fs.DurationVar(&s.DenyCacheTTL,
+		"authorization-webhook-cache-unauthorized-ttl", s.DenyCacheTTL,
+		"The duration to cache 'unauthorized' responses from the webhook authorizer.")
+}
+
+func (s *DelegatingAuthorizationOptions) ApplyTo(c *server.AuthorizationInfo) error {
+	if s == nil {
+		c.Authorizer = authorizerfactory.NewAlwaysAllowAuthorizer()
+		return nil
+	}
+
+	cfg, err := s.ToAuthorizationConfig()
+	if err != nil {
+		return err
+	}
+	authorizer, err := cfg.New()
+	if err != nil {
+		return err
+	}
+
+	c.Authorizer = authorizer
+	return nil
+}
+
+func (s *DelegatingAuthorizationOptions) ToAuthorizationConfig() (authorizerfactory.DelegatingAuthorizerConfig, error) {
+	sarClient, err := s.newSubjectAccessReview()
+	if err != nil {
+		return authorizerfactory.DelegatingAuthorizerConfig{}, err
+	}
+
+	ret := authorizerfactory.DelegatingAuthorizerConfig{
+		SubjectAccessReviewClient: sarClient,
+		AllowCacheTTL:             s.AllowCacheTTL,
+		DenyCacheTTL:              s.DenyCacheTTL,
+	}
+	return ret, nil
+}
+
+func (s *DelegatingAuthorizationOptions) newSubjectAccessReview() (authorizationclient.SubjectAccessReviewInterface, error) {
+	var clientConfig *rest.Config
+	var err error
+	if len(s.RemoteKubeConfigFile) > 0 {
+		loadingRules := &clientcmd.ClientConfigLoadingRules{ExplicitPath: s.RemoteKubeConfigFile}
+		loader := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, &clientcmd.ConfigOverrides{})
+
+		clientConfig, err = loader.ClientConfig()
+
+	} else {
+		// without the remote kubeconfig file, try to use the in-cluster config.  Most addon API servers will
+		// use this path
+		clientConfig, err = rest.InClusterConfig()
+	}
+	if err != nil {
+		return nil, err
+	}
+
+	// set high qps/burst limits since this will effectively limit API server responsiveness
+	clientConfig.QPS = 200
+	clientConfig.Burst = 400
+
+	client, err := authorizationclient.NewForConfig(clientConfig)
+	if err != nil {
+		return nil, err
+	}
+
+	return client.SubjectAccessReviews(), nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/coreapi.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/coreapi.go
new file mode 100644
index 0000000..d46dece
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/coreapi.go
@@ -0,0 +1,84 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package options
+
+import (
+	"fmt"
+	"time"
+
+	"github.com/spf13/pflag"
+	"k8s.io/apiserver/pkg/server"
+	clientgoinformers "k8s.io/client-go/informers"
+	clientgoclientset "k8s.io/client-go/kubernetes"
+	"k8s.io/client-go/rest"
+	"k8s.io/client-go/tools/clientcmd"
+)
+
+// CoreAPIOptions contains options to configure the connection to a core API Kubernetes apiserver.
+type CoreAPIOptions struct {
+	// CoreAPIKubeconfigPath is a filename for a kubeconfig file to contact the core API server with.
+	// If it is not set, the in cluster config is used.
+	CoreAPIKubeconfigPath string
+}
+
+func NewCoreAPIOptions() *CoreAPIOptions {
+	return &CoreAPIOptions{}
+}
+
+func (o *CoreAPIOptions) AddFlags(fs *pflag.FlagSet) {
+	if o == nil {
+		return
+	}
+
+	fs.StringVar(&o.CoreAPIKubeconfigPath, "kubeconfig", o.CoreAPIKubeconfigPath,
+		"kubeconfig file pointing at the 'core' kubernetes server.")
+}
+
+func (o *CoreAPIOptions) ApplyTo(config *server.RecommendedConfig) error {
+	if o == nil {
+		return nil
+	}
+
+	// create shared informer for Kubernetes APIs
+	var kubeconfig *rest.Config
+	var err error
+	if len(o.CoreAPIKubeconfigPath) > 0 {
+		loadingRules := &clientcmd.ClientConfigLoadingRules{ExplicitPath: o.CoreAPIKubeconfigPath}
+		loader := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, &clientcmd.ConfigOverrides{})
+		kubeconfig, err = loader.ClientConfig()
+		if err != nil {
+			return fmt.Errorf("failed to load kubeconfig at %q: %v", o.CoreAPIKubeconfigPath, err)
+		}
+	} else {
+		kubeconfig, err = rest.InClusterConfig()
+		if err != nil {
+			return err
+		}
+	}
+	clientgoExternalClient, err := clientgoclientset.NewForConfig(kubeconfig)
+	if err != nil {
+		return fmt.Errorf("failed to create Kubernetes clientset: %v", err)
+	}
+	config.ClientConfig = kubeconfig
+	config.SharedInformerFactory = clientgoinformers.NewSharedInformerFactory(clientgoExternalClient, 10*time.Minute)
+
+	return nil
+}
+
+func (o *CoreAPIOptions) Validate() []error {
+	return nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/doc.go
new file mode 100644
index 0000000..426336b
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/doc.go
@@ -0,0 +1,21 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+// package options is the public flags and options used by a generic api
+// server. It takes a minimal set of dependencies and does not reference
+// implementations, in order to ensure it may be reused by multiple components
+// (such as CLI commands that wish to generate or validate config).
+package options // import "k8s.io/apiserver/pkg/server/options"
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/etcd.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/etcd.go
new file mode 100644
index 0000000..36f5ff5
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/etcd.go
@@ -0,0 +1,304 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package options
+
+import (
+	"fmt"
+	"net/http"
+	"strconv"
+	"strings"
+	"time"
+
+	"github.com/spf13/pflag"
+
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apimachinery/pkg/util/sets"
+	"k8s.io/apiserver/pkg/registry/generic"
+	genericregistry "k8s.io/apiserver/pkg/registry/generic/registry"
+	"k8s.io/apiserver/pkg/server"
+	"k8s.io/apiserver/pkg/server/healthz"
+	serverstorage "k8s.io/apiserver/pkg/server/storage"
+	"k8s.io/apiserver/pkg/storage/etcd3/preflight"
+	"k8s.io/apiserver/pkg/storage/storagebackend"
+)
+
+type EtcdOptions struct {
+	// The value of Paging on StorageConfig will be overridden by the
+	// calculated feature gate value.
+	StorageConfig                    storagebackend.Config
+	EncryptionProviderConfigFilepath string
+
+	EtcdServersOverrides []string
+
+	// To enable protobuf as storage format, it is enough
+	// to set it to "application/vnd.kubernetes.protobuf".
+	DefaultStorageMediaType string
+	DeleteCollectionWorkers int
+	EnableGarbageCollection bool
+
+	// Set EnableWatchCache to false to disable all watch caches
+	EnableWatchCache bool
+	// Set DefaultWatchCacheSize to zero to disable watch caches for those resources that have no explicit cache size set
+	DefaultWatchCacheSize int
+	// WatchCacheSizes represents override to a given resource
+	WatchCacheSizes []string
+}
+
+var storageTypes = sets.NewString(
+	storagebackend.StorageTypeUnset,
+	storagebackend.StorageTypeETCD2,
+	storagebackend.StorageTypeETCD3,
+)
+
+func NewEtcdOptions(backendConfig *storagebackend.Config) *EtcdOptions {
+	options := &EtcdOptions{
+		StorageConfig:           *backendConfig,
+		DefaultStorageMediaType: "application/json",
+		DeleteCollectionWorkers: 1,
+		EnableGarbageCollection: true,
+		EnableWatchCache:        true,
+		DefaultWatchCacheSize:   100,
+	}
+	options.StorageConfig.CountMetricPollPeriod = time.Minute
+	return options
+}
+
+func (s *EtcdOptions) Validate() []error {
+	if s == nil {
+		return nil
+	}
+
+	allErrors := []error{}
+	if len(s.StorageConfig.ServerList) == 0 {
+		allErrors = append(allErrors, fmt.Errorf("--etcd-servers must be specified"))
+	}
+
+	if !storageTypes.Has(s.StorageConfig.Type) {
+		allErrors = append(allErrors, fmt.Errorf("--storage-backend invalid, must be 'etcd3' or 'etcd2'. If not specified, it will default to 'etcd3'"))
+	}
+
+	for _, override := range s.EtcdServersOverrides {
+		tokens := strings.Split(override, "#")
+		if len(tokens) != 2 {
+			allErrors = append(allErrors, fmt.Errorf("--etcd-servers-overrides invalid, must be of format: group/resource#servers, where servers are URLs, semicolon separated"))
+			continue
+		}
+
+		apiresource := strings.Split(tokens[0], "/")
+		if len(apiresource) != 2 {
+			allErrors = append(allErrors, fmt.Errorf("--etcd-servers-overrides invalid, must be of format: group/resource#servers, where servers are URLs, semicolon separated"))
+			continue
+		}
+
+	}
+
+	return allErrors
+}
+
+// AddEtcdFlags adds flags related to etcd storage for a specific APIServer to the specified FlagSet
+func (s *EtcdOptions) AddFlags(fs *pflag.FlagSet) {
+	if s == nil {
+		return
+	}
+
+	fs.StringSliceVar(&s.EtcdServersOverrides, "etcd-servers-overrides", s.EtcdServersOverrides, ""+
+		"Per-resource etcd servers overrides, comma separated. The individual override "+
+		"format: group/resource#servers, where servers are URLs, semicolon separated.")
+
+	fs.StringVar(&s.DefaultStorageMediaType, "storage-media-type", s.DefaultStorageMediaType, ""+
+		"The media type to use to store objects in storage. "+
+		"Some resources or storage backends may only support a specific media type and will ignore this setting.")
+	fs.IntVar(&s.DeleteCollectionWorkers, "delete-collection-workers", s.DeleteCollectionWorkers,
+		"Number of workers spawned for DeleteCollection call. These are used to speed up namespace cleanup.")
+
+	fs.BoolVar(&s.EnableGarbageCollection, "enable-garbage-collector", s.EnableGarbageCollection, ""+
+		"Enables the generic garbage collector. MUST be synced with the corresponding flag "+
+		"of the kube-controller-manager.")
+
+	fs.BoolVar(&s.EnableWatchCache, "watch-cache", s.EnableWatchCache,
+		"Enable watch caching in the apiserver")
+
+	fs.IntVar(&s.DefaultWatchCacheSize, "default-watch-cache-size", s.DefaultWatchCacheSize,
+		"Default watch cache size. If zero, watch cache will be disabled for resources that do not have a default watch size set.")
+
+	fs.StringSliceVar(&s.WatchCacheSizes, "watch-cache-sizes", s.WatchCacheSizes, ""+
+		"List of watch cache sizes for every resource (pods, nodes, etc.), comma separated. "+
+		"The individual override format: resource[.group]#size, where resource is lowercase plural (no version), "+
+		"group is optional, and size is a number. It takes effect when watch-cache is enabled. "+
+		"Some resources (replicationcontrollers, endpoints, nodes, pods, services, apiservices.apiregistration.k8s.io) "+
+		"have system defaults set by heuristics, others default to default-watch-cache-size")
+
+	fs.StringVar(&s.StorageConfig.Type, "storage-backend", s.StorageConfig.Type,
+		"The storage backend for persistence. Options: 'etcd3' (default), 'etcd2'.")
+
+	fs.IntVar(&s.StorageConfig.DeserializationCacheSize, "deserialization-cache-size", s.StorageConfig.DeserializationCacheSize,
+		"Number of deserialized json objects to cache in memory.")
+
+	fs.StringSliceVar(&s.StorageConfig.ServerList, "etcd-servers", s.StorageConfig.ServerList,
+		"List of etcd servers to connect with (scheme://ip:port), comma separated.")
+
+	fs.StringVar(&s.StorageConfig.Prefix, "etcd-prefix", s.StorageConfig.Prefix,
+		"The prefix to prepend to all resource paths in etcd.")
+
+	fs.StringVar(&s.StorageConfig.KeyFile, "etcd-keyfile", s.StorageConfig.KeyFile,
+		"SSL key file used to secure etcd communication.")
+
+	fs.StringVar(&s.StorageConfig.CertFile, "etcd-certfile", s.StorageConfig.CertFile,
+		"SSL certification file used to secure etcd communication.")
+
+	fs.StringVar(&s.StorageConfig.CAFile, "etcd-cafile", s.StorageConfig.CAFile,
+		"SSL Certificate Authority file used to secure etcd communication.")
+
+	fs.BoolVar(&s.StorageConfig.Quorum, "etcd-quorum-read", s.StorageConfig.Quorum,
+		"If true, enable quorum read. It defaults to true and is strongly recommended not setting to false.")
+	fs.MarkDeprecated("etcd-quorum-read", "This flag is deprecated and the ability to switch off quorum read will be removed in a future release.")
+
+	fs.StringVar(&s.EncryptionProviderConfigFilepath, "experimental-encryption-provider-config", s.EncryptionProviderConfigFilepath,
+		"The file containing configuration for encryption providers to be used for storing secrets in etcd")
+
+	fs.DurationVar(&s.StorageConfig.CompactionInterval, "etcd-compaction-interval", s.StorageConfig.CompactionInterval,
+		"The interval of compaction requests. If 0, the compaction request from apiserver is disabled.")
+
+	fs.DurationVar(&s.StorageConfig.CountMetricPollPeriod, "etcd-count-metric-poll-period", s.StorageConfig.CountMetricPollPeriod, ""+
+		"Frequency of polling etcd for number of resources per type. 0 disables the metric collection.")
+}
+
+func (s *EtcdOptions) ApplyTo(c *server.Config) error {
+	if s == nil {
+		return nil
+	}
+
+	s.addEtcdHealthEndpoint(c)
+	c.RESTOptionsGetter = &SimpleRestOptionsFactory{Options: *s}
+	return nil
+}
+
+func (s *EtcdOptions) ApplyWithStorageFactoryTo(factory serverstorage.StorageFactory, c *server.Config) error {
+	s.addEtcdHealthEndpoint(c)
+	c.RESTOptionsGetter = &storageFactoryRestOptionsFactory{Options: *s, StorageFactory: factory}
+	return nil
+}
+
+func (s *EtcdOptions) addEtcdHealthEndpoint(c *server.Config) {
+	c.HealthzChecks = append(c.HealthzChecks, healthz.NamedCheck("etcd", func(r *http.Request) error {
+		done, err := preflight.EtcdConnection{ServerList: s.StorageConfig.ServerList}.CheckEtcdServers()
+		if !done {
+			return fmt.Errorf("etcd failed")
+		}
+		if err != nil {
+			return err
+		}
+		return nil
+	}))
+}
+
+type SimpleRestOptionsFactory struct {
+	Options EtcdOptions
+}
+
+func (f *SimpleRestOptionsFactory) GetRESTOptions(resource schema.GroupResource) (generic.RESTOptions, error) {
+	ret := generic.RESTOptions{
+		StorageConfig:           &f.Options.StorageConfig,
+		Decorator:               generic.UndecoratedStorage,
+		EnableGarbageCollection: f.Options.EnableGarbageCollection,
+		DeleteCollectionWorkers: f.Options.DeleteCollectionWorkers,
+		ResourcePrefix:          resource.Group + "/" + resource.Resource,
+		CountMetricPollPeriod:   f.Options.StorageConfig.CountMetricPollPeriod,
+	}
+	if f.Options.EnableWatchCache {
+		sizes, err := ParseWatchCacheSizes(f.Options.WatchCacheSizes)
+		if err != nil {
+			return generic.RESTOptions{}, err
+		}
+		cacheSize, ok := sizes[resource]
+		if !ok {
+			cacheSize = f.Options.DefaultWatchCacheSize
+		}
+		ret.Decorator = genericregistry.StorageWithCacher(cacheSize)
+	}
+	return ret, nil
+}
+
+type storageFactoryRestOptionsFactory struct {
+	Options        EtcdOptions
+	StorageFactory serverstorage.StorageFactory
+}
+
+func (f *storageFactoryRestOptionsFactory) GetRESTOptions(resource schema.GroupResource) (generic.RESTOptions, error) {
+	storageConfig, err := f.StorageFactory.NewConfig(resource)
+	if err != nil {
+		return generic.RESTOptions{}, fmt.Errorf("unable to find storage destination for %v, due to %v", resource, err.Error())
+	}
+
+	ret := generic.RESTOptions{
+		StorageConfig:           storageConfig,
+		Decorator:               generic.UndecoratedStorage,
+		DeleteCollectionWorkers: f.Options.DeleteCollectionWorkers,
+		EnableGarbageCollection: f.Options.EnableGarbageCollection,
+		ResourcePrefix:          f.StorageFactory.ResourcePrefix(resource),
+		CountMetricPollPeriod:   f.Options.StorageConfig.CountMetricPollPeriod,
+	}
+	if f.Options.EnableWatchCache {
+		sizes, err := ParseWatchCacheSizes(f.Options.WatchCacheSizes)
+		if err != nil {
+			return generic.RESTOptions{}, err
+		}
+		cacheSize, ok := sizes[resource]
+		if !ok {
+			cacheSize = f.Options.DefaultWatchCacheSize
+		}
+		ret.Decorator = genericregistry.StorageWithCacher(cacheSize)
+	}
+
+	return ret, nil
+}
+
+// ParseWatchCacheSizes turns a list of cache size values into a map of group resources
+// to requested sizes.
+func ParseWatchCacheSizes(cacheSizes []string) (map[schema.GroupResource]int, error) {
+	watchCacheSizes := make(map[schema.GroupResource]int)
+	for _, c := range cacheSizes {
+		tokens := strings.Split(c, "#")
+		if len(tokens) != 2 {
+			return nil, fmt.Errorf("invalid value of watch cache size: %s", c)
+		}
+
+		size, err := strconv.Atoi(tokens[1])
+		if err != nil {
+			return nil, fmt.Errorf("invalid size of watch cache size: %s", c)
+		}
+		if size < 0 {
+			return nil, fmt.Errorf("watch cache size cannot be negative: %s", c)
+		}
+
+		watchCacheSizes[schema.ParseGroupResource(tokens[0])] = size
+	}
+	return watchCacheSizes, nil
+}
+
+// WriteWatchCacheSizes turns a map of cache size values into a list of string specifications.
+func WriteWatchCacheSizes(watchCacheSizes map[schema.GroupResource]int) ([]string, error) {
+	var cacheSizes []string
+
+	for resource, size := range watchCacheSizes {
+		if size < 0 {
+			return nil, fmt.Errorf("watch cache size cannot be negative for resource %s", resource)
+		}
+		cacheSizes = append(cacheSizes, fmt.Sprintf("%s#%d", resource.String(), size))
+	}
+	return cacheSizes, nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/feature.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/feature.go
new file mode 100644
index 0000000..7e02a18
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/feature.go
@@ -0,0 +1,74 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package options
+
+import (
+	"github.com/spf13/pflag"
+
+	"k8s.io/apimachinery/pkg/runtime/serializer"
+	"k8s.io/apiserver/pkg/server"
+)
+
+type FeatureOptions struct {
+	EnableProfiling           bool
+	EnableContentionProfiling bool
+	EnableSwaggerUI           bool
+}
+
+func NewFeatureOptions() *FeatureOptions {
+	defaults := server.NewConfig(serializer.CodecFactory{})
+
+	return &FeatureOptions{
+		EnableProfiling:           defaults.EnableProfiling,
+		EnableContentionProfiling: defaults.EnableContentionProfiling,
+		EnableSwaggerUI:           defaults.EnableSwaggerUI,
+	}
+}
+
+func (o *FeatureOptions) AddFlags(fs *pflag.FlagSet) {
+	if o == nil {
+		return
+	}
+
+	fs.BoolVar(&o.EnableProfiling, "profiling", o.EnableProfiling,
+		"Enable profiling via web interface host:port/debug/pprof/")
+	fs.BoolVar(&o.EnableContentionProfiling, "contention-profiling", o.EnableContentionProfiling,
+		"Enable lock contention profiling, if profiling is enabled")
+	fs.BoolVar(&o.EnableSwaggerUI, "enable-swagger-ui", o.EnableSwaggerUI,
+		"Enables swagger ui on the apiserver at /swagger-ui")
+}
+
+func (o *FeatureOptions) ApplyTo(c *server.Config) error {
+	if o == nil {
+		return nil
+	}
+
+	c.EnableProfiling = o.EnableProfiling
+	c.EnableContentionProfiling = o.EnableContentionProfiling
+	c.EnableSwaggerUI = o.EnableSwaggerUI
+
+	return nil
+}
+
+func (o *FeatureOptions) Validate() []error {
+	if o == nil {
+		return nil
+	}
+
+	errs := []error{}
+	return errs
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/recommended.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/recommended.go
new file mode 100644
index 0000000..ebd750c
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/recommended.go
@@ -0,0 +1,125 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package options
+
+import (
+	"github.com/spf13/pflag"
+
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apiserver/pkg/admission"
+	"k8s.io/apiserver/pkg/server"
+	"k8s.io/apiserver/pkg/storage/storagebackend"
+)
+
+// RecommendedOptions contains the recommended options for running an API server.
+// If you add something to this list, it should be in a logical grouping.
+// Each of them can be nil to leave the feature unconfigured on ApplyTo.
+type RecommendedOptions struct {
+	Etcd           *EtcdOptions
+	SecureServing  *SecureServingOptionsWithLoopback
+	Authentication *DelegatingAuthenticationOptions
+	Authorization  *DelegatingAuthorizationOptions
+	Audit          *AuditOptions
+	Features       *FeatureOptions
+	CoreAPI        *CoreAPIOptions
+
+	// ExtraAdmissionInitializers is called once after all ApplyTo from the options above, to pass the returned
+	// admission plugin initializers to Admission.ApplyTo.
+	ExtraAdmissionInitializers func(c *server.RecommendedConfig) ([]admission.PluginInitializer, error)
+	Admission                  *AdmissionOptions
+}
+
+func NewRecommendedOptions(prefix string, codec runtime.Codec) *RecommendedOptions {
+	sso := NewSecureServingOptions()
+
+	// We are composing recommended options for an aggregated api-server,
+	// whose client is typically a proxy multiplexing many operations ---
+	// notably including long-running ones --- into one HTTP/2 connection
+	// into this server.  So allow many concurrent operations.
+	sso.HTTP2MaxStreamsPerConnection = 1000
+
+	return &RecommendedOptions{
+		Etcd:                       NewEtcdOptions(storagebackend.NewDefaultConfig(prefix, codec)),
+		SecureServing:              WithLoopback(sso),
+		Authentication:             NewDelegatingAuthenticationOptions(),
+		Authorization:              NewDelegatingAuthorizationOptions(),
+		Audit:                      NewAuditOptions(),
+		Features:                   NewFeatureOptions(),
+		CoreAPI:                    NewCoreAPIOptions(),
+		ExtraAdmissionInitializers: func(c *server.RecommendedConfig) ([]admission.PluginInitializer, error) { return nil, nil },
+		Admission:                  NewAdmissionOptions(),
+	}
+}
+
+func (o *RecommendedOptions) AddFlags(fs *pflag.FlagSet) {
+	o.Etcd.AddFlags(fs)
+	o.SecureServing.AddFlags(fs)
+	o.Authentication.AddFlags(fs)
+	o.Authorization.AddFlags(fs)
+	o.Audit.AddFlags(fs)
+	o.Features.AddFlags(fs)
+	o.CoreAPI.AddFlags(fs)
+	o.Admission.AddFlags(fs)
+}
+
+// ApplyTo adds RecommendedOptions to the server configuration.
+// scheme is the scheme of the apiserver types that are sent to the admission chain.
+// pluginInitializers can be empty, it is only need for additional initializers.
+func (o *RecommendedOptions) ApplyTo(config *server.RecommendedConfig, scheme *runtime.Scheme) error {
+	if err := o.Etcd.ApplyTo(&config.Config); err != nil {
+		return err
+	}
+	if err := o.SecureServing.ApplyTo(&config.Config); err != nil {
+		return err
+	}
+	if err := o.Authentication.ApplyTo(&config.Config.Authentication, config.SecureServing, config.OpenAPIConfig); err != nil {
+		return err
+	}
+	if err := o.Authorization.ApplyTo(&config.Config.Authorization); err != nil {
+		return err
+	}
+	if err := o.Audit.ApplyTo(&config.Config); err != nil {
+		return err
+	}
+	if err := o.Features.ApplyTo(&config.Config); err != nil {
+		return err
+	}
+	if err := o.CoreAPI.ApplyTo(config); err != nil {
+		return err
+	}
+	if initializers, err := o.ExtraAdmissionInitializers(config); err != nil {
+		return err
+	} else if err := o.Admission.ApplyTo(&config.Config, config.SharedInformerFactory, config.ClientConfig, scheme, initializers...); err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (o *RecommendedOptions) Validate() []error {
+	errors := []error{}
+	errors = append(errors, o.Etcd.Validate()...)
+	errors = append(errors, o.SecureServing.Validate()...)
+	errors = append(errors, o.Authentication.Validate()...)
+	errors = append(errors, o.Authorization.Validate()...)
+	errors = append(errors, o.Audit.Validate()...)
+	errors = append(errors, o.Features.Validate()...)
+	errors = append(errors, o.CoreAPI.Validate()...)
+	errors = append(errors, o.Admission.Validate()...)
+
+	return errors
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/server_run_options.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/server_run_options.go
new file mode 100644
index 0000000..fccb24e
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/server_run_options.go
@@ -0,0 +1,158 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package options
+
+import (
+	"fmt"
+	"net"
+	"time"
+
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime/serializer"
+	"k8s.io/apiserver/pkg/server"
+	utilfeature "k8s.io/apiserver/pkg/util/feature"
+
+	// add the generic feature gates
+	_ "k8s.io/apiserver/pkg/features"
+
+	"github.com/spf13/pflag"
+)
+
+// ServerRunOptions contains the options while running a generic api server.
+type ServerRunOptions struct {
+	AdvertiseAddress net.IP
+
+	CorsAllowedOriginList       []string
+	ExternalHost                string
+	MaxRequestsInFlight         int
+	MaxMutatingRequestsInFlight int
+	RequestTimeout              time.Duration
+	MinRequestTimeout           int
+	TargetRAMMB                 int
+}
+
+func NewServerRunOptions() *ServerRunOptions {
+	defaults := server.NewConfig(serializer.CodecFactory{})
+	return &ServerRunOptions{
+		MaxRequestsInFlight:         defaults.MaxRequestsInFlight,
+		MaxMutatingRequestsInFlight: defaults.MaxMutatingRequestsInFlight,
+		RequestTimeout:              defaults.RequestTimeout,
+		MinRequestTimeout:           defaults.MinRequestTimeout,
+	}
+}
+
+// ApplyOptions applies the run options to the method receiver and returns self
+func (s *ServerRunOptions) ApplyTo(c *server.Config) error {
+	c.CorsAllowedOriginList = s.CorsAllowedOriginList
+	c.ExternalAddress = s.ExternalHost
+	c.MaxRequestsInFlight = s.MaxRequestsInFlight
+	c.MaxMutatingRequestsInFlight = s.MaxMutatingRequestsInFlight
+	c.RequestTimeout = s.RequestTimeout
+	c.MinRequestTimeout = s.MinRequestTimeout
+	c.PublicAddress = s.AdvertiseAddress
+
+	return nil
+}
+
+// DefaultAdvertiseAddress sets the field AdvertiseAddress if unset. The field will be set based on the SecureServingOptions.
+func (s *ServerRunOptions) DefaultAdvertiseAddress(secure *SecureServingOptions) error {
+	if secure == nil {
+		return nil
+	}
+
+	if s.AdvertiseAddress == nil || s.AdvertiseAddress.IsUnspecified() {
+		hostIP, err := secure.DefaultExternalAddress()
+		if err != nil {
+			return fmt.Errorf("Unable to find suitable network address.error='%v'. "+
+				"Try to set the AdvertiseAddress directly or provide a valid BindAddress to fix this.", err)
+		}
+		s.AdvertiseAddress = hostIP
+	}
+
+	return nil
+}
+
+// Validate checks validation of ServerRunOptions
+func (s *ServerRunOptions) Validate() []error {
+	errors := []error{}
+	if s.TargetRAMMB < 0 {
+		errors = append(errors, fmt.Errorf("--target-ram-mb can not be negative value"))
+	}
+	if s.MaxRequestsInFlight < 0 {
+		errors = append(errors, fmt.Errorf("--max-requests-inflight can not be negative value"))
+	}
+	if s.MaxMutatingRequestsInFlight < 0 {
+		errors = append(errors, fmt.Errorf("--max-mutating-requests-inflight can not be negative value"))
+	}
+
+	if s.RequestTimeout.Nanoseconds() < 0 {
+		errors = append(errors, fmt.Errorf("--request-timeout can not be negative value"))
+	}
+
+	if s.MinRequestTimeout < 0 {
+		errors = append(errors, fmt.Errorf("--min-request-timeout can not be negative value"))
+	}
+
+	return errors
+}
+
+// AddFlags adds flags for a specific APIServer to the specified FlagSet
+func (s *ServerRunOptions) AddUniversalFlags(fs *pflag.FlagSet) {
+	// Note: the weird ""+ in below lines seems to be the only way to get gofmt to
+	// arrange these text blocks sensibly. Grrr.
+
+	fs.IPVar(&s.AdvertiseAddress, "advertise-address", s.AdvertiseAddress, ""+
+		"The IP address on which to advertise the apiserver to members of the cluster. This "+
+		"address must be reachable by the rest of the cluster. If blank, the --bind-address "+
+		"will be used. If --bind-address is unspecified, the host's default interface will "+
+		"be used.")
+
+	fs.StringSliceVar(&s.CorsAllowedOriginList, "cors-allowed-origins", s.CorsAllowedOriginList, ""+
+		"List of allowed origins for CORS, comma separated.  An allowed origin can be a regular "+
+		"expression to support subdomain matching. If this list is empty CORS will not be enabled.")
+
+	fs.IntVar(&s.TargetRAMMB, "target-ram-mb", s.TargetRAMMB,
+		"Memory limit for apiserver in MB (used to configure sizes of caches, etc.)")
+
+	fs.StringVar(&s.ExternalHost, "external-hostname", s.ExternalHost,
+		"The hostname to use when generating externalized URLs for this master (e.g. Swagger API Docs).")
+
+	deprecatedMasterServiceNamespace := metav1.NamespaceDefault
+	fs.StringVar(&deprecatedMasterServiceNamespace, "master-service-namespace", deprecatedMasterServiceNamespace, ""+
+		"DEPRECATED: the namespace from which the kubernetes master services should be injected into pods.")
+
+	fs.IntVar(&s.MaxRequestsInFlight, "max-requests-inflight", s.MaxRequestsInFlight, ""+
+		"The maximum number of non-mutating requests in flight at a given time. When the server exceeds this, "+
+		"it rejects requests. Zero for no limit.")
+
+	fs.IntVar(&s.MaxMutatingRequestsInFlight, "max-mutating-requests-inflight", s.MaxMutatingRequestsInFlight, ""+
+		"The maximum number of mutating requests in flight at a given time. When the server exceeds this, "+
+		"it rejects requests. Zero for no limit.")
+
+	fs.DurationVar(&s.RequestTimeout, "request-timeout", s.RequestTimeout, ""+
+		"An optional field indicating the duration a handler must keep a request open before timing "+
+		"it out. This is the default request timeout for requests but may be overridden by flags such as "+
+		"--min-request-timeout for specific types of requests.")
+
+	fs.IntVar(&s.MinRequestTimeout, "min-request-timeout", s.MinRequestTimeout, ""+
+		"An optional field indicating the minimum number of seconds a handler must keep "+
+		"a request open before timing it out. Currently only honored by the watch request "+
+		"handler, which picks a randomized value above this number as the connection timeout, "+
+		"to spread out load.")
+
+	utilfeature.DefaultFeatureGate.AddFlag(fs)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/serving.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/serving.go
new file mode 100644
index 0000000..5d21da2
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/serving.go
@@ -0,0 +1,297 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package options
+
+import (
+	"crypto/tls"
+	"fmt"
+	"net"
+	"path"
+	"strconv"
+	"strings"
+
+	"github.com/golang/glog"
+	"github.com/spf13/pflag"
+
+	utilnet "k8s.io/apimachinery/pkg/util/net"
+	"k8s.io/apiserver/pkg/server"
+	utilflag "k8s.io/apiserver/pkg/util/flag"
+	certutil "k8s.io/client-go/util/cert"
+)
+
+type SecureServingOptions struct {
+	BindAddress net.IP
+	// BindPort is ignored when Listener is set, will serve https even with 0.
+	BindPort int
+	// BindNetwork is the type of network to bind to - defaults to "tcp", accepts "tcp",
+	// "tcp4", and "tcp6".
+	BindNetwork string
+
+	// Listener is the secure server network listener.
+	// either Listener or BindAddress/BindPort/BindNetwork is set,
+	// if Listener is set, use it and omit BindAddress/BindPort/BindNetwork.
+	Listener net.Listener
+
+	// ServerCert is the TLS cert info for serving secure traffic
+	ServerCert GeneratableKeyCert
+	// SNICertKeys are named CertKeys for serving secure traffic with SNI support.
+	SNICertKeys []utilflag.NamedCertKey
+	// CipherSuites is the list of allowed cipher suites for the server.
+	// Values are from tls package constants (https://golang.org/pkg/crypto/tls/#pkg-constants).
+	CipherSuites []string
+	// MinTLSVersion is the minimum TLS version supported.
+	// Values are from tls package constants (https://golang.org/pkg/crypto/tls/#pkg-constants).
+	MinTLSVersion string
+
+	// HTTP2MaxStreamsPerConnection is the limit that the api server imposes on each client.
+	// A value of zero means to use the default provided by golang's HTTP/2 support.
+	HTTP2MaxStreamsPerConnection int
+}
+
+type CertKey struct {
+	// CertFile is a file containing a PEM-encoded certificate, and possibly the complete certificate chain
+	CertFile string
+	// KeyFile is a file containing a PEM-encoded private key for the certificate specified by CertFile
+	KeyFile string
+}
+
+type GeneratableKeyCert struct {
+	CertKey CertKey
+
+	// CertDirectory is a directory that will contain the certificates.  If the cert and key aren't specifically set
+	// this will be used to derive a match with the "pair-name"
+	CertDirectory string
+	// PairName is the name which will be used with CertDirectory to make a cert and key names
+	// It becomes CertDirector/PairName.crt and CertDirector/PairName.key
+	PairName string
+}
+
+func NewSecureServingOptions() *SecureServingOptions {
+	return &SecureServingOptions{
+		BindAddress: net.ParseIP("0.0.0.0"),
+		BindPort:    443,
+		ServerCert: GeneratableKeyCert{
+			PairName:      "apiserver",
+			CertDirectory: "apiserver.local.config/certificates",
+		},
+	}
+}
+
+func (s *SecureServingOptions) DefaultExternalAddress() (net.IP, error) {
+	return utilnet.ChooseBindAddress(s.BindAddress)
+}
+
+func (s *SecureServingOptions) Validate() []error {
+	if s == nil {
+		return nil
+	}
+
+	errors := []error{}
+
+	if s.BindPort < 0 || s.BindPort > 65535 {
+		errors = append(errors, fmt.Errorf("--secure-port %v must be between 0 and 65535, inclusive. 0 for turning off secure port", s.BindPort))
+	}
+
+	return errors
+}
+
+func (s *SecureServingOptions) AddFlags(fs *pflag.FlagSet) {
+	if s == nil {
+		return
+	}
+
+	fs.IPVar(&s.BindAddress, "bind-address", s.BindAddress, ""+
+		"The IP address on which to listen for the --secure-port port. The "+
+		"associated interface(s) must be reachable by the rest of the cluster, and by CLI/web "+
+		"clients. If blank, all interfaces will be used (0.0.0.0 for all IPv4 interfaces and :: for all IPv6 interfaces).")
+	fs.IntVar(&s.BindPort, "secure-port", s.BindPort, ""+
+		"The port on which to serve HTTPS with authentication and authorization. If 0, "+
+		"don't serve HTTPS at all.")
+
+	fs.StringVar(&s.ServerCert.CertDirectory, "cert-dir", s.ServerCert.CertDirectory, ""+
+		"The directory where the TLS certs are located. "+
+		"If --tls-cert-file and --tls-private-key-file are provided, this flag will be ignored.")
+
+	fs.StringVar(&s.ServerCert.CertKey.CertFile, "tls-cert-file", s.ServerCert.CertKey.CertFile, ""+
+		"File containing the default x509 Certificate for HTTPS. (CA cert, if any, concatenated "+
+		"after server cert). If HTTPS serving is enabled, and --tls-cert-file and "+
+		"--tls-private-key-file are not provided, a self-signed certificate and key "+
+		"are generated for the public address and saved to the directory specified by --cert-dir.")
+
+	fs.StringVar(&s.ServerCert.CertKey.KeyFile, "tls-private-key-file", s.ServerCert.CertKey.KeyFile,
+		"File containing the default x509 private key matching --tls-cert-file.")
+
+	tlsCipherPossibleValues := utilflag.TLSCipherPossibleValues()
+	fs.StringSliceVar(&s.CipherSuites, "tls-cipher-suites", s.CipherSuites,
+		"Comma-separated list of cipher suites for the server. "+
+			"If omitted, the default Go cipher suites will be use.  "+
+			"Possible values: "+strings.Join(tlsCipherPossibleValues, ","))
+
+	tlsPossibleVersions := utilflag.TLSPossibleVersions()
+	fs.StringVar(&s.MinTLSVersion, "tls-min-version", s.MinTLSVersion,
+		"Minimum TLS version supported. "+
+			"Possible values: "+strings.Join(tlsPossibleVersions, ", "))
+
+	fs.Var(utilflag.NewNamedCertKeyArray(&s.SNICertKeys), "tls-sni-cert-key", ""+
+		"A pair of x509 certificate and private key file paths, optionally suffixed with a list of "+
+		"domain patterns which are fully qualified domain names, possibly with prefixed wildcard "+
+		"segments. If no domain patterns are provided, the names of the certificate are "+
+		"extracted. Non-wildcard matches trump over wildcard matches, explicit domain patterns "+
+		"trump over extracted names. For multiple key/certificate pairs, use the "+
+		"--tls-sni-cert-key multiple times. "+
+		"Examples: \"example.crt,example.key\" or \"foo.crt,foo.key:*.foo.com,foo.com\".")
+
+	fs.IntVar(&s.HTTP2MaxStreamsPerConnection, "http2-max-streams-per-connection", s.HTTP2MaxStreamsPerConnection, ""+
+		"The limit that the server gives to clients for "+
+		"the maximum number of streams in an HTTP/2 connection. "+
+		"Zero means to use golang's default.")
+}
+
+// ApplyTo fills up serving information in the server configuration.
+func (s *SecureServingOptions) ApplyTo(config **server.SecureServingInfo) error {
+	if s == nil {
+		return nil
+	}
+	if s.BindPort <= 0 && s.Listener == nil {
+		return nil
+	}
+
+	if s.Listener == nil {
+		var err error
+		addr := net.JoinHostPort(s.BindAddress.String(), strconv.Itoa(s.BindPort))
+		s.Listener, s.BindPort, err = CreateListener(s.BindNetwork, addr)
+		if err != nil {
+			return fmt.Errorf("failed to create listener: %v", err)
+		}
+	} else {
+		if _, ok := s.Listener.Addr().(*net.TCPAddr); !ok {
+			return fmt.Errorf("failed to parse ip and port from listener")
+		}
+		s.BindPort = s.Listener.Addr().(*net.TCPAddr).Port
+		s.BindAddress = s.Listener.Addr().(*net.TCPAddr).IP
+	}
+
+	*config = &server.SecureServingInfo{
+		Listener:                     s.Listener,
+		HTTP2MaxStreamsPerConnection: s.HTTP2MaxStreamsPerConnection,
+	}
+	c := *config
+
+	serverCertFile, serverKeyFile := s.ServerCert.CertKey.CertFile, s.ServerCert.CertKey.KeyFile
+	// load main cert
+	if len(serverCertFile) != 0 || len(serverKeyFile) != 0 {
+		tlsCert, err := tls.LoadX509KeyPair(serverCertFile, serverKeyFile)
+		if err != nil {
+			return fmt.Errorf("unable to load server certificate: %v", err)
+		}
+		c.Cert = &tlsCert
+	}
+
+	if len(s.CipherSuites) != 0 {
+		cipherSuites, err := utilflag.TLSCipherSuites(s.CipherSuites)
+		if err != nil {
+			return err
+		}
+		c.CipherSuites = cipherSuites
+	}
+
+	var err error
+	c.MinTLSVersion, err = utilflag.TLSVersion(s.MinTLSVersion)
+	if err != nil {
+		return err
+	}
+
+	// load SNI certs
+	namedTLSCerts := make([]server.NamedTLSCert, 0, len(s.SNICertKeys))
+	for _, nck := range s.SNICertKeys {
+		tlsCert, err := tls.LoadX509KeyPair(nck.CertFile, nck.KeyFile)
+		namedTLSCerts = append(namedTLSCerts, server.NamedTLSCert{
+			TLSCert: tlsCert,
+			Names:   nck.Names,
+		})
+		if err != nil {
+			return fmt.Errorf("failed to load SNI cert and key: %v", err)
+		}
+	}
+	c.SNICerts, err = server.GetNamedCertificateMap(namedTLSCerts)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func (s *SecureServingOptions) MaybeDefaultWithSelfSignedCerts(publicAddress string, alternateDNS []string, alternateIPs []net.IP) error {
+	if s == nil {
+		return nil
+	}
+	keyCert := &s.ServerCert.CertKey
+	if len(keyCert.CertFile) != 0 || len(keyCert.KeyFile) != 0 {
+		return nil
+	}
+
+	keyCert.CertFile = path.Join(s.ServerCert.CertDirectory, s.ServerCert.PairName+".crt")
+	keyCert.KeyFile = path.Join(s.ServerCert.CertDirectory, s.ServerCert.PairName+".key")
+
+	canReadCertAndKey, err := certutil.CanReadCertAndKey(keyCert.CertFile, keyCert.KeyFile)
+	if err != nil {
+		return err
+	}
+	if !canReadCertAndKey {
+		// add either the bind address or localhost to the valid alternates
+		bindIP := s.BindAddress.String()
+		if bindIP == "0.0.0.0" {
+			alternateDNS = append(alternateDNS, "localhost")
+		} else {
+			alternateIPs = append(alternateIPs, s.BindAddress)
+		}
+
+		if cert, key, err := certutil.GenerateSelfSignedCertKey(publicAddress, alternateIPs, alternateDNS); err != nil {
+			return fmt.Errorf("unable to generate self signed cert: %v", err)
+		} else {
+			if err := certutil.WriteCert(keyCert.CertFile, cert); err != nil {
+				return err
+			}
+
+			if err := certutil.WriteKey(keyCert.KeyFile, key); err != nil {
+				return err
+			}
+			glog.Infof("Generated self-signed cert (%s, %s)", keyCert.CertFile, keyCert.KeyFile)
+		}
+	}
+
+	return nil
+}
+
+func CreateListener(network, addr string) (net.Listener, int, error) {
+	if len(network) == 0 {
+		network = "tcp"
+	}
+	ln, err := net.Listen(network, addr)
+	if err != nil {
+		return nil, 0, fmt.Errorf("failed to listen on %v: %v", addr, err)
+	}
+
+	// get port
+	tcpAddr, ok := ln.Addr().(*net.TCPAddr)
+	if !ok {
+		ln.Close()
+		return nil, 0, fmt.Errorf("invalid listen address: %q", ln.Addr().String())
+	}
+
+	return ln, tcpAddr.Port, nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/serving_with_loopback.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/serving_with_loopback.go
new file mode 100644
index 0000000..8d249cb
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/options/serving_with_loopback.go
@@ -0,0 +1,79 @@
+/*
+Copyright 2018 The Kubernetes Authors.
+
+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.
+*/
+
+package options
+
+import (
+	"crypto/tls"
+	"fmt"
+
+	"github.com/pborman/uuid"
+
+	"k8s.io/apiserver/pkg/server"
+	certutil "k8s.io/client-go/util/cert"
+)
+
+type SecureServingOptionsWithLoopback struct {
+	*SecureServingOptions
+}
+
+func WithLoopback(o *SecureServingOptions) *SecureServingOptionsWithLoopback {
+	return &SecureServingOptionsWithLoopback{o}
+}
+
+// ApplyTo fills up serving information in the server configuration.
+func (s *SecureServingOptionsWithLoopback) ApplyTo(c *server.Config) error {
+	if s == nil || s.SecureServingOptions == nil {
+		return nil
+	}
+
+	if err := s.SecureServingOptions.ApplyTo(&c.SecureServing); err != nil {
+		return err
+	}
+
+	if c.SecureServing == nil {
+		return nil
+	}
+
+	c.ReadWritePort = s.BindPort
+
+	// create self-signed cert+key with the fake server.LoopbackClientServerNameOverride and
+	// let the server return it when the loopback client connects.
+	certPem, keyPem, err := certutil.GenerateSelfSignedCertKey(server.LoopbackClientServerNameOverride, nil, nil)
+	if err != nil {
+		return fmt.Errorf("failed to generate self-signed certificate for loopback connection: %v", err)
+	}
+	tlsCert, err := tls.X509KeyPair(certPem, keyPem)
+	if err != nil {
+		return fmt.Errorf("failed to generate self-signed certificate for loopback connection: %v", err)
+	}
+
+	secureLoopbackClientConfig, err := c.SecureServing.NewLoopbackClientConfig(uuid.NewRandom().String(), certPem)
+	switch {
+	// if we failed and there's no fallback loopback client config, we need to fail
+	case err != nil && c.LoopbackClientConfig == nil:
+		return err
+
+	// if we failed, but we already have a fallback loopback client config (usually insecure), allow it
+	case err != nil && c.LoopbackClientConfig != nil:
+
+	default:
+		c.LoopbackClientConfig = secureLoopbackClientConfig
+		c.SecureServing.SNICerts[server.LoopbackClientServerNameOverride] = &tlsCert
+	}
+
+	return nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/plugins.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/plugins.go
new file mode 100644
index 0000000..84813aa
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/plugins.go
@@ -0,0 +1,34 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package server
+
+// This file exists to force the desired plugin implementations to be linked into genericapi pkg.
+import (
+	"k8s.io/apiserver/pkg/admission"
+	"k8s.io/apiserver/pkg/admission/plugin/initialization"
+	"k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle"
+	mutatingwebhook "k8s.io/apiserver/pkg/admission/plugin/webhook/mutating"
+	validatingwebhook "k8s.io/apiserver/pkg/admission/plugin/webhook/validating"
+)
+
+// RegisterAllAdmissionPlugins registers all admission plugins
+func RegisterAllAdmissionPlugins(plugins *admission.Plugins) {
+	lifecycle.Register(plugins)
+	initialization.Register(plugins)
+	validatingwebhook.Register(plugins)
+	mutatingwebhook.Register(plugins)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/resourceconfig/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/resourceconfig/doc.go
new file mode 100644
index 0000000..0dae215
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/resourceconfig/doc.go
@@ -0,0 +1,18 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+// Package resourceconfig contains the resource config related helper functions.
+package resourceconfig // import "k8s.io/apiserver/pkg/server/resourceconfig"
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/resourceconfig/helpers.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/resourceconfig/helpers.go
new file mode 100644
index 0000000..cb1c54e
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/resourceconfig/helpers.go
@@ -0,0 +1,164 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package resourceconfig
+
+import (
+	"fmt"
+	"strconv"
+	"strings"
+
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	serverstore "k8s.io/apiserver/pkg/server/storage"
+	utilflag "k8s.io/apiserver/pkg/util/flag"
+)
+
+// GroupVersionRegistry provides access to registered group versions.
+type GroupVersionRegistry interface {
+	// IsGroupRegistered returns true if given group is registered.
+	IsGroupRegistered(group string) bool
+	// IsVersionRegistered returns true if given version is registered.
+	IsVersionRegistered(v schema.GroupVersion) bool
+	// PrioritizedVersionsAllGroups returns all registered group versions.
+	PrioritizedVersionsAllGroups() []schema.GroupVersion
+}
+
+// MergeResourceEncodingConfigs merges the given defaultResourceConfig with specific GroupVersionResource overrides.
+func MergeResourceEncodingConfigs(
+	defaultResourceEncoding *serverstore.DefaultResourceEncodingConfig,
+	resourceEncodingOverrides []schema.GroupVersionResource,
+) *serverstore.DefaultResourceEncodingConfig {
+	resourceEncodingConfig := defaultResourceEncoding
+	for _, gvr := range resourceEncodingOverrides {
+		resourceEncodingConfig.SetResourceEncoding(gvr.GroupResource(), gvr.GroupVersion(),
+			schema.GroupVersion{Group: gvr.Group, Version: runtime.APIVersionInternal})
+	}
+	return resourceEncodingConfig
+}
+
+// MergeGroupEncodingConfigs merges the given defaultResourceConfig with specific GroupVersion overrides.
+func MergeGroupEncodingConfigs(
+	defaultResourceEncoding *serverstore.DefaultResourceEncodingConfig,
+	storageEncodingOverrides map[string]schema.GroupVersion,
+) *serverstore.DefaultResourceEncodingConfig {
+	resourceEncodingConfig := defaultResourceEncoding
+	for group, storageEncodingVersion := range storageEncodingOverrides {
+		resourceEncodingConfig.SetVersionEncoding(group, storageEncodingVersion, schema.GroupVersion{Group: group, Version: runtime.APIVersionInternal})
+	}
+	return resourceEncodingConfig
+}
+
+// MergeAPIResourceConfigs merges the given defaultAPIResourceConfig with the given resourceConfigOverrides.
+// Exclude the groups not registered in registry, and check if version is
+// not registered in group, then it will fail.
+func MergeAPIResourceConfigs(
+	defaultAPIResourceConfig *serverstore.ResourceConfig,
+	resourceConfigOverrides utilflag.ConfigurationMap,
+	registry GroupVersionRegistry,
+) (*serverstore.ResourceConfig, error) {
+	resourceConfig := defaultAPIResourceConfig
+	overrides := resourceConfigOverrides
+
+	// "api/all=false" allows users to selectively enable specific api versions.
+	allAPIFlagValue, ok := overrides["api/all"]
+	if ok {
+		if allAPIFlagValue == "false" {
+			// Disable all group versions.
+			resourceConfig.DisableAll()
+		} else if allAPIFlagValue == "true" {
+			resourceConfig.EnableAll()
+		}
+	}
+
+	// "<resourceSpecifier>={true|false} allows users to enable/disable API.
+	// This takes preference over api/all, if specified.
+	// Iterate through all group/version overrides specified in runtimeConfig.
+	for key := range overrides {
+		// Have already handled them above. Can skip them here.
+		if key == "api/all" {
+			continue
+		}
+
+		tokens := strings.Split(key, "/")
+		if len(tokens) != 2 {
+			continue
+		}
+		groupVersionString := tokens[0] + "/" + tokens[1]
+		groupVersion, err := schema.ParseGroupVersion(groupVersionString)
+		if err != nil {
+			return nil, fmt.Errorf("invalid key %s", key)
+		}
+
+		// Exclude group not registered into the registry.
+		if !registry.IsGroupRegistered(groupVersion.Group) {
+			continue
+		}
+
+		// Verify that the groupVersion is registered into registry.
+		if !registry.IsVersionRegistered(groupVersion) {
+			return nil, fmt.Errorf("group version %s that has not been registered", groupVersion.String())
+		}
+		enabled, err := getRuntimeConfigValue(overrides, key, false)
+		if err != nil {
+			return nil, err
+		}
+		if enabled {
+			resourceConfig.EnableVersions(groupVersion)
+		} else {
+			resourceConfig.DisableVersions(groupVersion)
+		}
+	}
+
+	return resourceConfig, nil
+}
+
+func getRuntimeConfigValue(overrides utilflag.ConfigurationMap, apiKey string, defaultValue bool) (bool, error) {
+	flagValue, ok := overrides[apiKey]
+	if ok {
+		if flagValue == "" {
+			return true, nil
+		}
+		boolValue, err := strconv.ParseBool(flagValue)
+		if err != nil {
+			return false, fmt.Errorf("invalid value of %s: %s, err: %v", apiKey, flagValue, err)
+		}
+		return boolValue, nil
+	}
+	return defaultValue, nil
+}
+
+// ParseGroups takes in resourceConfig and returns parsed groups.
+func ParseGroups(resourceConfig utilflag.ConfigurationMap) ([]string, error) {
+	groups := []string{}
+	for key := range resourceConfig {
+		if key == "api/all" {
+			continue
+		}
+		tokens := strings.Split(key, "/")
+		if len(tokens) != 2 && len(tokens) != 3 {
+			return groups, fmt.Errorf("runtime-config invalid key %s", key)
+		}
+		groupVersionString := tokens[0] + "/" + tokens[1]
+		groupVersion, err := schema.ParseGroupVersion(groupVersionString)
+		if err != nil {
+			return nil, fmt.Errorf("runtime-config invalid key %s", key)
+		}
+		groups = append(groups, groupVersion.Group)
+	}
+
+	return groups, nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/routes/OWNERS b/metrics-server/vendor/k8s.io/apiserver/pkg/server/routes/OWNERS
new file mode 100755
index 0000000..9d268c4
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/routes/OWNERS
@@ -0,0 +1,2 @@
+reviewers:
+- sttts
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/routes/data/swagger/datafile.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/routes/data/swagger/datafile.go
new file mode 100644
index 0000000..619809e
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/routes/data/swagger/datafile.go
@@ -0,0 +1,17087 @@
+/*
+Copyright The Kubernetes Authors.
+
+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.
+*/
+
+// generated by hack/build-ui.sh; DO NOT EDIT
+
+// Code generated by go-bindata.
+// sources:
+// third_party/swagger-ui/LICENSE
+// third_party/swagger-ui/README.md
+// third_party/swagger-ui/css/reset.css
+// third_party/swagger-ui/css/screen.css
+// third_party/swagger-ui/css/typography.css
+// third_party/swagger-ui/fonts/droid-sans-v6-latin-700.eot
+// third_party/swagger-ui/fonts/droid-sans-v6-latin-700.svg
+// third_party/swagger-ui/fonts/droid-sans-v6-latin-700.ttf
+// third_party/swagger-ui/fonts/droid-sans-v6-latin-700.woff
+// third_party/swagger-ui/fonts/droid-sans-v6-latin-700.woff2
+// third_party/swagger-ui/fonts/droid-sans-v6-latin-regular.eot
+// third_party/swagger-ui/fonts/droid-sans-v6-latin-regular.svg
+// third_party/swagger-ui/fonts/droid-sans-v6-latin-regular.ttf
+// third_party/swagger-ui/fonts/droid-sans-v6-latin-regular.woff
+// third_party/swagger-ui/fonts/droid-sans-v6-latin-regular.woff2
+// third_party/swagger-ui/images/explorer_icons.png
+// third_party/swagger-ui/images/logo_small.png
+// third_party/swagger-ui/images/pet_store_api.png
+// third_party/swagger-ui/images/throbber.gif
+// third_party/swagger-ui/images/wordnik_api.png
+// third_party/swagger-ui/index.html
+// third_party/swagger-ui/lib/backbone-min.js
+// third_party/swagger-ui/lib/handlebars-1.0.0.js
+// third_party/swagger-ui/lib/handlebars-2.0.0.js
+// third_party/swagger-ui/lib/highlight.7.3.pack.js
+// third_party/swagger-ui/lib/jquery-1.8.0.min.js
+// third_party/swagger-ui/lib/jquery.ba-bbq.min.js
+// third_party/swagger-ui/lib/jquery.slideto.min.js
+// third_party/swagger-ui/lib/jquery.wiggle.min.js
+// third_party/swagger-ui/lib/marked.js
+// third_party/swagger-ui/lib/shred/content.js
+// third_party/swagger-ui/lib/shred.bundle.js
+// third_party/swagger-ui/lib/swagger-client.js
+// third_party/swagger-ui/lib/swagger-oauth.js
+// third_party/swagger-ui/lib/swagger.js
+// third_party/swagger-ui/lib/underscore-min.js
+// third_party/swagger-ui/o2c.html
+// third_party/swagger-ui/swagger-ui.js
+// third_party/swagger-ui/swagger-ui.min.js
+// DO NOT EDIT!
+
+package swagger
+
+import (
+	"fmt"
+	"io/ioutil"
+	"os"
+	"path/filepath"
+	"strings"
+	"time"
+)
+
+type asset struct {
+	bytes []byte
+	info  os.FileInfo
+}
+
+type bindataFileInfo struct {
+	name    string
+	size    int64
+	mode    os.FileMode
+	modTime time.Time
+}
+
+func (fi bindataFileInfo) Name() string {
+	return fi.name
+}
+func (fi bindataFileInfo) Size() int64 {
+	return fi.size
+}
+func (fi bindataFileInfo) Mode() os.FileMode {
+	return fi.mode
+}
+func (fi bindataFileInfo) ModTime() time.Time {
+	return fi.modTime
+}
+func (fi bindataFileInfo) IsDir() bool {
+	return false
+}
+func (fi bindataFileInfo) Sys() interface{} {
+	return nil
+}
+
+var _third_partySwaggerUiLicense = []byte(`Copyright 2014 Reverb Technologies, Inc.
+
+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 [apache.org/licenses/LICENSE-2.0](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.
+`)
+
+func third_partySwaggerUiLicenseBytes() ([]byte, error) {
+	return _third_partySwaggerUiLicense, nil
+}
+
+func third_partySwaggerUiLicense() (*asset, error) {
+	bytes, err := third_partySwaggerUiLicenseBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/LICENSE", size: 596, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiReadmeMd = []byte(`# Readme
+
+URL: https://github.com/swagger-api/swagger-ui/tree/master/dist
+License: Apache License, Version 2.0
+License File: LICENSE
+
+## Description
+Files from dist folder of https://github.com/swagger-api/swagger-ui.
+These are dependency-free collection of HTML, Javascript, and CSS assets that
+dynamically generate beautiful documentation and sandbox from a
+Swagger-compliant API.
+Instructions on how to use these:
+https://github.com/swagger-api/swagger-ui#how-to-use-it
+
+## Local Modifications
+- Updated the url in index.html to "../../swaggerapi" as per instructions at:
+https://github.com/swagger-api/swagger-ui#how-to-use-it
+- Modified swagger-ui.js to list resources and operations in sorted order: https://github.com/kubernetes/kubernetes/pull/3421
+- Set supportedSubmitMethods: [] in index.html to remove "Try it out" buttons.
+- Remove the url query param to fix XSS issue:
+  https://github.com/kubernetes/kubernetes/pull/23234
+
+LICENSE file has been created for compliance purposes.
+Not included in original distribution.
+`)
+
+func third_partySwaggerUiReadmeMdBytes() ([]byte, error) {
+	return _third_partySwaggerUiReadmeMd, nil
+}
+
+func third_partySwaggerUiReadmeMd() (*asset, error) {
+	bytes, err := third_partySwaggerUiReadmeMdBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/README.md", size: 1032, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiCssResetCss = []byte(`/* http://meyerweb.com/eric/tools/css/reset/ v2.0 | 20110126 */
+html,
+body,
+div,
+span,
+applet,
+object,
+iframe,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+p,
+blockquote,
+pre,
+a,
+abbr,
+acronym,
+address,
+big,
+cite,
+code,
+del,
+dfn,
+em,
+img,
+ins,
+kbd,
+q,
+s,
+samp,
+small,
+strike,
+strong,
+sub,
+sup,
+tt,
+var,
+b,
+u,
+i,
+center,
+dl,
+dt,
+dd,
+ol,
+ul,
+li,
+fieldset,
+form,
+label,
+legend,
+table,
+caption,
+tbody,
+tfoot,
+thead,
+tr,
+th,
+td,
+article,
+aside,
+canvas,
+details,
+embed,
+figure,
+figcaption,
+footer,
+header,
+hgroup,
+menu,
+nav,
+output,
+ruby,
+section,
+summary,
+time,
+mark,
+audio,
+video {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  font-size: 100%;
+  font: inherit;
+  vertical-align: baseline;
+}
+/* HTML5 display-role reset for older browsers */
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+menu,
+nav,
+section {
+  display: block;
+}
+body {
+  line-height: 1;
+}
+ol,
+ul {
+  list-style: none;
+}
+blockquote,
+q {
+  quotes: none;
+}
+blockquote:before,
+blockquote:after,
+q:before,
+q:after {
+  content: '';
+  content: none;
+}
+table {
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+`)
+
+func third_partySwaggerUiCssResetCssBytes() ([]byte, error) {
+	return _third_partySwaggerUiCssResetCss, nil
+}
+
+func third_partySwaggerUiCssResetCss() (*asset, error) {
+	bytes, err := third_partySwaggerUiCssResetCssBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/css/reset.css", size: 1066, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiCssScreenCss = []byte(`/* Original style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac@SoftwareManiacs.Org> */
+.swagger-section pre code {
+  display: block;
+  padding: 0.5em;
+  background: #F0F0F0;
+}
+.swagger-section pre code,
+.swagger-section pre .subst,
+.swagger-section pre .tag .title,
+.swagger-section pre .lisp .title,
+.swagger-section pre .clojure .built_in,
+.swagger-section pre .nginx .title {
+  color: black;
+}
+.swagger-section pre .string,
+.swagger-section pre .title,
+.swagger-section pre .constant,
+.swagger-section pre .parent,
+.swagger-section pre .tag .value,
+.swagger-section pre .rules .value,
+.swagger-section pre .rules .value .number,
+.swagger-section pre .preprocessor,
+.swagger-section pre .ruby .symbol,
+.swagger-section pre .ruby .symbol .string,
+.swagger-section pre .aggregate,
+.swagger-section pre .template_tag,
+.swagger-section pre .django .variable,
+.swagger-section pre .smalltalk .class,
+.swagger-section pre .addition,
+.swagger-section pre .flow,
+.swagger-section pre .stream,
+.swagger-section pre .bash .variable,
+.swagger-section pre .apache .tag,
+.swagger-section pre .apache .cbracket,
+.swagger-section pre .tex .command,
+.swagger-section pre .tex .special,
+.swagger-section pre .erlang_repl .function_or_atom,
+.swagger-section pre .markdown .header {
+  color: #800;
+}
+.swagger-section pre .comment,
+.swagger-section pre .annotation,
+.swagger-section pre .template_comment,
+.swagger-section pre .diff .header,
+.swagger-section pre .chunk,
+.swagger-section pre .markdown .blockquote {
+  color: #888;
+}
+.swagger-section pre .number,
+.swagger-section pre .date,
+.swagger-section pre .regexp,
+.swagger-section pre .literal,
+.swagger-section pre .smalltalk .symbol,
+.swagger-section pre .smalltalk .char,
+.swagger-section pre .go .constant,
+.swagger-section pre .change,
+.swagger-section pre .markdown .bullet,
+.swagger-section pre .markdown .link_url {
+  color: #080;
+}
+.swagger-section pre .label,
+.swagger-section pre .javadoc,
+.swagger-section pre .ruby .string,
+.swagger-section pre .decorator,
+.swagger-section pre .filter .argument,
+.swagger-section pre .localvars,
+.swagger-section pre .array,
+.swagger-section pre .attr_selector,
+.swagger-section pre .important,
+.swagger-section pre .pseudo,
+.swagger-section pre .pi,
+.swagger-section pre .doctype,
+.swagger-section pre .deletion,
+.swagger-section pre .envvar,
+.swagger-section pre .shebang,
+.swagger-section pre .apache .sqbracket,
+.swagger-section pre .nginx .built_in,
+.swagger-section pre .tex .formula,
+.swagger-section pre .erlang_repl .reserved,
+.swagger-section pre .prompt,
+.swagger-section pre .markdown .link_label,
+.swagger-section pre .vhdl .attribute,
+.swagger-section pre .clojure .attribute,
+.swagger-section pre .coffeescript .property {
+  color: #8888ff;
+}
+.swagger-section pre .keyword,
+.swagger-section pre .id,
+.swagger-section pre .phpdoc,
+.swagger-section pre .title,
+.swagger-section pre .built_in,
+.swagger-section pre .aggregate,
+.swagger-section pre .css .tag,
+.swagger-section pre .javadoctag,
+.swagger-section pre .phpdoc,
+.swagger-section pre .yardoctag,
+.swagger-section pre .smalltalk .class,
+.swagger-section pre .winutils,
+.swagger-section pre .bash .variable,
+.swagger-section pre .apache .tag,
+.swagger-section pre .go .typename,
+.swagger-section pre .tex .command,
+.swagger-section pre .markdown .strong,
+.swagger-section pre .request,
+.swagger-section pre .status {
+  font-weight: bold;
+}
+.swagger-section pre .markdown .emphasis {
+  font-style: italic;
+}
+.swagger-section pre .nginx .built_in {
+  font-weight: normal;
+}
+.swagger-section pre .coffeescript .javascript,
+.swagger-section pre .javascript .xml,
+.swagger-section pre .tex .formula,
+.swagger-section pre .xml .javascript,
+.swagger-section pre .xml .vbscript,
+.swagger-section pre .xml .css,
+.swagger-section pre .xml .cdata {
+  opacity: 0.5;
+}
+.swagger-section .swagger-ui-wrap {
+  line-height: 1;
+  font-family: "Droid Sans", sans-serif;
+  max-width: 960px;
+  margin-left: auto;
+  margin-right: auto;
+}
+.swagger-section .swagger-ui-wrap b,
+.swagger-section .swagger-ui-wrap strong {
+  font-family: "Droid Sans", sans-serif;
+  font-weight: bold;
+}
+.swagger-section .swagger-ui-wrap q,
+.swagger-section .swagger-ui-wrap blockquote {
+  quotes: none;
+}
+.swagger-section .swagger-ui-wrap p {
+  line-height: 1.4em;
+  padding: 0 0 10px;
+  color: #333333;
+}
+.swagger-section .swagger-ui-wrap q:before,
+.swagger-section .swagger-ui-wrap q:after,
+.swagger-section .swagger-ui-wrap blockquote:before,
+.swagger-section .swagger-ui-wrap blockquote:after {
+  content: none;
+}
+.swagger-section .swagger-ui-wrap .heading_with_menu h1,
+.swagger-section .swagger-ui-wrap .heading_with_menu h2,
+.swagger-section .swagger-ui-wrap .heading_with_menu h3,
+.swagger-section .swagger-ui-wrap .heading_with_menu h4,
+.swagger-section .swagger-ui-wrap .heading_with_menu h5,
+.swagger-section .swagger-ui-wrap .heading_with_menu h6 {
+  display: block;
+  clear: none;
+  float: left;
+  -moz-box-sizing: border-box;
+  -webkit-box-sizing: border-box;
+  -ms-box-sizing: border-box;
+  box-sizing: border-box;
+  width: 60%;
+}
+.swagger-section .swagger-ui-wrap table {
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+.swagger-section .swagger-ui-wrap table thead tr th {
+  padding: 5px;
+  font-size: 0.9em;
+  color: #666666;
+  border-bottom: 1px solid #999999;
+}
+.swagger-section .swagger-ui-wrap table tbody tr:last-child td {
+  border-bottom: none;
+}
+.swagger-section .swagger-ui-wrap table tbody tr.offset {
+  background-color: #f0f0f0;
+}
+.swagger-section .swagger-ui-wrap table tbody tr td {
+  padding: 6px;
+  font-size: 0.9em;
+  border-bottom: 1px solid #cccccc;
+  vertical-align: top;
+  line-height: 1.3em;
+}
+.swagger-section .swagger-ui-wrap ol {
+  margin: 0px 0 10px;
+  padding: 0 0 0 18px;
+  list-style-type: decimal;
+}
+.swagger-section .swagger-ui-wrap ol li {
+  padding: 5px 0px;
+  font-size: 0.9em;
+  color: #333333;
+}
+.swagger-section .swagger-ui-wrap ol,
+.swagger-section .swagger-ui-wrap ul {
+  list-style: none;
+}
+.swagger-section .swagger-ui-wrap h1 a,
+.swagger-section .swagger-ui-wrap h2 a,
+.swagger-section .swagger-ui-wrap h3 a,
+.swagger-section .swagger-ui-wrap h4 a,
+.swagger-section .swagger-ui-wrap h5 a,
+.swagger-section .swagger-ui-wrap h6 a {
+  text-decoration: none;
+}
+.swagger-section .swagger-ui-wrap h1 a:hover,
+.swagger-section .swagger-ui-wrap h2 a:hover,
+.swagger-section .swagger-ui-wrap h3 a:hover,
+.swagger-section .swagger-ui-wrap h4 a:hover,
+.swagger-section .swagger-ui-wrap h5 a:hover,
+.swagger-section .swagger-ui-wrap h6 a:hover {
+  text-decoration: underline;
+}
+.swagger-section .swagger-ui-wrap h1 span.divider,
+.swagger-section .swagger-ui-wrap h2 span.divider,
+.swagger-section .swagger-ui-wrap h3 span.divider,
+.swagger-section .swagger-ui-wrap h4 span.divider,
+.swagger-section .swagger-ui-wrap h5 span.divider,
+.swagger-section .swagger-ui-wrap h6 span.divider {
+  color: #aaaaaa;
+}
+.swagger-section .swagger-ui-wrap a {
+  color: #547f00;
+}
+.swagger-section .swagger-ui-wrap a img {
+  border: none;
+}
+.swagger-section .swagger-ui-wrap article,
+.swagger-section .swagger-ui-wrap aside,
+.swagger-section .swagger-ui-wrap details,
+.swagger-section .swagger-ui-wrap figcaption,
+.swagger-section .swagger-ui-wrap figure,
+.swagger-section .swagger-ui-wrap footer,
+.swagger-section .swagger-ui-wrap header,
+.swagger-section .swagger-ui-wrap hgroup,
+.swagger-section .swagger-ui-wrap menu,
+.swagger-section .swagger-ui-wrap nav,
+.swagger-section .swagger-ui-wrap section,
+.swagger-section .swagger-ui-wrap summary {
+  display: block;
+}
+.swagger-section .swagger-ui-wrap pre {
+  font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace;
+  background-color: #fcf6db;
+  border: 1px solid #e5e0c6;
+  padding: 10px;
+}
+.swagger-section .swagger-ui-wrap pre code {
+  line-height: 1.6em;
+  background: none;
+}
+.swagger-section .swagger-ui-wrap .content > .content-type > div > label {
+  clear: both;
+  display: block;
+  color: #0F6AB4;
+  font-size: 1.1em;
+  margin: 0;
+  padding: 15px 0 5px;
+}
+.swagger-section .swagger-ui-wrap .content pre {
+  font-size: 12px;
+  margin-top: 5px;
+  padding: 5px;
+}
+.swagger-section .swagger-ui-wrap .icon-btn {
+  cursor: pointer;
+}
+.swagger-section .swagger-ui-wrap .info_title {
+  padding-bottom: 10px;
+  font-weight: bold;
+  font-size: 25px;
+}
+.swagger-section .swagger-ui-wrap p.big,
+.swagger-section .swagger-ui-wrap div.big p {
+  font-size: 1em;
+  margin-bottom: 10px;
+}
+.swagger-section .swagger-ui-wrap form.fullwidth ol li.string input,
+.swagger-section .swagger-ui-wrap form.fullwidth ol li.url input,
+.swagger-section .swagger-ui-wrap form.fullwidth ol li.text textarea,
+.swagger-section .swagger-ui-wrap form.fullwidth ol li.numeric input {
+  width: 500px !important;
+}
+.swagger-section .swagger-ui-wrap .info_license {
+  padding-bottom: 5px;
+}
+.swagger-section .swagger-ui-wrap .info_tos {
+  padding-bottom: 5px;
+}
+.swagger-section .swagger-ui-wrap .message-fail {
+  color: #cc0000;
+}
+.swagger-section .swagger-ui-wrap .info_url {
+  padding-bottom: 5px;
+}
+.swagger-section .swagger-ui-wrap .info_email {
+  padding-bottom: 5px;
+}
+.swagger-section .swagger-ui-wrap .info_name {
+  padding-bottom: 5px;
+}
+.swagger-section .swagger-ui-wrap .info_description {
+  padding-bottom: 10px;
+  font-size: 15px;
+}
+.swagger-section .swagger-ui-wrap .markdown ol li,
+.swagger-section .swagger-ui-wrap .markdown ul li {
+  padding: 3px 0px;
+  line-height: 1.4em;
+  color: #333333;
+}
+.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.string input,
+.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.url input,
+.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.numeric input {
+  display: block;
+  padding: 4px;
+  width: auto;
+  clear: both;
+}
+.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.string input.title,
+.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.url input.title,
+.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.numeric input.title {
+  font-size: 1.3em;
+}
+.swagger-section .swagger-ui-wrap table.fullwidth {
+  width: 100%;
+}
+.swagger-section .swagger-ui-wrap .model-signature {
+  font-family: "Droid Sans", sans-serif;
+  font-size: 1em;
+  line-height: 1.5em;
+}
+.swagger-section .swagger-ui-wrap .model-signature .signature-nav a {
+  text-decoration: none;
+  color: #AAA;
+}
+.swagger-section .swagger-ui-wrap .model-signature .signature-nav a:hover {
+  text-decoration: underline;
+  color: black;
+}
+.swagger-section .swagger-ui-wrap .model-signature .signature-nav .selected {
+  color: black;
+  text-decoration: none;
+}
+.swagger-section .swagger-ui-wrap .model-signature .propType {
+  color: #5555aa;
+}
+.swagger-section .swagger-ui-wrap .model-signature pre:hover {
+  background-color: #ffffdd;
+}
+.swagger-section .swagger-ui-wrap .model-signature pre {
+  font-size: .85em;
+  line-height: 1.2em;
+  overflow: auto;
+  max-height: 200px;
+  cursor: pointer;
+}
+.swagger-section .swagger-ui-wrap .model-signature ul.signature-nav {
+  display: block;
+  margin: 0;
+  padding: 0;
+}
+.swagger-section .swagger-ui-wrap .model-signature ul.signature-nav li:last-child {
+  padding-right: 0;
+  border-right: none;
+}
+.swagger-section .swagger-ui-wrap .model-signature ul.signature-nav li {
+  float: left;
+  margin: 0 5px 5px 0;
+  padding: 2px 5px 2px 0;
+  border-right: 1px solid #ddd;
+}
+.swagger-section .swagger-ui-wrap .model-signature .propOpt {
+  color: #555;
+}
+.swagger-section .swagger-ui-wrap .model-signature .snippet small {
+  font-size: 0.75em;
+}
+.swagger-section .swagger-ui-wrap .model-signature .propOptKey {
+  font-style: italic;
+}
+.swagger-section .swagger-ui-wrap .model-signature .description .strong {
+  font-weight: bold;
+  color: #000;
+  font-size: .9em;
+}
+.swagger-section .swagger-ui-wrap .model-signature .description div {
+  font-size: 0.9em;
+  line-height: 1.5em;
+  margin-left: 1em;
+}
+.swagger-section .swagger-ui-wrap .model-signature .description .stronger {
+  font-weight: bold;
+  color: #000;
+}
+.swagger-section .swagger-ui-wrap .model-signature .description .propWrap .optionsWrapper {
+  border-spacing: 0;
+  position: absolute;
+  background-color: #ffffff;
+  border: 1px solid #bbbbbb;
+  display: none;
+  font-size: 11px;
+  max-width: 400px;
+  line-height: 30px;
+  color: black;
+  padding: 5px;
+  margin-left: 10px;
+}
+.swagger-section .swagger-ui-wrap .model-signature .description .propWrap .optionsWrapper th {
+  text-align: center;
+  background-color: #eeeeee;
+  border: 1px solid #bbbbbb;
+  font-size: 11px;
+  color: #666666;
+  font-weight: bold;
+  padding: 5px;
+  line-height: 15px;
+}
+.swagger-section .swagger-ui-wrap .model-signature .description .propWrap .optionsWrapper .optionName {
+  font-weight: bold;
+}
+.swagger-section .swagger-ui-wrap .model-signature .propName {
+  font-weight: bold;
+}
+.swagger-section .swagger-ui-wrap .model-signature .signature-container {
+  clear: both;
+}
+.swagger-section .swagger-ui-wrap .body-textarea {
+  width: 300px;
+  height: 100px;
+  border: 1px solid #aaa;
+}
+.swagger-section .swagger-ui-wrap .markdown p code,
+.swagger-section .swagger-ui-wrap .markdown li code {
+  font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace;
+  background-color: #f0f0f0;
+  color: black;
+  padding: 1px 3px;
+}
+.swagger-section .swagger-ui-wrap .required {
+  font-weight: bold;
+}
+.swagger-section .swagger-ui-wrap input.parameter {
+  width: 300px;
+  border: 1px solid #aaa;
+}
+.swagger-section .swagger-ui-wrap h1 {
+  color: black;
+  font-size: 1.5em;
+  line-height: 1.3em;
+  padding: 10px 0 10px 0;
+  font-family: "Droid Sans", sans-serif;
+  font-weight: bold;
+}
+.swagger-section .swagger-ui-wrap .heading_with_menu {
+  float: none;
+  clear: both;
+  overflow: hidden;
+  display: block;
+}
+.swagger-section .swagger-ui-wrap .heading_with_menu ul {
+  display: block;
+  clear: none;
+  float: right;
+  -moz-box-sizing: border-box;
+  -webkit-box-sizing: border-box;
+  -ms-box-sizing: border-box;
+  box-sizing: border-box;
+  margin-top: 10px;
+}
+.swagger-section .swagger-ui-wrap h2 {
+  color: black;
+  font-size: 1.3em;
+  padding: 10px 0 10px 0;
+}
+.swagger-section .swagger-ui-wrap h2 a {
+  color: black;
+}
+.swagger-section .swagger-ui-wrap h2 span.sub {
+  font-size: 0.7em;
+  color: #999999;
+  font-style: italic;
+}
+.swagger-section .swagger-ui-wrap h2 span.sub a {
+  color: #777777;
+}
+.swagger-section .swagger-ui-wrap span.weak {
+  color: #666666;
+}
+.swagger-section .swagger-ui-wrap .message-success {
+  color: #89BF04;
+}
+.swagger-section .swagger-ui-wrap caption,
+.swagger-section .swagger-ui-wrap th,
+.swagger-section .swagger-ui-wrap td {
+  text-align: left;
+  font-weight: normal;
+  vertical-align: middle;
+}
+.swagger-section .swagger-ui-wrap .code {
+  font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace;
+}
+.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.text textarea {
+  font-family: "Droid Sans", sans-serif;
+  height: 250px;
+  padding: 4px;
+  display: block;
+  clear: both;
+}
+.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.select select {
+  display: block;
+  clear: both;
+}
+.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.boolean {
+  float: none;
+  clear: both;
+  overflow: hidden;
+  display: block;
+}
+.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.boolean label {
+  display: block;
+  float: left;
+  clear: none;
+  margin: 0;
+  padding: 0;
+}
+.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.boolean input {
+  display: block;
+  float: left;
+  clear: none;
+  margin: 0 5px 0 0;
+}
+.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li.required label {
+  color: black;
+}
+.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li label {
+  display: block;
+  clear: both;
+  width: auto;
+  padding: 0 0 3px;
+  color: #666666;
+}
+.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li label abbr {
+  padding-left: 3px;
+  color: #888888;
+}
+.swagger-section .swagger-ui-wrap form.formtastic fieldset.inputs ol li p.inline-hints {
+  margin-left: 0;
+  font-style: italic;
+  font-size: 0.9em;
+  margin: 0;
+}
+.swagger-section .swagger-ui-wrap form.formtastic fieldset.buttons {
+  margin: 0;
+  padding: 0;
+}
+.swagger-section .swagger-ui-wrap span.blank,
+.swagger-section .swagger-ui-wrap span.empty {
+  color: #888888;
+  font-style: italic;
+}
+.swagger-section .swagger-ui-wrap .markdown h3 {
+  color: #547f00;
+}
+.swagger-section .swagger-ui-wrap .markdown h4 {
+  color: #666666;
+}
+.swagger-section .swagger-ui-wrap .markdown pre {
+  font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace;
+  background-color: #fcf6db;
+  border: 1px solid #e5e0c6;
+  padding: 10px;
+  margin: 0 0 10px 0;
+}
+.swagger-section .swagger-ui-wrap .markdown pre code {
+  line-height: 1.6em;
+}
+.swagger-section .swagger-ui-wrap div.gist {
+  margin: 20px 0 25px 0 !important;
+}
+.swagger-section .swagger-ui-wrap ul#resources {
+  font-family: "Droid Sans", sans-serif;
+  font-size: 0.9em;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource {
+  border-bottom: 1px solid #dddddd;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource:hover div.heading h2 a,
+.swagger-section .swagger-ui-wrap ul#resources li.resource.active div.heading h2 a {
+  color: black;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource:hover div.heading ul.options li a,
+.swagger-section .swagger-ui-wrap ul#resources li.resource.active div.heading ul.options li a {
+  color: #555555;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource:last-child {
+  border-bottom: none;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading {
+  border: 1px solid transparent;
+  float: none;
+  clear: both;
+  overflow: hidden;
+  display: block;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options {
+  overflow: hidden;
+  padding: 0;
+  display: block;
+  clear: none;
+  float: right;
+  margin: 14px 10px 0 0;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li {
+  float: left;
+  clear: none;
+  margin: 0;
+  padding: 2px 10px;
+  border-right: 1px solid #dddddd;
+  color: #666666;
+  font-size: 0.9em;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a {
+  color: #aaaaaa;
+  text-decoration: none;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a:hover {
+  text-decoration: underline;
+  color: black;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a:hover,
+.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a:active,
+.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li a.active {
+  text-decoration: underline;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li:first-child,
+.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li.first {
+  padding-left: 0;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li:last-child,
+.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options li.last {
+  padding-right: 0;
+  border-right: none;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options:first-child,
+.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading ul.options.first {
+  padding-left: 0;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading h2 {
+  color: #999999;
+  padding-left: 0;
+  display: block;
+  clear: none;
+  float: left;
+  font-family: "Droid Sans", sans-serif;
+  font-weight: bold;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading h2 a {
+  color: #999999;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource div.heading h2 a:hover {
+  color: black;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation {
+  float: none;
+  clear: both;
+  overflow: hidden;
+  display: block;
+  margin: 0 0 10px;
+  padding: 0;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading {
+  float: none;
+  clear: both;
+  overflow: hidden;
+  display: block;
+  margin: 0;
+  padding: 0;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 {
+  display: block;
+  clear: none;
+  float: left;
+  width: auto;
+  margin: 0;
+  padding: 0;
+  line-height: 1.1em;
+  color: black;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span.path {
+  padding-left: 10px;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span.path a {
+  color: black;
+  text-decoration: none;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span.path a:hover {
+  text-decoration: underline;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span.http_method a {
+  text-transform: uppercase;
+  text-decoration: none;
+  color: white;
+  display: inline-block;
+  width: 50px;
+  font-size: 0.7em;
+  text-align: center;
+  padding: 7px 0 4px;
+  -moz-border-radius: 2px;
+  -webkit-border-radius: 2px;
+  -o-border-radius: 2px;
+  -ms-border-radius: 2px;
+  -khtml-border-radius: 2px;
+  border-radius: 2px;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading h3 span {
+  margin: 0;
+  padding: 0;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading ul.options {
+  overflow: hidden;
+  padding: 0;
+  display: block;
+  clear: none;
+  float: right;
+  margin: 6px 10px 0 0;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading ul.options li {
+  float: left;
+  clear: none;
+  margin: 0;
+  padding: 2px 10px;
+  font-size: 0.9em;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading ul.options li a {
+  text-decoration: none;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.heading ul.options li.access {
+  color: black;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content {
+  border-top: none;
+  padding: 10px;
+  -moz-border-radius-bottomleft: 6px;
+  -webkit-border-bottom-left-radius: 6px;
+  -o-border-bottom-left-radius: 6px;
+  -ms-border-bottom-left-radius: 6px;
+  -khtml-border-bottom-left-radius: 6px;
+  border-bottom-left-radius: 6px;
+  -moz-border-radius-bottomright: 6px;
+  -webkit-border-bottom-right-radius: 6px;
+  -o-border-bottom-right-radius: 6px;
+  -ms-border-bottom-right-radius: 6px;
+  -khtml-border-bottom-right-radius: 6px;
+  border-bottom-right-radius: 6px;
+  margin: 0 0 20px;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content h4 {
+  font-size: 1.1em;
+  margin: 0;
+  padding: 15px 0 5px;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.sandbox_header {
+  float: none;
+  clear: both;
+  overflow: hidden;
+  display: block;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.sandbox_header a {
+  padding: 4px 0 0 10px;
+  display: inline-block;
+  font-size: 0.9em;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.sandbox_header input.submit {
+  display: block;
+  clear: none;
+  float: left;
+  padding: 6px 8px;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.sandbox_header span.response_throbber {
+  background-image: url('../images/throbber.gif');
+  width: 128px;
+  height: 16px;
+  display: block;
+  clear: none;
+  float: right;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content form input[type='text'].error {
+  outline: 2px solid black;
+  outline-color: #cc0000;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.response div.block pre {
+  font-family: "Anonymous Pro", "Menlo", "Consolas", "Bitstream Vera Sans Mono", "Courier New", monospace;
+  padding: 10px;
+  font-size: 0.9em;
+  max-height: 400px;
+  overflow-y: auto;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading {
+  background-color: #f9f2e9;
+  border: 1px solid #f0e0ca;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading h3 span.http_method a {
+  background-color: #c5862b;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li {
+  border-right: 1px solid #dddddd;
+  border-right-color: #f0e0ca;
+  color: #c5862b;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li a {
+  color: #c5862b;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content {
+  background-color: #faf5ee;
+  border: 1px solid #f0e0ca;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content h4 {
+  color: #c5862b;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content div.sandbox_header a {
+  color: #dcb67f;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading {
+  background-color: #fcffcd;
+  border: 1px solid black;
+  border-color: #ffd20f;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading h3 span.http_method a {
+  text-transform: uppercase;
+  background-color: #ffd20f;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li {
+  border-right: 1px solid #dddddd;
+  border-right-color: #ffd20f;
+  color: #ffd20f;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li a {
+  color: #ffd20f;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content {
+  background-color: #fcffcd;
+  border: 1px solid black;
+  border-color: #ffd20f;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content h4 {
+  color: #ffd20f;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content div.sandbox_header a {
+  color: #6fc992;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading {
+  background-color: #f5e8e8;
+  border: 1px solid #e8c6c7;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading h3 span.http_method a {
+  text-transform: uppercase;
+  background-color: #a41e22;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li {
+  border-right: 1px solid #dddddd;
+  border-right-color: #e8c6c7;
+  color: #a41e22;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li a {
+  color: #a41e22;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content {
+  background-color: #f7eded;
+  border: 1px solid #e8c6c7;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content h4 {
+  color: #a41e22;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content div.sandbox_header a {
+  color: #c8787a;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading {
+  background-color: #e7f6ec;
+  border: 1px solid #c3e8d1;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading h3 span.http_method a {
+  background-color: #10a54a;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li {
+  border-right: 1px solid #dddddd;
+  border-right-color: #c3e8d1;
+  color: #10a54a;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li a {
+  color: #10a54a;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content {
+  background-color: #ebf7f0;
+  border: 1px solid #c3e8d1;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content h4 {
+  color: #10a54a;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content div.sandbox_header a {
+  color: #6fc992;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading {
+  background-color: #FCE9E3;
+  border: 1px solid #F5D5C3;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading h3 span.http_method a {
+  background-color: #D38042;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li {
+  border-right: 1px solid #dddddd;
+  border-right-color: #f0cecb;
+  color: #D38042;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li a {
+  color: #D38042;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content {
+  background-color: #faf0ef;
+  border: 1px solid #f0cecb;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content h4 {
+  color: #D38042;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content div.sandbox_header a {
+  color: #dcb67f;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading {
+  background-color: #e7f0f7;
+  border: 1px solid #c3d9ec;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading h3 span.http_method a {
+  background-color: #0f6ab4;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li {
+  border-right: 1px solid #dddddd;
+  border-right-color: #c3d9ec;
+  color: #0f6ab4;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li a {
+  color: #0f6ab4;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content {
+  background-color: #ebf3f9;
+  border: 1px solid #c3d9ec;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content h4 {
+  color: #0f6ab4;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content div.sandbox_header a {
+  color: #6fa5d2;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.heading {
+  background-color: #e7f0f7;
+  border: 1px solid #c3d9ec;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.heading h3 span.http_method a {
+  background-color: #0f6ab4;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.heading ul.options li {
+  border-right: 1px solid #dddddd;
+  border-right-color: #c3d9ec;
+  color: #0f6ab4;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.heading ul.options li a {
+  color: #0f6ab4;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.content {
+  background-color: #ebf3f9;
+  border: 1px solid #c3d9ec;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.content h4 {
+  color: #0f6ab4;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.options div.content div.sandbox_header a {
+  color: #6fa5d2;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.content,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.content,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.content,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.content,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.content,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.content {
+  border-top: none;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li:last-child,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li:last-child,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li:last-child,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li:last-child,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li:last-child,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li:last-child,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.get div.heading ul.options li.last,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.post div.heading ul.options li.last,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.head div.heading ul.options li.last,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.put div.heading ul.options li.last,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.patch div.heading ul.options li.last,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation.delete div.heading ul.options li.last {
+  padding-right: 0;
+  border-right: none;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li a:hover,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li a:active,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li a.active {
+  text-decoration: underline;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li:first-child,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations ul.options li.first {
+  padding-left: 0;
+}
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations:first-child,
+.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations.first {
+  padding-left: 0;
+}
+.swagger-section .swagger-ui-wrap p#colophon {
+  margin: 0 15px 40px 15px;
+  padding: 10px 0;
+  font-size: 0.8em;
+  border-top: 1px solid #dddddd;
+  font-family: "Droid Sans", sans-serif;
+  color: #999999;
+  font-style: italic;
+}
+.swagger-section .swagger-ui-wrap p#colophon a {
+  text-decoration: none;
+  color: #547f00;
+}
+.swagger-section .swagger-ui-wrap h3 {
+  color: black;
+  font-size: 1.1em;
+  padding: 10px 0 10px 0;
+}
+.swagger-section .swagger-ui-wrap .markdown ol,
+.swagger-section .swagger-ui-wrap .markdown ul {
+  font-family: "Droid Sans", sans-serif;
+  margin: 5px 0 10px;
+  padding: 0 0 0 18px;
+  list-style-type: disc;
+}
+.swagger-section .swagger-ui-wrap form.form_box {
+  background-color: #ebf3f9;
+  border: 1px solid #c3d9ec;
+  padding: 10px;
+}
+.swagger-section .swagger-ui-wrap form.form_box label {
+  color: #0f6ab4 !important;
+}
+.swagger-section .swagger-ui-wrap form.form_box input[type=submit] {
+  display: block;
+  padding: 10px;
+}
+.swagger-section .swagger-ui-wrap form.form_box p.weak {
+  font-size: 0.8em;
+}
+.swagger-section .swagger-ui-wrap form.form_box p {
+  font-size: 0.9em;
+  padding: 0 0 15px;
+  color: #7e7b6d;
+}
+.swagger-section .swagger-ui-wrap form.form_box p a {
+  color: #646257;
+}
+.swagger-section .swagger-ui-wrap form.form_box p strong {
+  color: black;
+}
+.swagger-section .title {
+  font-style: bold;
+}
+.swagger-section .secondary_form {
+  display: none;
+}
+.swagger-section .main_image {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
+.swagger-section .oauth_body {
+  margin-left: 100px;
+  margin-right: 100px;
+}
+.swagger-section .oauth_submit {
+  text-align: center;
+}
+.swagger-section .api-popup-dialog {
+  z-index: 10000;
+  position: absolute;
+  width: 500px;
+  background: #FFF;
+  padding: 20px;
+  border: 1px solid #ccc;
+  border-radius: 5px;
+  display: none;
+  font-size: 13px;
+  color: #777;
+}
+.swagger-section .api-popup-dialog .api-popup-title {
+  font-size: 24px;
+  padding: 10px 0;
+}
+.swagger-section .api-popup-dialog .api-popup-title {
+  font-size: 24px;
+  padding: 10px 0;
+}
+.swagger-section .api-popup-dialog p.error-msg {
+  padding-left: 5px;
+  padding-bottom: 5px;
+}
+.swagger-section .api-popup-dialog button.api-popup-authbtn {
+  height: 30px;
+}
+.swagger-section .api-popup-dialog button.api-popup-cancel {
+  height: 30px;
+}
+.swagger-section .api-popup-scopes {
+  padding: 10px 20px;
+}
+.swagger-section .api-popup-scopes li {
+  padding: 5px 0;
+  line-height: 20px;
+}
+.swagger-section .api-popup-scopes .api-scope-desc {
+  padding-left: 20px;
+  font-style: italic;
+}
+.swagger-section .api-popup-scopes li input {
+  position: relative;
+  top: 2px;
+}
+.swagger-section .api-popup-actions {
+  padding-top: 10px;
+}
+.swagger-section .access {
+  float: right;
+}
+.swagger-section .auth {
+  float: right;
+}
+.swagger-section #api_information_panel {
+  position: absolute;
+  background: #FFF;
+  border: 1px solid #ccc;
+  border-radius: 5px;
+  display: none;
+  font-size: 13px;
+  max-width: 300px;
+  line-height: 30px;
+  color: black;
+  padding: 5px;
+}
+.swagger-section #api_information_panel p .api-msg-enabled {
+  color: green;
+}
+.swagger-section #api_information_panel p .api-msg-disabled {
+  color: red;
+}
+.swagger-section .api-ic {
+  height: 18px;
+  vertical-align: middle;
+  display: inline-block;
+  background: url(../images/explorer_icons.png) no-repeat;
+}
+.swagger-section .ic-info {
+  background-position: 0 0;
+  width: 18px;
+  margin-top: -7px;
+  margin-left: 4px;
+}
+.swagger-section .ic-warning {
+  background-position: -60px 0;
+  width: 18px;
+  margin-top: -7px;
+  margin-left: 4px;
+}
+.swagger-section .ic-error {
+  background-position: -30px 0;
+  width: 18px;
+  margin-top: -7px;
+  margin-left: 4px;
+}
+.swagger-section .ic-off {
+  background-position: -90px 0;
+  width: 58px;
+  margin-top: -4px;
+  cursor: pointer;
+}
+.swagger-section .ic-on {
+  background-position: -160px 0;
+  width: 58px;
+  margin-top: -4px;
+  cursor: pointer;
+}
+.swagger-section #header {
+  background-color: #89bf04;
+  padding: 14px;
+}
+.swagger-section #header a#logo {
+  font-size: 1.5em;
+  font-weight: bold;
+  text-decoration: none;
+  background: transparent url(../images/logo_small.png) no-repeat left center;
+  padding: 20px 0 20px 40px;
+  color: white;
+}
+.swagger-section #header form#api_selector {
+  display: block;
+  clear: none;
+  float: right;
+}
+.swagger-section #header form#api_selector .input {
+  display: block;
+  clear: none;
+  float: left;
+  margin: 0 10px 0 0;
+}
+.swagger-section #header form#api_selector .input input#input_apiKey {
+  width: 200px;
+}
+.swagger-section #header form#api_selector .input input#input_baseUrl {
+  width: 400px;
+}
+.swagger-section #header form#api_selector .input a#explore {
+  display: block;
+  text-decoration: none;
+  font-weight: bold;
+  padding: 6px 8px;
+  font-size: 0.9em;
+  color: white;
+  background-color: #547f00;
+  -moz-border-radius: 4px;
+  -webkit-border-radius: 4px;
+  -o-border-radius: 4px;
+  -ms-border-radius: 4px;
+  -khtml-border-radius: 4px;
+  border-radius: 4px;
+}
+.swagger-section #header form#api_selector .input a#explore:hover {
+  background-color: #547f00;
+}
+.swagger-section #header form#api_selector .input input {
+  font-size: 0.9em;
+  padding: 3px;
+  margin: 0;
+}
+.swagger-section #content_message {
+  margin: 10px 15px;
+  font-style: italic;
+  color: #999999;
+}
+.swagger-section #message-bar {
+  min-height: 30px;
+  text-align: center;
+  padding-top: 10px;
+}
+`)
+
+func third_partySwaggerUiCssScreenCssBytes() ([]byte, error) {
+	return _third_partySwaggerUiCssScreenCss, nil
+}
+
+func third_partySwaggerUiCssScreenCss() (*asset, error) {
+	bytes, err := third_partySwaggerUiCssScreenCssBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/css/screen.css", size: 43042, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiCssTypographyCss = []byte(`/* droid-sans-regular - latin */
+@font-face {
+  font-family: 'Droid Sans';
+  font-style: normal;
+  font-weight: 400;
+  src: url('../fonts/droid-sans-v6-latin-regular.eot'); /* IE9 Compat Modes */
+  src: local('Droid Sans'), local('DroidSans'),
+       url('../fonts/droid-sans-v6-latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+       url('../fonts/droid-sans-v6-latin-regular.woff2') format('woff2'), /* Super Modern Browsers */
+       url('../fonts/droid-sans-v6-latin-regular.woff') format('woff'), /* Modern Browsers */
+       url('../fonts/droid-sans-v6-latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */
+       url('../fonts/droid-sans-v6-latin-regular.svg#DroidSans') format('svg'); /* Legacy iOS */
+}
+/* droid-sans-700 - latin */
+@font-face {
+  font-family: 'Droid Sans';
+  font-style: normal;
+  font-weight: 700;
+  src: url('../fonts/droid-sans-v6-latin-700.eot'); /* IE9 Compat Modes */
+  src: local('Droid Sans Bold'), local('DroidSans-Bold'),
+       url('../fonts/droid-sans-v6-latin-700.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+       url('../fonts/droid-sans-v6-latin-700.woff2') format('woff2'), /* Super Modern Browsers */
+       url('../fonts/droid-sans-v6-latin-700.woff') format('woff'), /* Modern Browsers */
+       url('../fonts/droid-sans-v6-latin-700.ttf') format('truetype'), /* Safari, Android, iOS */
+       url('../fonts/droid-sans-v6-latin-700.svg#DroidSans') format('svg'); /* Legacy iOS */
+}
+`)
+
+func third_partySwaggerUiCssTypographyCssBytes() ([]byte, error) {
+	return _third_partySwaggerUiCssTypographyCss, nil
+}
+
+func third_partySwaggerUiCssTypographyCss() (*asset, error) {
+	bytes, err := third_partySwaggerUiCssTypographyCssBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/css/typography.css", size: 1474, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiFontsDroidSansV6Latin700Eot = []byte("\x8cY\x00\x00\xaeX\x00\x00\x02\x00\x02\x00\x04\x00\x00\x00\x02\v\b\x06\x03\b\x04\x02\x02\x04\x01\x00\xbc\x02\x00\x00\b\x00LP\xef\x02\x00\xe0[ \x00@(\x00\x00\x00\x00\x00\x00\x00\x9f\x01\x00 \x00\x00\x00\x00\u05c26W\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00D\x00r\x00o\x00i\x00d\x00 \x00S\x00a\x00n\x00s\x00\x00\x00\b\x00B\x00o\x00l\x00d\x00\x00\x00,\x00V\x00e\x00r\x00s\x00i\x00o\x00n\x00 \x001\x00.\x000\x000\x00 \x00b\x00u\x00i\x00l\x00d\x00 \x001\x001\x002\x00\x00\x00\x1e\x00D\x00r\x00o\x00i\x00d\x00 \x00S\x00a\x00n\x00s\x00 \x00B\x00o\x00l\x00d\x00\x00\x00\x00\x00BSGP\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00w$\x009J\x00Q\xb2\x00-\x92\x12\xcd\xe9\x8a\xc8`\xd8W\xc9hKropq\"U:b,/\x962\xd9\xe3\xdb\xd3\xf0\xe0\xc6g@\x9e\xba\xd6$@6\xa4\x92\x9f\x83\xec\x03\x8a;\"\xf1\xa5\xb1\x18\xe0[E\xc7LFM\xad#^S[\xaf\xd0\u03cb^>\x17\x1eZ\xc9\"\xc5$\xc0\xf1tYx\xa2X\xad\xa9\x86y\xe0\t.~iVAV\x91\xa5\xb5\fqIH3Y\xa2K]I\x165\xe6K\xefcB\xec\x80>E\xadZ\x93+\u0361,\xb0\xa3J\x85\xb7fEk2\f-\x15\xf5\xe2\x02\x82zF\x15\x99\u778f\xd5B\xecj\x1eK\u04aeS\xeb\n\xac\a\xc7XJ\x8b\x17UX\x0f)\xddJmq\xf51\xbal\x02\xd4l\x10\xc5\xd4]\xd9\x18%\x9b\x974S\xe5\x98\t\xdf%\u0547CY9\x9f\u038c\xab60IZ\x10\u03e1RI\a\xbbx\xcd\xd4o\xc0\u00c3\xefL\xbd\x12U\xe2\xf8.\xe6nc\xb4\xb4\xc67'\"\xdcI\x8f\x00Mg\u007f\f\xa8\u0175\x95\x9c\xb4\xdc\x04Z\x15\xee\nC#\xe4f\xbf/5\x9f\xea\xbf'\xad\x9f\xa6C\x84\xaa\x953\x91\x16\x19\xb8'\xe1z\xfet8n\x89\xff`\xdbs/J\xcf\b\xad\x93v\u007f\xa2\x918\x11EH\xc0\x84\"\xc1\x85\xb2p\x15\x83\x00s\xa0o\x85\xaa\xa48M\x17\xa4\x1e`\x1f\xe0\x8e\u06ca4\u054c>P6D\xc9\f#\"4i\x82S\x14\x11%\x0e5\xdce\xd8\xc3^\xb0\x16\xe1Sn\n\x9fBYL`\n\x9aB\x18\x12.\x03\xcc\x061\xfcJ\x18Vp\x06\x02\x87\xe8\xa9\xe6\xe2\xa2W\x13\\\xa0\xac\xee<F\x13\a\x88^\xe6\xd3Q\x00;\rI\x0e\xd8P+\xec&\xa4\f\xd8M@\xaf\xa0bjBY\x8a\x10\xaabj\xa5\x1c\xa4\xd5@P\xa5\b\xa3\xbeyk\u07a3\xf3\x94\xb2\xdc\xeb\x82&\x9d;o\x80)b`\xcb\xf4\x8aY\xed\xa1\xc0s\x19\x83\x0f\xac\xa2\xd2\r\u01ee\x81\xef\xaf\xfe\xb6\xcaW\x1e$\x95\xe2\xf0\xc3,a\xa9C\xc4Cb*)8\xebx\xbah\xa4\"\xe8c\x89\xb41\xe4I\x01\u03d0\xc1q\xe1\f\xf0\rH\f\x8aS\x9d\xb9p\xb7\u00c5]A\x1c\\\xfe\x97\xb5\u013ce\xdc\xe9\x82<\xc3\x12`Na1\xa1n\x9aO\x902\xcc_\x9a\x03+\te\x06Yg\n\xd5\xc5\x06E\x83*\xc1\xa9e\x1aC7\t\xcf\x04\x17\x04\x1f\x05v\x86\xcd \xb06\xd6\xc3v\x05\xfb'\x15\x9c\x11\xc0\xe3\x85E\x84&\f\x8c\x04\x8a\x12`}\xe3\xa8\x032\xfa\xf15\xae\x13\xacJ,OlO '\xc1\x8d\x01\xba\xd9R\xe8\x9cqZ#L\xdb/\x02c\xa2r\u05ee\x81\xc7\xd2f\u0548\xf5\xe7\u200b\x96f\u042f\xe1\xdeC\"\u04e7\x0e9o`\xbd\x84\xf6\x1b\xf3^\xc4\xf63\xd8\xe5\x80\x16\x028\x0eh\xe0\x8aw\\n<\xbfc\x18\xbc\xf2\"\xfcl\r\xf3\x10\xece\xf5\x10sq\u0719\xf3C#\xd6\x11\x851\x02\x89\xba\xe8#Z4H\xd1C\xd5\x1d\x88l\x82\x8c!\u0460(\xe0\xa3\u00a4\xe1\xa0\n\fx\xd6\a'\xef\x06d ;\x9f0\xeac\xc1\xcd\xff &\xe4\x84\x031\xf0\xf2\x85\x92\"\xf2L2\a\xc7\xe7\x0f@eC,\x19p\x91\xcc\x10\"\x0e3\xff\x1a\f\xcd\xe9\u03e7\x0e\xa0\x86\xd7a\x83\b\xc8r\x83\r\xfe\xfb\xf1\xbf;\x0f\xa3\xda*\xe0\"\xbd\x14\x11\x00\xbdDYr\t\t\x95V\x15X-5\xa1AC\xa7\xdaz\x98\xa7ULR\x19\t\u0418\x8da\x10\x05\xaa\xf6\x12*\u037b@1\x1ep\nYGkOrX\xba\x80\xe0\xf0|\xcc\x1c5\x021\xa5\x01\x1a\x1d\xc1\x19\x1a@*&d\x8f\x12\u030a\xb9r\x86\xa1\x1d\x83\xa2\x9b\xf9\xb7\x81\xfcy\xa5\x15)\xa5Y\xfd\x9av\xee\x00\x1e\r\xfc*\x9c\x02\xdc*\xca\xf5\u007f\x8d>\xb1\xb2~\xcaq\xe7v\x83\u007fNt\xf3m\x92v5\xa3q\xa7\x1d\xa6\xda\xcbb\u0743\xb6\xbd\u05ee\xbd\xa5\xef/\xa9\x9cq[\xcb\xd6\xf9\xdbS\u01de\xbca\xc6\xef>\xe5?\v\x8ez\x8d\xe8.=]D\uf5d7\x1e\xc5sH\u028e\xacd\xcf7\xf8K\x8c\xd9\x10@\x12\x1em\xbbe9\x82\x8dr.\xe6\x05 \xc8<)\x02\x04\xfd\x12)\x18\xa1\x01\f\x8e\x9a\xe9h\u0562;\xf5p\xe6 \x95\x1f\xba\x03\x8f\xb93\x93\xb9=+\xf9\u0308]\x92^\xd3\xf6\u07f8\xfd\xd7\xf1:\xe8,\x84\xcb\b\xe7}d!x\xe0R\xeb\xfa\x1c\xbf\xb5\xa7V2\x03\xe4$\x9fC\x94\x99\x8a\x14\x82\\6\x04F\u019b\xf6S\x90\xb9\x13\xee>\xea]i\xfe\x1fzh\u0465\xb6\x8dZ>B\xa5\xd7\x16\x90\x83}\x99\x93j\x05X\f\x0f\xcd\xe7'9\xb9\xd1N\xaaxR\xa2\x95T\xac\xa5uz^\xf5\xfcg,\xa4ZR\u0697\x17\xc1[T\xf2\xe2\xfe\xa9\xe9@K\x8c\xc2S\x05^X\x8d\xc0\x87Y\x90\xf1\xc7\a\"\xb0\x98\x9d\x8a\xc1\b-\xca\f0i\x83\x8d\xb0\xe4\xa18\f a\x13\t\x1c\xa1\xb6\x87\x8a\xfd\x99C\x1b2y\b\xca\u0733k\xb8\x9d\xf1\xcd\x05\x98q\xb7\x1b\xcd\x00\x85N\x90\x1e\x8e\xe3\xb1\u049a\x8a\x16+\xe9#\xc2+`\x00\x1c4{\xe0LO\x00\x00\xa2\xbb\x9b\x01\x8b\x18\xa9\xa1\x18\x86\x06O\xeb\xa0R\x81\x8c\x0e`\x83\x04\x98(\xe7\x0et\xe7\x8e|\xd0\r\xbc\xe4\xec\t\xa3F\xa8:\x93\xaa7\x83A0\x9a\x8bJaC\xa6?%\x9dy\x86z\xabB\u06c7\xe2\f\x9a\x94\n\xf8WgG\x80x)\xa52\u0359W\xbb\x83'\xca\u065d\xf0\xd1\u0547d\t\x8cL\x12\x00\xa6<pk\xcaN2K\x11\u0577\x1e5\x8eabvGfv\x87k\xef\xe7'|\x92i|s\xb7H\u007f\x1d\x88Ed{\xe3\x1e48n\xc3\x01\x1dDi\xf5\x9dR\x1c\xf1\xd4\x14\"\xa9\xb4f.\a&\x9b\xbaSC\xeb\b\x8d\xe4\x04\x88w\xb9\x0eM@\xbc\xd0\x19j\x0e(\xad4\xa0f\x1cj\x00\xafa\x95\xa9.\xe1\xc2U\xc5\xf9\xc1\x8e\x98\x17)c%ad\xb31KLcS\x1a{*\n\x81\x02\x81\x04\u07c2\xa1\u0304\x03jLV\x05\xc4#\x13\xf5*\u04fe\xddU\xd7\xf4\xbcgC\xc8~\x86)\xfc\x16)\xeay\u0608\n\x00\xd5V\x9d\x98\xdc\n\xb4I\x179\xd0|\x80P\x96\x1b\xe2\x80H[\tt=\u06020h\x90\x1c\x00\x9dJ\x91\xd1z\xa9\x82\xc7\\g\xba\xa3[\x1e\u0475\x19\xd4\x0f]$\u0790\xa6\xa0\x9f\x911\xf1\x8c\x86\u0193\u0571M\xf2\xb1\xe1\\\u03c3\xa8\x95W\xfb\x84\xdb\xe6\xaaU\x18\x80\x96+{\u029dRj\x94^\x18|VD\xf8*Mae\x80\xfapo\x01PF\xf0l\xe4\xdf%\xa2\xbe\x81\xa0\xa34\xc5U\xd1h\x8cL\xf7\x19k\x8d\xab\xc1\x82\x93\xc4\x14\xc6\xe1\x17\xf6\xfd\x9c\x01\\-\xd05I\b\xd8X4}\xc4_\x11lS&:\xed\x84E\x90O\u02b1\xd7\xf3\u00ee9\xfd\x00\b\x89\x04\xfb)\x8c\x06p\x06\xdb#\x1f\xc4\x16\xbc\xac\xdd\xf0\x9c%\xb4\x00\x00\xab\b\x00\x04\x00\x85<\x9b\xb2\x0eCG\xb1\xe8$:\x9d\f\xbdGo\x85\xa9\xf0\u021e\xf0\x92\xd8\f\xa0S\xbf\xc0\xbb\xa3\x81\xbf\xb2<\x8c\xf3\x81\xc0\x89\xd0)_<Cl`\xde\x060y\x17\xc5\x04\x00f\xfa\x9f\xc5\u007f]\xee\xd0Q\x8f\xa7RqG\x16b\xe6\xf8a#\xb6;s\xa86\xd3\x188\xc2\xd4A%\x86\u05a2\u0241\x96'o\xa4\x15\x10\x83{\xb0/\x01\x83\x00\xf8(\x11u\x86\x88q\x81\xf1\xa2N=\xf1+\xcf'\xfb\u0702\u00bb[\x18\xf7\xf89\xd1\xfeU6K\x13\x1dV\xaf\x98\xa8!<\x9c\x86|\x14&\xc9n\xeb<\x89\u02ad\xa0\x14X\x82\xbb\x14j\xa1\x03\xa0\x03s%d\x8a*\x06f\"\xdc\x12\\\xdb(&\x02\u062c\xd2\x00\\Hj\xe7j\xea\x01+A\x1b\xd8-yr\xf7PM\xe9\xfe't\xba\x10\xaf\x1b\x8f3,e\xdf\u014f\x1d\x04\x85\xb9\x0e\xd3c\x80\x81o0>\x99,E6\x19\xbd\xf2x\xe9\x05\xa3\fa\xe3\x17\xee\xe0\x19#`\xed\x11\r\x00\xdbX\u06b8\x87/\x9c\x10k(J\x04Wn\xc4\x10\u0542y\xaf\x1e\xa8\x9d\u021c@\x90\x82\xe6\x03S\xe4\x1a\x85r+\"\xff\xa1\xb0\x06%\xc42g\xa9\xe2\x82\u5dc7\x18$\xb57A]\r\x90\u05d6;\u0343n\xbc\x8e(`*m\xf8\n\x1b\"Zd\xc1\xb0&\xfb\xe7\u0258dA\xf5?y\xf8=\u0178`\x93\x86\r\n\xa1\xe2\xe9\x03\v\xbc<c\x89\xf9\x04v\xb9\xed_\x11|j\x89\x84\x19A\xc5\v$9\x90\\\xc1u\v\x98\x1e\xe0\xb11\x98<\xf8\xbb>\xbd\x10\v\xe0\t\x18?\xa2\xa5P4$\xa3\x81j\xc2\x06\xe4m\xb8o\x8e\b\xb7<\xaaIx\xf4~k\xa8\x1b\u019b5\xfe)[w\xf5\xbdlQ\xc0\xb5\xebw\xd6\xe8y\xdbA\x81\xf4\xe6\x1b\x8e\x9cW\xf0+#}\n\xb6E \xe3\u00be\xc4n3\xc7\xd1!\x06%\x85/=,K\x02\x97-\x11aBa(\xc6Qu\xd0\x12\xa8\x83\x11\x9a7\xe8V4\xeb~\x15H\x84\xf5\xb19\x88\\%,&_Q\xcd[C\xf6fj\x98\xda$\u0709\xb5\x93)\xa2\x1d%\xe7}\bq\x95dv\x10{,d%\xb1N\x04\x1c\xc0\x97\x03.\x12\x9a\b\x94\xa2\x8a\u007f\x98^p/\x99a\xa4\xe1.\x86-L\x955\xa6\xfd\n\x83\x00f\xc1\u00f6\xe3N1\xfd\"0\xe1(\n\x18\xd0\xfbwM\u0374\xe1zzqb\x14\xe6+:\xd8\xf5aU\xb2\xcewb!\x87\x0f\x8c`DH\v\x9bF;!\x8aIl\x8cfJ4\u050bS\xa1\x84\x1by\xd9\xd1Rq\x97DI\x9ac\x90\u0671P\x1d\x9d\x93\x03\xceR\xe3\x82\bN\"\xa4\x90\xc8\x11\x12e\x91\x12H\xc5\xe3\xe9\xfa\xfc\xcdg\x14}<`\v\xd2\x14#\x9c!<\";\xf3\xaa**T\vu%%\xac\x9a\x00\xcf\u052a\xa9\xc7X\x11Q\x82MA\xfd3\u01c7p\xd6\xdc.\xe8Ws\x17\r\xae\x1f\x8eJ\xe23\xea\xd8\uaf2eu\xfa6\x16j_>$\x18\x14\xf6J\x8e\x9eJ\x95\x1b\x9e\x8cM\x96\f\x18\x8e,\x8cfn\xff[\xbcM\xdb~\x90\xc5\x00_Bo)\xae\x05\xde\a\u0468KQ\xfds\xca]\xe3\u02e4\xa9\x95\xcaEF\xe6\x1d\xd8~\u043a\xf2\x98\x17\x8d\x13\r2+\xcbz\xbc\x9d3\xbe\xd7+C\u05e1\x96\xbd\xdf\xe4\"\xfe\u0551<\xf2\xe0\x8c\xfb\x13\xe1:\xac\x01\x19\x94[=\x02d\xff^\x12\xcd\x12\n\f\xb1j\xd6N\xc8A\xad\xdf\r\u0190\x10X\a\xcc,f(T-XM\xf8\xde\xd5\xd2\"\x11\xbap\xa8\xf0\xd7\xc1\xf0\xe5Qa\xcb\x1f\xc1\x96\x8c\xc1\x8d\xaf\n\xc4F\xec-=\xe0H\u02a5w\xc2O&\x81\xba\xd0 i$~\xe0\xab~F\xdb>2\x9bz\xc0\xd6<P}\x99\x90\x13\x98.\xfd\x8fW\xcf\xd0^\x98\xeb0\x80\xba\u06cb\xc30ye\xb3\xa65\x98\xd8\xe3\xce\xf4\x90\xe0`\x00NE\x94ny\xe3\xb6\xd4P)\f0\xf8m\x02\nsF\xb9\x1e\xd9Zgy\xf71\xd0\x1f\x0e\x90\xe8J\xa7\x1a\x90\x14\xe3\xfe?Ne@\x90YE\xa0\x92!z\xa1\xbdj\xf6<H\x98\xe0l\xfe\x92\x904\xe6\x8cg\xf4fH\xc0Q\xc1\xf4\xe0\x99\x1a\x88\xda\xe7\x03\xbc\xe1\x94%\x81-\xafdGsLS\x12\x82\xe4Dr\xe4D\u020f8;\x1eE\x14\xe4\x1f\x04\xf5|h\x9a\u01b18!\xd74y\x1e\xf0\xb9\x04\x860\x80\x17@\x90P'L8\x15O\x98\x86\xa9(\xa9\xc5`\x93\u034e\xd2\x03n\x0e1EdA\xe4*\xc8\xe1JfWFQ\xf9\xa3\xaa\x1c@d\b\x10BA\x8b\x18.\xca,J*h`\xc5j\x16\x8f\x1eh\x87#%\xf9\x88\xf59H\xa0\x8c\x9c\xc8b\xe5Yi\x13\x80\x19H\x19q\xf8\xfc\x9f\x93=a\xa4vj\xee2\xa4c\b\xb2\a\x8e\xba\x9a\xa9I\x82t*\"\x05\x00\xe8\xb0u\x16Y$\x99\x89\xf6\xb5:\xa4a\x92\xcf2\x88Q\x15\x16!D\x80\xddu\r\x12\xa7\xaePa\xeb\a\x81\xff\xa8\xd1L\xfa\xb4\nB\xb7\x1d\x12\xd4&\x99\xbc6\xccN\x0e\xa6\x87\xe8Bqh\x05^\xb9\xba\"\xd4\xda\xd6\x02\x85\vV&n\xc3\x12Z\xd7\x1en\x92\x00Z\x8b\xa6\x15\xb2\u0502\xed\xab\x13\x95\x8f\xbf\xc0\xe5P\xb7\x06[\xaa\xfd0\x82\x05p\v|M=\xb99\x93I\xd5P\xc5Hl\x90\xf1\u0095US\xce\r\x91}\x14\x80i#\xf7\xf19\n\x91\x18O\\\xd4#\xbe\x98\xd9\x1e\x8d\x837\x81@\xd6\x14\xd0M\x85I\x80\x8b\xe9\xfe\\2lV]V\xa1\xc6\xf9\x9cm\x87c\x85\n\x02gM\u8b82>'\r\n\x03\x12wL=\x98\x9c\x1c\xc8 \u03ad\xa3\t\xadh,3l\x9d\xd3\xfce\x14\xd1\xda:\x02f\"H\xbb\xe76D\x18%3\xb0\x0e\xacz\xc1\x18\x95\x10\x00\xd65T \r\x98\xa4\x95\xbb\u03bdiU\x06)\xbe\xb1 (V\r\v\xce[75\"\x06\x13\x93\x824t\xccy\u0402\xdc\xc8\x00\xca\x0f<\xba\x10\xbd\x8c\x9f\x8d\xb8'\x0e\xac\x02;\x85\xe2>@\xcf\xda\xccy\x14t\xce\xe3:\x01\xbf\xf4\xd4=\x9c\xc6\xce/\x02\xdd\xef\xa1\u03af\xc6(+I\x16 \x00\x1e5<\x11?\x80\x84B8|,9\x92\f]\u034eV\xbb\v\xd4\xc0\x06\x0eSI\b>\x84x\xd4\x01p\x17>v4\xa3g\\JS\xe6\x93#\xf2\xb1\xe7v\x83jgDo\x02\x91\xc0Q\xc8\x03\x90\x18\x03hs\xe4qh(F\u0443hK\x12br\xdb\x0e\xd3\xdc3}\x15\xc3\x1c#\xdb\xf5sf\x9d(\xaa\xd2T\x02\xfc\xb4\xb4H+:!1\x86\x94\xc9S\xd8P8\xdb\xee:1\xa5s\t\u02ead\x85\x03GJ\xb8N\x95\xcf\xe9w\x1eL?\xaa\xd5\u028d\xcc\xc4\x11\x00oV\xcb%\xbd\x13\x96G,\x87'\xaamy\xc0\x8e\x1c\xd0C\x0e\x18\x00\x8f\x18\x12\xc4\xd8\x00\x98\xa5\xb5\xcd\xde\x00\xd95\x15\x0fr\xcf\rK%2D\xd8b\x82\x06tT'\x88t\xdc&@\x94\xd7B\xd1O\xac\x9d\xdb]\x11\x9df\xf0\x10\xe9\"\x89 \xb4M\x80\x0e\xc0\u040d|\x06\xef\x89c\xdcl\xef>.\u0236A\x04L\x0f\xd6\x1b2b\u03fd\x10\xcc\x0f\x14\x8bV\x12J*\x9fc!\x19\x05\a\x0ef\x04R\x82%-\xf3\x8f\xe7\tF\x02\xdf\xd5+\x01\x88\xe1;o\f\x1b\x88. \x85/E\xc1\x82\u00a4\xc1`\xa9\x95}\x04\x95\xa3`de\xa0\xfb\xa2b\xd2w\xb7\xa3DI!\x10\xe4;\"\fiz\xfaOE\xdb({\xeb\"\x1d\x9cK\xd6\x03x\x89\xdaL}\xe4?\xd8\xdae\"^w\x96gG2\xc1\x03\x95\xf6[\xaf\x93X\x17\"\xa91\xbf\x99\x98\xa5\x01\xf4\xee\x11<\xc4M\f[P\xc4\u0146\x94R\xf6\x11\xfb\x83jK\xf2r\x13\x05j\x06\xd7+\x03\x925R\xf0\xbb\x84h,\xf9\xe6\xf8u[o\x90\u0630\x92\u0319\xcb\xc8sK7b\xfcB\xc4&\x18\xe6=h\xa3\b/Y&\\\x91\x19plR\x90l\xfex\x8c>\xcbi\xbb\xc6<o\x13\u044dCe\x98\xa3\x96\xa25O[^\x9f\x0f\x8eE\xedR\x80Xq\x93\xb0\x9e\xdei\u05cdS\u9f74G\x846\xab\xdcLL\xad\x03\x15'{\xbcd\x943\xfc\xa1+z^\xb5\xa4\xbc\x01\x1c\xfe\x83n\xb5\x97\xb5{\viv\x1f1S\xbf\xba%5R\x8f\xfd\xc2\u007f;K\xe5(15g\xaa\xc6%(\x8f\xf6hPu#k\xa5]U\x01|c\xb0K\x00\xe2\x02\x12\xa1)S\u063d\x1a\x056\u051d\x94\xfc,G\xa8\x04\x15\xe9\x01\xd0S@\xf7\xfa\x85\x85\xfe\x1f\xd1\x0fG\x94\xec\x81\xfa\xa5\xb5U9D\xcbO\xeb\x01\xb0\x86\x8a\xe8!\x98\xfe:h\x1f\xfc\x96\xcd\xf0\x1c\xa4\xf7>P\x01\x0f\xd2P9\xa0$~\xff\a;Y\x1a&R\u0308q\x88\xa1\xf9\v0V\x8a\xe0/\x87\x9d\xc9f4\xfb\xd70?\x82N@\n+\x95\x02/N\x12M\x0e\x16n\x13\x8e\xfc\x88J\xcfU@o\x933\x9fW\x11\xfa\xdc\xdfY\xa4\xc9+\xe2$\x00\xca +\x9c\xc2S\xef\x955~F\xb8(\x96\xf4\xa3\xa8?T\x1bn\xfc\u05d9\xdf\xcbv\x01\u0718\xe5~\uc73d\x1e\x03\u007fMpk\xd3@\x87\x85u\xe1\x15\xfb\x93 \xeaV\x9fE\u04c7\xf7\xed\x9ck\x90F\xcd\xf2\xad!P#*J\xc13\xf0Fj\xbaL\x81u\x04\x9f\xa0\xbe.S\xff\xf0\x90t\x18m8D^\xe9.M\x82\xe2\x0e\x03\x97\x8aU\xd4s^\x9dGW\x8a.\xb0\xa5r\x81\xe5?\x05\xcd \xfe\xc5\x17\xc5,H\xab\x9c\x11\xf8\u06d1'\xa8C#{RK\x85D\x15\x03\rW\xd2\xdd\x00\x1f\x95\x11!n\xab\x15\u054bjj\xb8m\xe9\x00\x96\xed\uc419\xe4wv\xd0\x12_T\x11\x9c&\xa1_\xca\x17\u01c8\xb74\xa8\v\xab4\\\x01\x18\x1e\xc8\f\xd1sc\xb9\xa8\x86\x88\xe8J\xd7\xd8/\xeb\x16\x15\x98\xe8+dQ\x94T\x91\x12k\x9c\x834\f\x0e38\xc1\xed\x0fd*\x10U,\xcd\xc7DX(\x9e`\\\xa7\u058f)\r?2&\xdf\xfc+\x14\xff\xbd\x82\xb1\v\xee\x84\v\r\xdf\xc2\x17\x83 D\xa5\x84\xc8/\x85\xf5\xf8\xae`\a\xa3\xbb\xa0\x0e\xe4a\xc0}dx\xff\\zKTh\xabc\xe9\xa5\xe1~\xb2\xbe\xdc\x00\x86\xa0\xfaS\xe2\x1fq,\u0268s\x16-\xb9}B\xe83\u036a\n\x91\xdf\xf2fJ$\x02\x8e\xd0 1-\xddq\xd7\xfd\xa7\x15\xd9\xe7\x80{\fm\xaeN\xc9\xcb\xe3\b\xc0\xd1\ns\xa3\x87\x9a\t\xb3\x83:\xd1\u1373|\xdbYz`7\xec\xc4t\xec\x10!1\xf15\x15\x17\x1b\xfd\xbdbCy\x93\x8f\x1a\xbd\a\x80\xb3\x8c\xbb+\xa6\xf9v\x82\x83/\x0f\xeb=\r\x84\u007fu\u1aa6\x18\xf0\xa6\x88=\xdc\x14\f\xc9\x11\x03ft\xbfmx\xf2}\xc2\x19\x84\x01\x8a\xa1\x1b\xf0\u0250(3\x98\x99j\xe2\xa1A\xd9?\xcf\u0313 \xa0%{\t\x96\xb0\x06\x94\xfdY\xb7OkoR\x89?\aE\xc7-\x852\x1ep;\xbav\xc2^.#w\xa9\b[\u007f\x8d\x18[5\x91=I\xae\xcemU\xf6\xdfT\x8e\xea\x89*\xc8c\xf3M\xf61jz\x8a\xddo^\xf9\xa6\u0317\x1aK\x19O\xac\xed\u0093\x15\x13IIj\x8f\x95\x10\xb0\xb0\x95Q\x13I\xb2\x0f\x80?\xb9\x8d\xce\xf0\xb9<\x86T\xea\x00|TV\x1an\xe9\xf3\x1b\xa0\x86\xed\xf6\x9c\u007f\x8a?\xfe\x05\fU\x1d(xhH\x848\xaf\x9e$7\x81QF\u9d55:;\x82f9\xfc5-N\xb9V\xb2\b\x8a\u0585qeh\xb4+\xb8\xab3hE8\f\x05q\xec3\x82C\xe1\xa5;\xd1Y\xcd|\xeb*b\x88BO\xd3\x0f\u007f\xa7\x95\x80x\u03e8v:\xb1\xef\t\x1dz+oV\xbb\xeb\x87E\xb6\x904b\xaf\xc8\xee,\xec}\x9b\u0092\x03\xe2\xc6S\xc4h\xdb\x00B\x02\xcdd5\xd4G\xaa\x13\x17\xfadr+\xbd*\x1c\xf7*@\x12\v&q\x1b\x81\xacp(\f\a\x80\x1d\xcb\x03\xeab\xa1\u01ae\x8a\xfbA\xa6\x86J\xba\xc3p9yl\xe9\xea^\xc2\xf0=i\n\x03\v\\\xf4p\x1b\xdc(\xa2[\u0762Du\xac\x80\xe4\x19\x1b)\x9b\xcat\xc2\xec\x9c\xdc\xe1\x00\xae{)U\x95\xb5\x1f\x90}r\xe3\xb3e\b\xa7\x15\x14\x1d\xb2+~[6HO\xa9\xc2\x136\x86\u065d7#\xa6\n^\x11\xe2\f\xf8\xf4\x80M\xfd\xc0\x13\xd0\x13\x83\x1b\xb2B6\x9b\xd1\xc2L%o\u0249\xd0N&g\x19R|{\xb1\x84\x9a\xc5-Ri\x94N&n\x0e46\x14(L\x03\xee\xf1\xc0-%\xc3)\x1d\xf9H\x8e\xf1\x86[\xbeh\xebeQE\xa9\x85\xc8\xd1\xc0\x98\xa0_\x19\x95\xe0l\xa1\x12bp\xa00\x9a\u0667@8\xec\x1b\u0154\x04\xae\xadUE\xf1\x9a?\x9bg\x12DE\x02\xfd#\xb9\xbaLm~\xcb\xd3HZI\xb0\xe1\xc5'R\u0140\x12\xf8\xb6D\x9f\xff%\xc3p\x80\a\tM\xaa\xb8o\xc6\xe7\x9d\\J\x1aL\xa39\xbcp1\xae\xe4u<.\xe8\x1c\x83\xb3\xec3\xac}\b\xde)\x1eZa\x92g\xe7\x1f\xc0\x8c\x9a\x96\f\x14\x94@\xa1\xc5\v$\tRi\xf6\xe8\xf1\xa4N%CQ\xc1h\xa8\x90\xac\u079e(\u007fY\xef{{\u06d1\x03\xbeI\xaa\U000bc0f8\f\xacND\xefDZ$\x9b\t\xc5\aTV\xa9\xfd\xc2\x16\x02\xf9\xf66\x8b\x90\f\xb2{\x00\x00\x06\x90\n\x84\x87Q\xaf\a\xe50W\xf95\x95\x91<\x9a\xd1\xe4\u0638?\x82xD\x871Vr\xcf\xd1\xf7E\xb0_\x9a\xf9\xea\x16\x13\x8a\xc0@\u0114F\xcfA\xb9Ly\x11{I\a\xbc^\xea\x0eE\t&\xdcet2%\xa5\x19\x01%D\xf5$\xf3Kym\u0774\x9a\\\xda\xe3S\xb3\xb8f\xac8\x0f\x06w-\xdc_%\x93}*\xf2\x13\x12\xd8c\xad1\xb4\xe7y\x81\xbb\xf2\xcbi\u007f\xf8\x12\xa6\xe8F]\xfd^\x0e\x99TL\xf3w\xb6\xc1DP\x96r,S\x03\x06\x05\xd6\xf2\xc9d\x0eW\xc7g\x9f\x92\x02Z\xf4\x1d#Dl\x88yr+^\xbfb\xf7\xe4\xa1U\xac\x9b\xf1\xb3\xd8S\xab\x81\xd4Rt\xb0\xd6\x1e\xa3R\x1d5\xf0\\\xb7\xef-_\xe7X`\n\xc5\t\xef\xb8\xe8\xdd'\x8e\x11\x87\xf3\x05_\x95f\xdfA\a\xa70\x8b^\xa8u\xefV}\xbc\x96\xe4\xc0h\x87\xd6%\x04Q}O\xe4\\\xf5\x82\x8d0o>\xdeF~-|\u007f\x13kXP\xbb\r}m*e`!\xeb!\xb0\xda\xc4KC\x90\x1e8\x9c\u0229\"\x8c?\xa0\t\u02df\xd2\u049d\"\x82\x00\xad0cj\ucb0a%\x80TCE\xad\xe6\x19\x91\x8c|F\xa6j\xd499\xe1\x95\x13\xbep\xd1\\\xe1\x85{\xf5\xe3Y\xd9\x11\xac*\xdb\u029c\x03\x01\x14!\x19\u0707.\xcbQ\x14XP\x178*\x19\x17\x16\xfc\u025d`\u03b8\x82x\xc11\xfc\u05c5\x00*nGR\x83\xc0sS\x9am\x8f\xe0\xbf\xd5~\xeaX%\r+z\f+\xbf5\xb4\xb8\x91\x93fe\xe8W)\xbc\x80\bW\xc5I\xd5rk6\xcd*\x01\\Dp\xaf/\x92(x\xee\xf3\x19^\xedk^h\u05d6\xfe\xf0X\xfb\x17 \xbe\u007fO\x93m\xac\x1b(\xdaq\x00=\u03f5\u0611\xf7\xaf\xeb\xa0\b\x81\xbc\vJ\u0797f\x82\x00?D\xffy\x12\xf1K\x8a\xa55;\t\xb2\xb4\x03S\x90\r1\x8f\x06\xac\x95D5\x00T\x91\xc1z\v>\x9f\x04\x85\x82\x04\x14Y\x9a\x94\x81vC\xa6C$\x00Q\xa2b\xd1\xd1\x15\xac0\xd5\x1d\u0501O\xa3=d^\x9ej\u070e7\xa3j\xe4O/\xbb\x84l\x97z\xf9&;\u052d\xd46O\x11\x1c\u064a\xc22.\xf3\xfe\xf6\x8d\u03c7\xb9%\x1d\xa8\xaci\x18\xc3L\x1cvDW\x83FE\x90(\t\xb2xg\x00\xda_\xdd\xcbeTj\x976NU(T\x8b\xce\xd3\xe2\x9e-\x9f99\x89\u02fd\xb2(O%?\xcc$\xfe\xc8u\xbcd\xf0\x83\akg\xe6\xef\xa9\xf8!K\xf9T\xf0<\u0338B\x8b\x1dg\x84`{\x99\xd8\xc0>\x84\xefie\xa1\x00m\x1bi\xe1\x0fZ\x8c\x8e\xd9;\x8a\x85\xf2\xd8!\x04P{{6\x83d\xd9e\xf7tN\xd1\x17\xe20\xbe\xe1\xfc\xce\xcf'\\\xafd\xc1x\xc9{\xe5\xa2s\xa5\x18\u0273K*\xd8\xc9+@\x10\x8d\xb9z\xd8w!\xcdu0)\x05\x1e\x9c\xfa\x1f\xf5\u069bFp\nV\x16\xe1K\n\xac*\xaag\xa8o\xaa/\xe0\xe4\x06\xeaM\xca!q\x92\u02ab\xb5\xa4\x15\x9d\u05c8*b\xb4S\x9bz\xa3\xaft3\x96 \x8f\xf1\x03F\xf2\x1b\xc7\u007f\u0440e\x00\x0e\xbb\xc9N\x9b\x9f_\"t\ube4e{\xe2=\xa4h\xd8K\xa2&Pd0(<\xd9eQ\xbd\x12]0A0\v'\x02\x03\xb3\xf9gh\xd7\u0269\r\xce\x0fy\xb1\xa2\xf8le@!e\xbdPq\xa2\xd2:J\xaap\t\xe5\r\x1f\xef%/\xbc\x9b\x81x4&\xabj\xa9\x8dr5]\u028f\x14F\x9a\xbd\xc1m\xe3\x1a\x18\xee\xdf\xf0\u007f\x8f\xafq\x1fW\xb1\xed\xa4\u04d3(\x05\xec\xa0\x04\b\xdf\xdd\x14*\x84E\u009e\xec\x1f\xcc\x14H&\f\x11\x06\x10xA\xea(\xe9\xc5\xd60\x1d\xfc\x82\xae\xe4\x87\xfa\x1a\xfd\x94\xa2\a\x02\xb3A8\r\xf2:\xc9\x18.\xa1\xfa\xa6{\x1f\xad\xd9/\xb1\xf3\x8c\x8d\f\x8e\x88\xa2 \xfc~\x89[dP[\xa5Iw\xbe>\xc5\x13\u03b2\x97\u05611\x0f\xa1@\x15\x940~\xe4\x03G\xa4:\u07702\xb9%\xe3\xc2\\\xb7\x02rJ:\x00\xe7\xc6\xc1\x88n\x93\xcc\x1e!\x9b\x97\xe3\x94\x19\xe8\\/MbTkV\xac5\xd9\xfan\xc1\x87\xb9\xe9\x10:\t\x83N\xb2H\xe0\xf1\x9ei\xe2\xacm\x83\xf9\x94\xfb\u007f;\x99\xa2\xb2*t\x06\xefX-\xe6\xb2tM\x9e\xe9\xb0\xd1\u0228\xd9\x1f\x1bC\x01O@(7=\x13=\xccp\v\xaa\xc2\x13\xeb\xde\xfb\xc2 \xf3\xf3\xfb\xae\xf2\x83`d\x8a\x1e\x9a+v4\x9c+\xe36)=13S\xfa&H\x83\x83$\x9e\xcbb\xb8\x81\xe1\xeak<x\xa5\x19\x0e\x9ej\xec@\x1f\x98\xc0\x8a\x93\xf5\xff\u007f\xb0\xa0\n\x9eZ\xbe\xa0c\xc8YSS\xb3D\x80\x11\x95ht*A\xc3\a\xad3&\x86\xdd\x06\xd3\b\xde\xe5\xaay\x12\xef\xef;\x8btP\x87\xd1Hq$]\x9a+\v\xf0\x98GvVQ\u0410F\xcfK\x1e\xc6C\x04!\xf2\xf4`\xb8f\xe4\x14\u04d2Cn2?\xe0V\x8a\x00\x8c\x81-\xa0\xea\x94\x1b\x16\u0273@%\xe1\xda\xeb(\xe5\x14\xfd\x8bJ\x81\xe2;b\xbd\xa2\xc7!\xa3\x1e\x90\xcc^SC\xa9v\xedJ'\xbf\x19\xa6UN.\x8e\xaa\x1a\b\x13\xe1\xc1\xa2W\x92\r\xbb\x15`\xd9.\nt\x98\x14\x10L\x81\xd8.h\x88\xb8\x04\bY\xa3\xb8\xa5U\x91d\xfb\xf6\xeb\x19\x83\u05c5\x89\xafH$\xd4 V\xf2\xf8y\xd9\r\x11\x10\xea\xcf.\x9bA=\x05\x84\x01zo\x14\x83\xed\xe9zV\x89\x06}\xc8u\xbc[\xf5\x95<\x14\v&7\xc1\x9e\x91\x1c\x00=\xf3\x19A.\x1f\xb5\xeb'R\xf0R\x98\xd18\xd0\xeaH%\tK\xafA\xad,\xfb\x87\x00\u0285\u050f\x97\xa0\n\xa5\xa7\x11\x0e\x1a\xd4sf\feGmfm\x18\tk\x88\n=\x9d\x1d\x912\xb0\u0270\\[\x92\xd1I\xf4\xf4\x94N\x85=\xa4\x80\x91\x923,\xabR\xd3]\f\x9fa\x9b\xf9\x11\xc2\x02M\xc4-\x13 \x84Q\xa4\x11\xd4\xf4\xbc\xc8?\x9e\x16\x02\xcf\xe9v\x06\xe6\xa7_>Y&*\u0219\u0468\x9a2\xa8\aiY\a!V-<\x97\xd8Ik\xebCju\xbc\xc0\xc7hz\xe7\xd5E\x8d\xe9\xcd]vN\x9b+\xe2\xec\x9b\xfb\f\x1e\xf2\xeb\xca\x10RI\x98+N3M\xda\x1d\x92Pf\x1c0\x9c\u0798l\x84\n\xf2\x95\u069e?t\xf96!p9\x10s*M\x8e\xac^\x86\x8b\xa8P\xf5V\x01\r.\xa3 \xaf\x16\u007f\xacax1\x041`\x85\x19\x146z\x13a&\xd3q\x1a\x8cg\t\t\x8f\xf2#\xf3\xa5\x0f\x0f\x0flf\xfa5\xee\u00c3\xe4[\xa8\xfd\x92\x05pt2o\xb6\xaasp_\x87\xecL#\x90do\x9c\xdaH\x1e\u7f4e\x10\xac\x04u3\xf0\f\x13\xf4|8\xb1\xe1'\x14\x88\xc2T\x9d\xa2\xf9,\xcf\a\u0286h\xef'\xc6\t{&5\xd62\to-_\x04\x04\x8d\x8a\xbb\x1dv\x88\xccF\xa0\xb6\x8b\x03\x82\xb5 og\xf1\x8c\\b\x9f\xe7&\xcb\xc1\u0447\x90\x04\xddC\xba,\x82\xa0e#\x01)\xa1$n\xcb\xea\x8e\xd2\t\xa4\xfa\x18hM\xa5\xb3a<\x8ez?\vk\x15Fo\r\x9b\xe3\x16\xc2IP\x06x\x91\xfePO\xf9\xce\xd9\nV=\x04|<\xa6\xd9\xcb\xe1\xc2f\xb6\xae8r\xda\x1d\xfb$\\\x16\x0e4\xd7\xd1{<\u028c=i^Q\xf2\xc0kJ\xc42MT5>\xf9o*\x10!\xe3=\xe6N \u0678\xfa+eYqP\x8e,\a\xeb\xb4\xca\xc4\xcd #hT\xeby\x82\v\t\f\r\xc3y\x8b2\u06b6\xa6\xc1\xd7\xc53\xc05\r\xec\x1f\x1f\xf8\xdfK\xf6\x90\xa8\x1d\xa2C\x90\x11\x96\x18\xb7L0\x8c\x99O;,\xed\xed1\x14\x82IG\xb6\u05de\x98\xef\xaf\xfe\x11\b\x9d\u01f5r;\xbb\xb4%D\xc0\u03b1F)U]hn\x8b\xd8\n\xb9\xaf\xf2\xf4R\xc0_Au\x04\xab\x92\xbem\x05\v\x01\x8f\x92\x01\x98\xfc~\xf0A,7 \u007f\xbc\x18\xf4\xd0\x11\b^\xc2\v\xad\xbb\u0560/\x99H'\xed\\\xeb\xad\u04bc\x14\x02\x04\v\xbd\x01B\x00^\xacL.\xa4T \xeb\xd2(\x06\vu\xfa\xa4\x9b\x05\xfeW\x11u\a\x82\x10\xc0\v^d\xac\nQ*I\xc2\xf8\x81Izc\xa2\x872\x92 \xb8\x8e\u06bd\u03aa\xd79\x91\xbc\v(\x98\x01!J\xf2\xc0\xb0`\x92\xfdL\xc3k\xfb\x82\xf4Y\x90\x88\xb8fGWR\xa3\u0404\n\xc0H[\x9bC\x14\x01]Ii\x85\xcb\u066f\xa2T\v\xb7\xa0\f\x87\u0180\xde\xc2f\xd1P\xd5RF\n\xf5\xb6\f\f\xa8\x96>\u009e~\x1b\x04^\xe6!z\xac\x14a\x90%\xa4\x06\xf1xl\xb9% \x8a\xbb\r?\x10\xf0\xf7u\xcdX\t\u03b0\x05\xbe\xbe\xa3\xcd+,\u02baT\xf2\xbe3\xa2`\x92\x9b\xacl\n\xa26\u02c0|\x9e\xacSb\\\xb7\x1b\xf7\x84V\x00K\xb4\x94Z#\x12\xbe\x8a\xa8`7J\x03@\x04Bb\xdc\xcd@\u0655\xe8\xa1/\xc9\xda)2\xc2\x01\x05\xd4\xcc=\xdaL{e\x9f\ap3\xf3\xd91\xa8:\x1f\x91\xfay|Z\xe6~\x14\xc6M\x1c\xacV\xbaN\xaf\xe3t'`\xe2\xa01\xa4F4P\xa9e\v\x87?\x10\xfc\xed\u350eO\x01\xc4\xe0\xfe[h\xc1-\xd0;\x17!\xe2\x9eG\xc0\x00\xd4\f\xb7\x01l\xd2\x05\xe1\u031a<\x93\xbb}<\x92\xf2\"Q\x1d\xdb\xda:\xf7s\x9a\x98\xd4'\xbdU@\xa3}M\x88\xb7\xdf\x11D\xb4N\xd18\xb8\xb3\xa4~$\xa8\xed.\x1c\xfd\xe6~\x0f1t6g\t\xb5/l\x14\x9a\xbd\x1a\x850?l\x1d5\xcb\xef\x0f\xe8\u011d\x94\xd39;\x97\x87\x1e\u05d1\x8f\xad\\\xb5\xec,\x9e\xeb\xbfB\x16\xf0J\x0e\xb4KD6\xecl\xf1\xb9\xa4\xee\xf1%\x83\xd4\x14\xb9~\x95\a\u04d9\x9e\aptVbg\xab\x10v\x81\"B-\xc4U\xe0\xd7\xc1\t\u0298\xcf|4?<\x16\xaf\xa97QL\x93\x85\a9|\xae\x14\u00a9c\xa2\xeb7d(\xe0\"\x92\x1db4+\xf8i[\xdc\xea\xa36\x1dZ)\x8c5W\xfd\xae\x9c\x98 \x9f\x15\x1e\x89\xe2\x14o\xc0\xb6.\x1dVh\xa6\x92\xb4t2,\x9aC\xcb\xe0\xf9\x81\x00\u01f4\x92\xcbA\xf2\x98\xa3\x02\xf1\xfeR3\xad\xea\\\x12;\x85\x10\x87\xa1\u015c\xda{\xeb\x01!\x98\xf9\x95\x1b\x94\xce\x19\xae\xba\u045b\x0e\xb8$a\xc5FL\xf5\x8cu\xf2\x12\x1b\xd8\xe6\u04eb)>,k9\f;b\t\xb8$\xa57\x8e\xd0\xc2Y$\xd7\x10\x85\xb6\xa2\x8d\u046dR\x01P\a\x95\xd2\xc21\x03_\u007fA\xb4\x1ff\x81\xc2\xd9\xd1\xccKT\xff\\\b@\x00\x82\xd9\xe6\x9bX\xea?\xa4N\x17*\xe51b\xba\xda{\x8b\x06z4m]\xe5\x83\x1d\xc3\x1b\xf6\xe3\xa2\xc4a\a\x8b\xd9\xe6\x88WQ\nz\xfd@5\x16\x97\xaaNH\xfeJZ\x13\x955\u00db\xfe0\xbbL \xffP\x13\xe7(\x9dc\x12\x02;p\x0fG\x98\xfd)N\xbe\xe17nn\xc8\xd88?\xe2\xe1\u042b\xa2\x99\x04\xa0\x88<M\xd0Cjo\x1f2\xbc\r\xe6\xb7'\x0fL\xc4o\xb5\xc9\xf7\xd9D<\x05l\xc9y:\x18k\x1ce~\x0f\x93#v!$\xeb\xa0T\x91\x88\x14\xa0\r\xebz\x94\xbeAI\x0f\xe07\u0490\r\xf7\x04[\xff\x10$\xf0@\xf6Z\n\xd86\b\xa5\xa4z\xdd\xf0\xa8\x06\x9eq\x81\xea&\u05a5\u00b2\x80\xecVh\x8c(+\x02\x8a\xd6\x02\xe6\u007f\">D\x0f\x18\xf4\xec:eN\xeb\xc3\xee#\xee\x87\x1e\xfa\v\xe0R(/\xf0H\xa3X\x0eG&\xbb+\t4X\xd2\xdf\x01.3|\xfdWZD\xb9\x99\x04;\x9e\xe6\x0eq\xed72\xe0jR\xf0\xc0\xd8\x10\x0e\xb0\ued60\xf8\x04\x94,\u0671SC\xa9\x92My`~ku\x9a6\t&\u0132a\xdb\u027fa&\x9d2\u0334\x10\xb0\xc4JQ\xfa\x87\xd5xW\x97#\xe4\x15\xaf!\xf4s\x87\xecc~.\xbe\xec\x0e\x11\x9a\x14\xe1\u0516\u0524\xcc\x0eA\xef\xb86\xd2k\x83\xac\xbc\xc6\r\u03a8=\xfc\xa6>\xc5\v\xee#\x90\x94\xf8r\n)\x9ey\"\x99\x14\xc5d\xcf\xd5\xc1\x029b&\x97:\x80@\n\t\x93\xc9\xc4 \x16\x9d\xee\xe8\xee\x15\x10Oy\xd5\xe3\x89f\U0006b484\"\xbeK\xd8\x17^\xb8>L\xa3\x9a\x16\x02\x06\xf1\x88\xbb^$_\xad\x1e\b~\xd3tBzhOB\xcf(\x89\x94\vja\xe0\xdav\x93\x11\x93\x99\u074a\xb4\xd1\x1e,\\XP9^\t\n\xd0y_\xa6^\xb8H \xfa\xd8\x00\x94f\xab\x17\x05\xd6\xd2c%R\xd5Y\xe6g\x8f\x9b\xf3\xc4\xebEp\xe5Qm\x8b\x05\x17\v\x9f#{,D\xfd\xe9\x8f]\xa9\x8f\x13\x97\xa9\xaaR\xa5|'\x1c\xc7,I\x06\x01\x12\x0e\x98\xa6\x19\x1b\xa8\xc8\\Q5m\x9d\xa3\xf9%\xdc0S\x0f\x95W/\xe52\xe6\x8a`\xe9N\xa7\x03zpY\x1cR\xbc\x12Gad\xd3<(\x02\xb5#$\x82\xb8\xe3,\xc1\"\x12\xa0\x94m\xccQ\x1e\xc8.C\x12}PX\x19(\xeb\xaao\x8b\xe4\xdck,\x99\x1a\u0789\xd4\x0e\xd1,\xd3\n\xcfl\u07df]_S\x90\xaf$\x81\xc3\x15\xaa\r\xc8w\\I\xc32,\xe2\x8cVR\xbbML\xf1\xc3s9\x17R\x02Ad\xb1\u07b0Y-O\xc7\xce+V\xb7\f\x068D\xcfK\xe2\xe1li\xed\x9a\x15\xe5\xeel\x8a\"\xb2\x0f\xa4u\x18\x8a,0\xffl\xbd3\xdb[\x9d\x9e\t\x83v\xe2\x80l\xb7\xa4\xf7\x84\x06\xbd\x05+\x1b\xf0\xa2\xa9.\xd1m\xd5\xc6\x15l\x14j\x9c\x8e\xc2:l,\x11\x01S\xb8\x9d\x90\xaawz\x86\xf1&^\x16$\x06g<\u00b4\xa0\xf2M\x1eV\x1c\xc0.v\xc5*\u0104\x8805:\x88%?\u04a9\xb0\x1c\xd8\x19\xfedw$\u042e&\x17E\bk\x10\xae\"!\x82\xf8\x98H\x1fe_WA\xc1\a\xa0C\x95\xd9\x02\xc3b*\\(\xea\x1e>\xb2U\xb0l]\x01\x80\x91\x18\x14Up\x1c\x85\xa5\xd8n\xb4\xfb\x99\x82\xa51\x98\xc1\x8e\xb4\x85\xc1A\x0e\x1b\x16\xc4z\x93yKnV>JO\u04b3\xb3U\v\x93X\x0e\xde\u05bc=\xf7\xd0a\x82\xbc\xb1\xe8\uc838;I\xa3[\x14\x13i|\xeb\x9b8#\xb7vg\x1c\u04a2\xfc\xc6a\x9a\x80\xa7\x16\xacFj\x01\x8b\xfb\x97\x85\xbf\\\x95\xa2]\x88\x9dJa\x96x\x87\x19\x01410\x13Ci\xfd\u017b\xdb\u0438\xbc\x9b9\x9e\xfd\xe6\rVp\xa4\x12\x1c\xa5\u02ad\xdcfC\xa7\xa5]OV$\xae\xa7\u04c8!\xf8v\xbao\xd2\x06\xf4\x87Qx\xd2+6T\x02B\x8d\x81F\x8b\xeb\x13\"a6$\x83Q9\xd015\u061bj\x1bPB@\x99\x8e\xa4\x8b\xbeM\x99\xb2L\td?31\x99HX\xdb-%\x06p\xbd\xfa\a\x9e\x89'\a\xa7\xfeEOh\x9fMBiJ\xc5\xfb\x8e\xa1\x82\xfeCR\xa6\xe7\xf8\x134\xba\x84\xd0\x1e\x89\xd3\xe0\n#\xaf8nBNu#\x9c\x1bD\xc3\xc7o\xc1\xb9\x89\x98\xb7{\x83i\xd4=\xf0\xb0\u007f\xdcy|\fP\x9d\xe5\x95\xf1MR\xc6\xe6\a\xb9\xfa\x80\x99\xd0\x0f\xea\xa9\x10\xf2\xe8\r\x01Y\xd2|9ZY\x8a\xb2\x11W\xe4\b<\xf7Q\xf1\xd1\xcf\xef\xef\xa1~\x16v\xe3<\x80\x19\xff7l\x03\x8d\nD\x11\t\b\x1e-\x8c:\xdd\b\x83\xa4a\x8f1\xbf\r\x8f\x04\u01c9\x00wI\xf3\xc50*\xc4\x13}\x11O\xa5.\xa9#\xf7\x03-9\x92\x1b\xdaqp\x16\v\xf3=\xbf\xf8\u034at\xcaj\xe1G\x03\xb7\xe9\xf2\xce\xf8\x97+\xb6\xae\x83\xf4\xf8\xafa\xca|s\x1bB\xab\x1b`q\x9c\x9f)h\t,\xec8A\xecC\x14\xe9i\xfd\x94!\\\xb1)_\xa2/\xd3\x19`\x97\x12\x86\x1d)\x98\x82\x88\x9f\\:\x02\xbc\xd93+o\xc1\xe0\x19\xbe\u0423r\xd4\xdb\x10\xf9\xafb{\xeb2\u05ea\xb7\xdb\xc9|r\x85\x1f\u05d0\xb4\x02\xc5\xe1\xb8c\x89i\xc8Y\xf3h\xee\xa6\xd1W\xaa\x8a\xe7d\x0f\x97E8\xc2@\x96H\xd7l\xf5\x02\\\xd2\xfe\xae\x82\xfa\x87\xc5\xed.\v\xb4\xa1\xde\xed#\x9a\xf0\x1amn\xad4\xc1\xe1\\T\x11%\x0f\xd5\x1d\xa5*8\xc1\xe4\xd1\f\xfd\x8a\xc2!\xbc\x86\xe9\x99\x15\xfe\x1b\x04\xb1\x1dI\xbc\x99t\xc5I\x03\x9e\xa0\f4\x94\xea\b\xa4p\x8dP\xef)~$\x80j\xe6`\xe5\x03#\xf9G\f\x87(y\xe7i\x8e\xe0\x88<zb\x86yg'\xa8~\x966\xab\xc4\u054a\x85Dl@j\x86\x98IL\x8e\x9f-\xf82d\x1c5\xc2\xd5\u046d\xf2\x97\x96\xcf%\xc0S\xf3T{=t\x18\x85L\rp'\xb6\xbe\r\xbc\u0402\u0791]\xb7\xfc\x8f*\x15\x8d\u05ec\x1aq\xac\xb4D\xd0\x1d\xe01<W\x89\xad\xc4$O\u0167b\xb8\x84\x11X\xddI[c\xffu\x89H%\xa5\xf1\x98\x10\xd6\xed\nPid\x9d\x80\xcb%5\u07d9v\xf9\x1aL3c\b9\x8b\x15\xc03+\xe3QS\xf4\x9b\x1f\x05\xc8\u07a0\u02a4i\x04\xa1\xa9'\xca\xef\x8ajP\xc6^\xa4\x8c^\xa4\u007f\x83\xdf\xc7>\x1a(\x8a5\xa1\xb4\xf7\xcd\xff_\x10z\xe8f\xe7\x9f\xce)\xcc\xe1\xeddR\x9e\u01b2\x98\x0f\x10\x90*\x82\xa4\x8d\xa6 M\x03\x936a\xea\xe5\x1e@\x1d\xfa\x17z\xa4$#M\xd9-\x0e\x8e\xb9H\t\xde\xeaw\x92\x16Bi\xf3\x85\x1ej\x01\xe2\xab?!#\\\xac2\x16c\xa6\xd8\xdeYZE\xcc<\xdc\xf05qRc\x98\x83/\x19\x9f#G]\xc4\xf49B7t3\x01\xa9\xb9\x8e\u024e\r~\xb5\xd9\x11h\xb2aL\xf8\u0624\u08d8e\xfd\a.\xed\x8dg^z\xd6X\xfbK6\xa8Y\xbd\x1fb\x00\xe9\x00\x03x\x1c\xb5\x92\x066\xe4\xd1m\x8ct\xd5\xf4t\xe9\x10Z:t\x88\xa7\xab\x145\x98\xf7q3\x8e&\xc6my\xdd\u007f\xb8\x16\f%+a\x87\xaad\xf9\xa0\x90\x8a\x15\x91;\x8aP\x93\xd5\x18\x86\xd8\x05\xf8\xe4g\xb3\x85\xdc\xc7\x03\x81\xf1\x1a\xa4DQXi\xb7>\x13\x9fUn\xf9B\x88\x8ai\xa3\x85\x10)/PCO\x19~s\x92[M\xdcm\xf0X\u03c8f\x8f6\x9f\xfc,\xf5\x15\xc1\xa1\x9fp\x95\xc5?/\xa2\xe8\"\x886{6s\x8eq\xf5\x81\x15@\x17\xd2\xdeVW\x9d\xff9Z9;\xe8 x\xb3=?H\xe1\x9e\xf0}a<\xa0\x06\x02\xf9\t\x9c\x873\xeb\x17M\xed5\xd3\x12\xb3\xe2j\xae\x16:\x1d\x96_I\x11\x1fn\xd17\x17\x81\xb3\x01\xe5\x89#\x06\xf9\x03\x90\u04fceb\x87\xa6\xb5\x9c\xe9# \x8c\xc6\r\x1f\xef\x91\"\x03\xf2\u053f3\x83\xe6o\x9a\xd6\xd4\v\x880}kY\xfdT\xf2\x86\xbbE\xb8]Y\x82\xd0\t\x1bD\x9e.\xa8\xcf\xe7\xf4><\u0693j\xe0\x96\xd2\u0688\xfc\xb5\u051f*bXl\xca\xfe\fJ\x95\xed7{b\x99\x0e\u018aB\x18\x99q\"\x9f\x18K\xa3\u0596\x15b\x8c\xaa\ve\xaa\x82VG\xf4\x99Hs\x88\xe5q@\xc0\f\xe3\x94\f\xb1\x86\u03a0*\x83\xe8\x9d&\xf4\vA\x95\x01\xc7Q.\xc5T\xfd\xdc\xe5lI\x85:\xae\x8e\xc1\xb3\xcd\xf0\x1bX\xb5\tk1\xd7\xfdq,-\xf2S\x0f\x98|\xe8l\xb2\x1e\x13;\x91\xdf\x1f\xd1\u00bejI\x06F\x91\xcf\xc1T\x82\xfc\xf2\xf1!I\xc1\x1dt!\xf0\xcd\x1aJ\t\x1c\xa3\xecb\xce%2\xcf\x0f\xaa\x85\u0379L)\xfb\xf54\xa7\xeb\x93v4@\xa4\xb9\x06\xf1\x8d\x86\x0f\x19\x06\x19\xb6\xc4\xf9\xac\xda7\x14\xd9t\x9a^\x83\x91u\x8by\u04fb\xabE\xc5\u007f\\\\yd`Y\x87\x82\x88R,\x1c\x106T\u0748\x88\xb6T\xb6G\xee\xa9\x16\x9d\x02H~\x83\x10PZ\x97\xf0\xfc\x03\x1d\xf1\x94\xb8p\u043a\xa4\xb6:\xc9F\xb3\u04f6n\xa0\xf6(\x021\xff\x15\n\xd7^\x91]\x05\u00c8\xb9\xf1\x8dm \xd7\xcfQZ\xea?\xc8\x02\f.\x86\xa1\xc7S\x01\x14Rex\xf9V\x86\xf3t\x1dX\x80\xb2\xc8\x1e\xc9dJ(\xe6\xbfN\x84y\xddB\x11\xed&x\xcf\x04\xa4\x84>\xd9\u0466B\f*\xd5=\x0esG#\x1b\x8f\xe0\xea\xa5,\x9cV\xb8pk\x9d\x11\x87L\x06\t\xd8\xedC0L\x13]\u01bc\al\xd04,\x9a\u05a5l\xe2\xec\xb8za\u8eda\x99\xb5\x1f\xe9\x14h\xdb\xd2|T\xc2;S7\x14A\x91\xf1t\xd8\x03\xb8\xe8\x9b\xfc\xd0A\x95\xf2\x0f\xc3\xc6e\x85\xf2\u0508\xa4\x8eN\xe6\x16\x85\xa1U3\x87\\Q\xd1Z\xb3\x86\xa1\x88\xe0\x9f\x1bBd\xe0\x19\b0\xbfJ\xc0\x17\xd4\xf1\x18\x19E\x84C\xa9DHXE\xbc&\x12\x12\xf5\xfb\xd9\x1b'a\xb0\u0753v\xb0\x02J\xa5S{\x91\xfb\xd8\x1b\xe3G\x14\xee\xdf!HfqB~\xefG\x81\xf1\xf3\xd8\x1d\x82a\xa6S\xb8\xe6\x12\x81K\x9f\x14\x1a\a\xcb\xc8\xfd\x8c(3\x8du\x8f\x96\xf5\xdd]\x9a\xbc[\xe0\vc%\x1b.\xed\xed\x95O\n\x98\x8dv\xdc'\x17\xa2\xe7\x83\xc0\xd1\u0169\xf9\x9e\xea\xb5;h\u04f2\xb4i]4\xb4\x97\xc0\x01\xc7\xc6\u00e2)\u04ebb\x10O\xa9t\v\u007f0\x983\b\x83*\u25d9l\xcd\n\xed\xd0v)u\x10\xf0\"^\x92\x88\xaaM\u936e\xc9e[ o\v\xaeg\xf7\xab\xca\x02\u045b\x1a\x1a\x00\xec:-\xe5yB\xff\x9c\xceW\xd17\x03v|6\xd3u\x1f:\xb0\xb5XY^\xf2\xeb\xa7V~J\xcfO8\xf7\xb4\x87cX\xa4\x04]\xf3 \xba\x89\xc0D\xbb\x0fO\xf5\xc942\xcc\x10M\xea\x81Jp.\xa9\xe6K\x97\xf6\x80\xd7\x14Z\xb4I\xfc\x8e\x91\x91\xca\x1c\xac\u42aas\xb2\xc6~\x89\x13\x02\xab\x18Q\x17\xc9I\x82\xa2&&\xc7B\x04\xf8\v\x11\xba\nc\xff\x18\xfb\xbc\xdc\x10\xf4\xc81\x909A\x99\x92\x145\xdfV\x86\xd0\x12\xe4\x11<1Q mX\\\\A\x83$\x9b-\u007f\xf5\xc0\u0213L\u0271;`\xed\xc0\xea\xdc\"[\b\x03J\x19\xa4#\x8bI7}\x97\x1d\x98\xd7/gQ:>\\\xe3)7\xb0\xd6\x19\xbao_\xe0N\x9av\xe4\xeb\x13\nz\xdcU\xe5\x17\xae\x1a-\xeb\xf9\x12\xe4\xa3A\x1b\xacK\xf2\xc1\x17Q!\x937\x10\x89\xc032&\x95\xc3\xcaL\xa7\xdfi \x8a3@\xdf\u0452\x1aOD#\t\xbc\xf6B\\t\x1b\xe2$z\xcd\u03a0)\xa6\x939\xd4C\xc5\xc9\xdbSI \x17q\x95\x80\xb0\u04f2Tpv\xe5\xb5\xfe\xf6\n\xea\xa7J\u0314\x18\t\x17 (\x17Z!\xebD6.\r\u007f\x19Q\x17\x1f\xf7\u0766\xb2\x8f\x98\x89pE\xe4\xf6\xcb3U\xdcF\xcf ,|\x13m.\"z*\xaaA\u0201\xfa\x15\x05\t\xa0\xf0\x15=\x11l\xe4\x01\xc32\u04fa\x01T$\x02b\x1d\xd1\xc2\xf40\xbc\x13\x8bqa \xb5\x06+d8\x14\xc1\xb5W\x92je\x857\xaa\xd0i#\x94Cg\r~\xa6\x93\xb8\xf2\xd8\xda\x1bC8\x95\xec\x04$\xab\x19\xbe@\x88-\x01\xbcF\u9880\x82\xce\xec\x82HB\u0529\xfb$v\x1c\x0f\x91\n;Y\b\x1c\xed%\x8cX\xe9\x924\xa2$^\n\x9f\xcc\u0764GU\xa7\xc0\x1b\xc7`*G\xe6\xe4\xf5\xf1\xceS\xfeq\xf4\u007fe\n?\x9c\x11\x9f\xa9K\x18h\x1fq\xbe\xb2\xc3\x16\xe06\xd6z\xa5\b\x1a\x99$\x89|K!,Fj\x80v\u74f8/2\x91\n\xef\x12\u054b\xdc-\xf2\xd1\ts37\xb8=A\xb3\x12\xc2\u01f2\xa2\x94\x12\xee7\xe4s[\xa2N\x90<y`\x0e\x9cuL\x17?&\u038a\xfc~\x9cg\xc52#(\x8cU\x05\x04\xd1[gpZ\xc8C\xa1\u0533\xf2,P\xfaL\x82[P\xf5\x17@-\xd8\x1a\u02b6\x1aJ\xc0\x87\x19\xb7\x11\"\x16)\x17\xd4$6W'\xab\xa9\x05\xe6\xeb\xabU\x8e\xdaB\u0185\x1f\xe1\u01ff\\\x9b\xc5\xdb>\xb5}^aD\x04Dd]:\u062d<\x03\xa2\xe4 \x1e\xe2\xa4fI\xbf\x10gIa\x1c\xe6\xd5M\xe9\xbe\x00\x9d\xeb\xe7\x0fRR o)7(\xa2<\xa9\u007f <\xd8\xdf/\x0f\u007f8!\xbb\x98Q7\xe0D2c\x16D\xc2\xdb0\x80\xfb\b\x1a\xe9~\xd9\xf7^\x122\xa9\xa6\xdf\xee\xa3!L\xd0l\xadS\u0558\x9d\x8d7\x91\xd6\xc45\x87\xbbV\x8a\x9d\x9a\u017cj\r\xee\xcd\\\xb5\x04z\x8c\x147\x1e;p?\xd1aR\xc0\xc7\t\xa6\x9f\xe3ZS\x16\xabviT\xef\xaf*\xf6\xbfka\x9fN7\xb1\x91V\xc2.\xc0\xef\x17)qq\x00Y:\xf9yH\xae\xf7w\xd8\xc8Db\xb2\x84\xd1\xe3\\\x91\xf99Cs\xdb\xf7k\x9c\x8f\xed\x13y\xad\xac\xc0 \u0697\x04\xae|3\x90\xb5\x9f\u05a3q\xe2\x1b\x9a\x89\xad\u07d6\u009e\u06f6R\x9e\xdb\xc0\r\x9b\x9f\xec\xfa\u052f\x16F\x19jZYRB\xa3\xdb\xceQ$V'\x82IXiY\xfb\x831\xaf\x11&T\x1a\xa1\xe5\xc1\n\x1f\t\xedLGd\"\xa7c'\xb1\xc1\xfc\xb9\x800a\x12\x8c\x87\x06\xe5\x10-\x8a%\xe3\x9a?C\xaa\x9d\xbd\xc01\xc9\u02a6\xe01\xb0\x00 \x97\x80`U\x80\xc5\x18\xf0\f\xc2\x01\x95~\xe6\xd4\xf4\x06f\xe7:\u007f,a\x96j\xadX\x80\xea,\xf1BnQ\u03a5n8\x88\xba\x89O^X\xbc\xf8\xc0U\x8c(\xa2Y\xfc\xae}\xc6\xcb2Dx\xf90\x11\xea\f\x01\x83T\xefV2F\xa6\x0f-v\xd1x]\\\xa4\xc1\x80\x0fG)\x98\xaa\x9d]\tw{\xf7\u0381p\x1e\x8dS\x15Q\xd80Nz\a\x1fp\b\xd4\x04gq\xa2cW\xef\u043e-\xca]\xab\xb7\xdfX\xc0\xd1`W=\xb90(\r\x17\xa8Z\a1\xd6\u0207\xbb\u0603\x917J\x14u\xcf4\xf9\xads\x923\x8d)\x8b\x85\xd8>fL\xad\xf9\xca\x00\x12\u29fb%\xa8\xae\b\x9b\xec\x02\xf4\x1d\xea4\a\x11\x06\n\xe1\u03ba\x19\xa6\xc8\x13\x91)\xee\x9a,\xfa\x85'\x1a\f\x0f\u018c\xd4\xe2!\x03\x039\x971\xbf\xd3\x1d6Ng:\xc8L-\x1f\xf2\xda\xcea\x0f\x05\xea\u01cc\xa1\xf7\xf3\u00ac\xfc\xbf\xa8\xd8f\xca\xd1\xdf\xe6\xbb\xd6E\u046b_\xe4u\x93x#\xd3i\x93I_h\x02\f\xfdD\xb9)\xfb_!v\xf3\xf1\xb2\u39e7\U000cb357\\\xb1_\x00*cJL\xa5\xc4\xe1 \xb5\x836\xf2\xb7\x83\xed,\xb7\xca{\x90\x10H\xfe\xa1n\x02T~\xab\x89\xa0J=40mK3\x83\xb4\xdf`\x86\xb2K\xd4\xc7\xd5u\x9c\xb5\x026%#Z\xef\x81\fP\x1c-g\xa5\u07ff+\x12\n\u01be6H\xff\x1b:\x81\xc7\u14a87\x8d3\"F\x05\x87\xfe\xe0\xcb{^,k\xbe\x19\xeeg3\xd5I\xd1?\xed\xaa\u05d2\x03\xb6\x1c\u05aaP\x89\a\xdbt:\xd9\n\xab,\xfe^\xc1[\x91\x02$\x88B\xaa\xa5*.\xa5/-\xd7@\xcd\x05&\xac\x9c\xc0hq\xea\xf9\x95Z1F\xbe{\xebs\xedG\xb0\xd3\xd1y\x94\xed\x04\xc1\xdf\u0790\x1b&\x82\xe5\x9b \xf5\x15)\x92\\\u5645\xa9\xe0\x9b\x90\xba|@\x13NI\xb1\xa9z\xfa\xdd\xf85\x92\xb0\x9c\b\xa6DH\xff\x14A\xaf\x06\xb5K\xe8y\b\xaf\x90 \xb8\xa5tDeZ\xc1MD\u0528\xda\xe70v\x91Dcr\xdc\u023cA\x89\x9bMk=\xac\xd5\xc8\x14\x06\x97Y\xaa\xd7/\x9c1G\x93\xfdD-G\xf3\x12nO\x9b\xcd\u6981h\xa0\"\xf0\\\xc8!\xa3X\xc0\xc8<\xea\x1f\x81\av\x1d\xe2\x82\x01\x88X\xd6JX\xfe\xb77\xc1\xe5\xd9\x11\x8a5.\xea\xc1K\xc0\x01\f\xfb\x95\x92\x00F9\"\x13\\\xc2\x10\xde+\rn\x8a\xe7\x95A\x94|\xbf\u0175\x92_\xc0\x98J\"\b-\x95\x96\x89\xc0\xb1\x11\x1c\x01\xf0\xe8#\x15\x06\x04\x19/G\xc2\u01a2\xda0\xbd\xea\x10Bmh\xe0\x88&>6\x89\xa1\xab-\x1c\x05\xb6\xc1D!\xa9tF#\u063b\x02\u0716'|\b`\xbf\xc3[HJ\xec\bm\xa0E-\xf2\x1d[CH\x000M\xec\f>\xd2CC\u007f\u02d3\r\x06F\xc9\xcf\xda\xf4Q\xc1\xf6\u0613\x05n\x15\x17\xe5\xeb\x84h\xf6)\xb4\x13\u0544\xe8K\xbf\xcb\x03\xecga\x18\x82\x87&\x9f\x18\x94\xdcaA\x85\xe03*\x1d\b\xf5m\x90\t\xe8\xe2d\xa3\x92\xe7\xd8g\v\xa7\xa4\xef\x81r[\xf35 \x15#E.N\xe4\u01c8h\x9fm\xc0[\x1d\xd2\"\uc4fal\xb3\f-sn6;\v\xb0\x8d\u0187\xc2W\u04cf\x86\x82\xfb\r\xe1\x1f\x02]\f\xbcg\x95\x92M\xa7\x1d\x18\xe5n\x906\x10}(S\bd:\xd2\\\x96\xd0Y\x01\x91\x8eW\xfdw\x92h\xc6*\x96\xba\xf6p\xeex\xe5Q\x12\xa0\xbdM\xebe5\xae\xff\x8c\xa9\xa1\u0294mUs1\x93\x03LC1\fv\xad\ub3bb\xe2\x10\xa9\xdea\x9f\x19q\x98CG\t\x13\xca\x01\xf8s\u62b5\x80:\xa3\xb6\x8bxc]\xb4=\x98\xf8\x0e\x99\x06\x98\xb9\xfb\xc8\u058e\xf9\xe4\xb0\xdc1I\u42b1\xce\xe3\x151\x1a\x03;[\xf6p\xeeI\x1f\x88\xc5\xfa}\xee\xcef\xe8\xe8\xaa8\u0614\xa8S\xdaC\t\xc2044\x1b\xf8*\xb3vT\u018e\x98\x1aO\x833\xaa\x90\xfa0>\xa5\xf9k\xd0Q0\xaf|\xc0\x97\x06\xc5N)&\x06V,\af\xf5\xd8<[\x12\xe0\x11\xf1+\x85\u0428\xba\x1e(\xfd[&\u0543\x8e\x01\x90=H1+ET\xa1}yyd\x8ax\xeeC\xb4\xe8\\O%?>H\x94\x95\xcb`\xcd\xeb\x04\x97\x0e\xdc-\x82\x06\x9f\u0398\\_\x86\xfc-&\xf1{c\xc8\xc3\xca\xeb\x9f(\xd0i\xe9\xf7>\xada\x0e\x84\x01B\xc4\xeb\xdb\x1d\x92\x8es\xf4\xae\x1c\x83M\x8b\xf3 \xa1\x1c\xdbo\xaf\xad^\xbb`{\xe8\xf7\x01\xe7\b\xb9\x90e%\xdb\xfe]\x15'\x8e\x13\x81\x13\xbb\xca\x11i\xdeI\vM\xd2\x03*ehL\xe3\x80(}\x1e\xf25,\xc8\xe8\xe6i\xb0\x12r\x1a\x84\x03\xe0]\x02\"\xa0N\xbc2^\xb6\x01\xc6\xc4b\xcd\x0f\u03b0\xb7A\x80d\xe8k\xe1\xd2B\x91?.,\xa3]\r\x97\xe4K\v\xbf\x14D\x16\u018f/\x1b.j\uef35\xec\xf1\x1c \x96\xa3P\xd2\xd9\x11\xa9\u0080\xa3\xfe\x84\xc0*\x1f\u058d,\x0f\x89.\xa7\xaf\x963\xa6\x1fZ\u029f4i\x88\xc5r\x9d\u01b5,\xfb\x91\x1d\xb93\xba\xf0\xf9\x1a~\u035a/\xc3?\xc2,I)\vk\xb0\xd3\xe5\x8a\x14\x11h54\u063e\x0f\x18\x92-0w<\x06\x81\xba\xec\x0fp\xa6m\x8f\xd7\x00n\xf1\x97@\xcf\xd7\b\xb4T3\xc3F\xc4_\xb1\xc0\x98\x9bH*\x8b\b\xf3&\xa0\xbfkdd\xd6\x0e\xed\x90\xf6\x83;\x18\u07cb\xdfh\xe8\x9e\u0481\x91=KS\xc4OW}5\ub810\xabo\xb7l\xc1\x92\xaa\x0eJ!\x9awQ\xb7Y@\xa6.+\xd3\xf0\xd32\x8fHz\xe4\xed\xf3\xd9\x00L\x00\u0094 t\x1f\x03\u0274po%I\x19\xf9\xe2\xe2\x13\u06e8\xdc>\x16\xe5\x9f\u0281\x04\x06\xdc\x14/\xb1\xd2X\xcf\xf7\x0eX'\xe9\xb7]\x8b\xfb9\xfa\x80\xce\x0e\x8b\x93\xf7\u0366\xd4D\xab\x93\x84\"B>\x1f{F70\xa2{\rn\xcf?\xe9\xa6<\xfe\xec\x87\xfd'\xf7\xf3\\\xf0\xff\xa4R9\xa3kr\x18e\xf1\xb4\xeb\x05\xbd\xfbt\x8f\u45fe\xd0f-6\xf7\x12\x8ar\xb0\xe3\xb0\xe8\xe1\xd3\xd6\x01\x17\xc0\">\x8f\x9e\u07b6\xb6-\x0e\x1fX\x87\xa8\x02Vq\xfc\xf8\x1c\xfcr\x10t\xa1\x06Fk \x14\x97\xfd\x15'\xab\xe4IX\xd5u\xcb;\xdcu0\xc22\x87\xc7I\xb1P\xc4I8\xbax\xe4\xbeVs\u01c4\xac\xd0\xd2DW\u06bf\x96\x99D\x92\xb8\xfa\x06'\xa7\x12@\xbdD\a\xc4K\xf5iG\x9d\xb7>\xe5\x8e\x18\b|\x89\u07f1\xa9\xf8\x01c\u0416!\xdd\f\x8c\xb6R#T\xa0r\xa1\xa0*\x051\x11\x1e\xee\xc4\u01fa`\x9a\x8d\xb8\xf4Mj\x16!b\xd7B\t\x10\x15\u01fe_\x90\xdd\x1f\v\xf1\x01!\xe6y`j\xaa\xb5\x83\xf7z\xe1'\x0fc\xdbS\xe8\x1a\xb7,\x03\x00\ube66m\x86\x13\x00t\xa9\xc1\xba\x80r?\xb4\xb4Gk\x87(0\xe0j\xb6SE\xfd\x86\x8c\xbc\u007fL\xe5\xbf\xe8i\xfbo\xdc\xed\xe7\x03\xd86G\x94M\xaf]\xa8\xa2e\xae#sd\x9cVg{\xff@\x8d\xa4\x9a(\x9e\x15@:\xb9\xc6!_\u06d4\xfbq\xccp\xb2\xd8\x19y\xc67\xcbP\xfcX\x18\xefN\xab\x1e\xf5?9\xa0=\xa4\xad-\x15(u\x06)\u04ef\r'\xfa\x98\x9d|\xd5#\x83\x88\x00V1t\x1f\xc2j\x12M:1\a\f:fys\x04\x107n)-D\xf2\ub3c7Z\xba\xf7\xdd\xd6yc{W\n\x0e\xe4sSl\xf8\x0e\xdaS\xddp\xe2\x91\xe8\xac\xc3H\xa7\x11r\x87S@\xb9\xa0\xa5\xbdL\x17\xc0h\u00f4\x94\x9anj\x9b\u03dcQq\xbbM\xf9J\u04c6\xbe\u04b8\x994\xa5~b\x1aZ\xaeX\xec\u043e\xe4%\xc7\xeb\x05V\x02\xac\x1d\u061c\xb0W` \xdf\x13\x8e\b\u007f\u06ee\rEC\x11\xab\xae\x10q\xbf\xa0\xafb\u015a\x11\x04*\x90^@k\xf7\x13\u0270[\xc1;\\\x13W\xee\x13\x1e\xc0\x9f4c\xda{\xae\xd5\xe2\x85\x1e\xb9\a\xae\x9a\xaf[\x1d\u0638\x89.@\x9dN\xbe)x\xfe\a\x1aMN\x94\x9f!\xc7\b&\x91c3C\x83\x82\xb1\xf4\xb0N\xed\xcc\xc1C\xbb&\x9e;Z<\v\xa3\xb9V q\xc5I\x85\x80\v\xc7.\b\xcd96\xc6\xe2\xe1\xe2\xcbpV\x9d6\xael\x1dI\xa9A&~\u1fd1\tg\u015b\xdd<\xf0\x04l:u:\xd0\xe8.[kA\x1e\"\xbcKM\xf0\b\u1bc4\x1a\u040b\x13,\x8b\xa5\f\f\x12\x13S\x02\xb0r\x13t\xabt\x00\x1e\xe5dcx\u057e\r\a\xbc\xfb\x8d\xe6\xbc\b\xc4\xd3\x10\xc2\xd8\x19\x8cE*\xd6\x11@\x05\x02m\xc0\xdf\xc5[\xc9L\xec[\x15\xe7M\f\fSK\xa9\x8e\x17\x9cEj\x02B\xb4\xb3}\x1d\a%\xaf\xf2y\x9b\xac\x00tQWE\x8d\xf4\xe1S;d\x91/o&0\\hY\x10\xd1_8\xc7\xda\x17\xeefV\x16\xc3\xd2\xf3\x88T&\xb3\xe5\x17\xea%\b\x11\xca\u0170P\xcbS\x86`\xa8\xa6XmQ\x03\x97\x15ARu\xa9\xa0}\x0f\u02b1\xe5\t\xebS:\x0e\x98\xd2~uL\x0eU\x02\xeb7/SbT\b\xa2h\x9c\xd2D\xdf\xec<\xb5{\xb0\xe5\xc8\xcb\xc4\x0f\ucee7T\xb2\x90Tp5)\x01Z\n\xd2)a{\u47ef\x97T\x15\t\xbc/\xa4\u0245B.XF\xce\xc4\xd3\xd2`\xe2\xa2(\x81\u02f9\x9a\x92\xce\xc451\x95S\xb6\vLHaQQ\xc4\xf0\xdf\xe7\x16\x14\x02'\x10\x84\x93\xc4)N\xc2\x12\x85m\xe1\x05\xe22\x9du\x92\x99 \xe2\f\xa5\x00\xb7;\x0f\xc2\x130\xbb\xbd0\u02b9\x00\xca\x14\xa4[\xe3\x9e$\xa7\xfee\u013b\xf1%\xfd\xa0nlm\xbc\xb5(0;\xca\xd2z1\x19\x02\t\xd2Io\xf6%\x12dL\xc6\xf2\\i+\x03\xcc\x1d\xbe\xb8v(\x13</\xb0\x8a\x82\xf8\fix!X\x8b\xf8\t\xe6\as\xbc\u9dc4\xd0;\xb70\xaa\x95\xebe\xf04#\xb9}<~$#e\x0f\x86-\xf8\xb2\xc6M\x8f\xb0\xf5\xd1p\xaf6\xf0\xb4\ue00e\xacv\xcf\xc3L\xe1[\x91\xa7\xefr\xe7x\x89\xf8P?|(;\xa5\xa1\xad=\xe1@\xbc\xddfeV\x97rd\xadV\xe7\xd2U-\x1eA\xd1kJ\"\x8f*\xab\xd9;\xb3bc0\x04\xf5\xf58P\x10\b\x8f\xe8\x8d\xc8\x10\xc4\xd5\u059d\xd1\xc9\x06\x98\x1c\xae\x8bCc\xb2lh\xe9\xc4\xd6\\_\xca\u0095(\x00\xd0\x17\x80\x18\xa0\n\u007f\x1a\xfe\xe3\xe7S\xe6RQ\xb0d|\xb3\xf1\xe7\xdb\n\xef\xd3nO\xe2G\xaf.\xbcZxX\xf3\xa3\u046e\xd2u\u4f2fy\xbd\xe7\xf6=\xd2\u02e1\x8b\xaa\xd5\xee4\xfdC\xd5\u07e1\x9a\x1aI\x02H\u00d1\xd7\xe3L0{\x1a\xf00 \x98\xa5\xfb\x8e^w\x90OoD\x11\xdfC\x0e\v'\xcfP\x9a\xeb\xd1\xdb\xc7g\x1e\af \x1c\xbfG\u01ddp;\x14_\xb1A\xd9\xd9\x16\x99gEl\xc6v\xc0\xb0\xa6\x18\x9d\u024eoZ\x8an\xdbtzt\xd5=\x13u\xc0\x1c\x16\xc4\xfek\xe3P\xf2T\xed*\xa2\xef\x91xd{@&F\x8c\xddy\x1a\xf2\xba\xc3\xc7Q\xfb\xde\xd7\u0551\xbc\x0f\x86\v\xac)`\xe02>\xc6Mo\x8d\xc2\xe8\x1f\xab\x8bzg\xe2\x99\xd3'Y\x9d\xdd\x18\xa9!\x8e~\xcb\xe25\xc5\f\xea\xaeO5\xc4&\v\x16Ig{g\xeb\x90\x02*\x80P\x815w~\xaal\xe7\x17\x80<z=(\xfdp\xfc\x16d \xb8\xd3\u007f+\n\xb4\xa8\xc2\xe7\xce\xe6W\u02bf\xc0 ZS\xe8\xd5\x1c\x1c\xb607\x10\xb4\x00\xd1] \x18<\xf8\xb3\\T|\xe5Py\x82\x01\xd6e1\xc8\xd24\x12P\x96\x80n?\u007f\x18\x8fH/w`i\xbag\x14\x85\uadc6\x8bUp\xe5V\x95\u0482\x99\x8d\xf2\x04.;\u8ff4\xfd\xd0\x1e\xbc\xc5\xf9\x85\xc1\xb8\xd6jTz\x9c\x01|\xb6\x85\x0e\xbb\x13\xb0\t1'\x17\xea4A\xefPDo\x8e\a\xdd5~9\x91\xf4\x97wd\xdd\xda\xf8U@D\x9b\xba\x854\xb6\xf7\xa8\x83[\x02\xad\xbf\x99\f\xb3\xb7\xcfh\xe8\xc7D}M\xdcvr@\x06~b\xdd\xf5\xa3\x16w\u0565kHG\xea\xa6\u07fa\xb5S\xadj\x17\xb7`Or\xf4u\xd3v\x03\v\xabF#.vQ~N\xf4\x9d\x17\x96\x86]\x9bA\xf4\x99L\xb0R\x97\xad\x16 8z\x14J\xb4\u0397\xc6}\x19\xb6F\x86JxSWt\b\xcao\x93 \xe7\xed\xa3\xb4=\xb6o\x93I\xcf\xc8FJ\xc7\x01\xc8\xe6\x94|\xf8\u07f3\xfe\x0e\x80F\x93&\xa9W\x03\x19-\x05Py\xa6b!\xa4k:\xd3\xc9\xfc\xb2oW\xb9/\xd4\x18\x8d\x99K\t%\x89\xbaC\xe60\xe5#\r0;\x91'\xad6H\xb5g6\xa5id\x96Ad\xc0\x93\x1e\xbc\x93\x9e\x97,(\x1d\xef\xfcH\x85.\xfb\xc1\x124&\xa2r@\xe9.\u023cb\x9e\x9bAA\x8c$r`UAA\x12\x12)\xa8i\xf0\xd0%\x17\xe8q\xf9\x15\x9c\xa3=\x1f\x8fv\x8f\x12$q\x8d\r\xd8\xebR\xc9\xe5\x96Q\x1e\xdfv\xa4@R\x17\u01d7[x%\xc8\xdbb\xd2\x00\xa4\x12\u0142\xab\t\xaa#B\x8au\x03\xe4\x13\u0132\u0612:\xbdg\xabH\xff\xd6\u0726\xc0\xdb\x180Q*\xa2-]4\xa1\xfa\x00\"\xb9U'\xb1*\xf4\xc8B\x81\xcf\xf2\x99O\xa0\r\xe5>zE\x80\x00\x10`m\x99\x01b`\xd9P\xc4UZ\x13\xb5Ue\x1f\x17\x00G\x82\xcf\x12\xb3D\xb0-\xad\x91:)\xa4\xaaj\xc1\x01\xa7\xa6\xf4dQ\xb2%\x18V}\xdbdV\xb7\x16\xd8f\u04a60\xb1\u35d8bf\xf6X\xa72\n\xdc\xe6\xb9R\xd07\x10,\x8bY\xdf\x11\v.\fQM,\xc8\xe3|\xd9\xed#i$\xe2I\xb4L\x89\xb8\x1f\x81F{\xaa\xddb\xb6\xb1\xef\xa3\xd4u|e@E\xe5\x02\xacl\xf1=l$\xb6&\xbc\xb5f\u42aaL\xed\xfeL\xf69\xcaN-\xcd#\xf2\x99\xc5c\xd4\xf40\x04\x86\x8e\x94\xa4\xbb\x92;Q_\x82p\x04EB\">\nv\xa5\xc1\x93\x9b}\x176\xee\x92]\x84\v\xa2\t\x0f\xdac\xc0\x8c\xbf}\xfc\u00a1\x90\xc8D\xb5q\x89\xf9|5\x00\x97\vTVo\x02\x88\x86\xec\x03'\xea\x05\xa7B \xa6)\x90\xb0\xb6;p\xd4\b\xab\xb2_c\xb0\x9ca\xc4\xc7A7\xc7\x18s_\x84\vXC\\\xa4\x1dM\xd2\x1c)I\xe9\x1a\xacI\x0f\xb3\x9a\x1d\x11\u77d7\x94\xdaP\x01P\x90\xbd\x93\xf0Du(6\xa2\xd0)$\xb1r\x98QB\xfdTyuT\x18!P\xe0D\xfe\xd2L \x95\u01d2^p\xba\x9e\f\x8b\xef\xb1H\x8a\xa2v\xd8\"\xbe\x8c\x98\xb0\x16\x9d\xe0\x903\xb3H\x1b\xca\\\xa7\x8cy\x18j\xb5\x03\u048d V\xd6\xe4\x87\u0340\x86S\xe4\x1a\r\xf8\x10'\xf0p\xdc\xf3\x1e\x10G8\xb0\x84\xfa\x05q\xd1\xd1\xf3\xccJ\u0268\xcbH\r\xf3\x1f\xc6+b\x80\x98\xdb~\xf9\x9c3\xd5\xf8\xea\xf47\x9a\xadh\x92\xb5\xeb\x1da:\x82\x1a\xdc\x1c\x0e\xac\xfbB\x9e\xac4H(\xac\u0592\xa4\xd8~\xb6\xe4RS#\u07c2$\x14\x10\at\xa1\xb9\xa8\xc2\xf9\xaeP\x06\x16\t\xdd3\vqe\xa7\x879\nkV\"\xd6\x1c:jS\xebJ4\x96\xf9\xef\xaf\xca\xe8\xa2O\xb8]\x87\xcb\rn\u0308\xd0\u052b\xef\xed9\xfa\xbc\x10p\xe3\xf3\xe64\x19\x9cc\xf2\x84\xe3\x1f\xeaj$\xe0\xa4\x16k\xec\xfd\x81\x95\x81u0\u007f\xf6\n\xcd\xfd}\u059b^*N\xf45\xb0\xf3\x97Y\x01\xa0\xb6hpV3\x1f\x83\x84(I\xc7\xc8)\u007f/\x19\xa8\x81r\x16A6\xe9\xa3H\xbb\xa7\x97&%\x8d\xd2\xc3\xd37.\x9a\xfc\x17|\x9ad\x97\xe2\xda|\x9d\x88\x96\xf8,3l\xe4i\xb5\bDQL\xc1G\x86\x1c!\xa1\xd3\x0e\x9e\x8d&\xacFPG\xe8C\xe8\xf4\xa8Aj\u03f1\x813\xff\xd4g\xf0Njx`\x91<=LN\xbaAw\xed\xf7\x9c\u0746\xf2\xa9\x98\xf0\xbe1@\x9d2\x8b\xe2\x85*\xbc\xf2/$\xaa\x8bM\xff\\L\xacK|\x18X\x85\xfc3<\x90@\x95\xbd\xdft+\xbd\xccD\xe1r\xaf\xa8E\xeb\xd8F\\\xc1Q\xc1\xb6\xd7C\u06f2\xf8\x06u\xb6\xe6\xe9\xb5\b\xc1\u07a68e)\x89X\x14&\xfe\x02\x05\xa2ky\xce\xd5\u04fe>g\xfd\aD\xc0XmV@@\xc7\x1a6\xb8\xe1raH\xd1\xd1}\x8a\xe0\xe6\x02>\x11\x8d\x1b\x1d\x13y\x88\x14\xb7GE\x9eV\xd5\xe5\xe1\xfd\x1fT\x86Y\x11\xcfqi#1G_\xd4\xe8XaD _;R\xa3~\xf4}|aV\x81\x91\x9el\xe7,\x0f~\xc0\xfaAR\xbd\xb1\xc5sZe\xa0\x06Wi\x13\xb1uH\x98iyc\u04cfz\x0fDi\x01v\xbd\x80VX\xe5i\x9c\xf0`UL\x0e\xda\xd2h3\x8d\xf27\xc0M:5\xb5\xd9\xc2\xe3\x06\x19\xf0bG\x870\xcd0S\xf8I\x97r=\x992\xba6D\xb1\x9d\x0e(e\x1fJ\x10\x11\x81d\xbcj\x0eT\xcd^EY5s\x96\xd8J\x88\x03\x9e>\x1a\xc8v\xf2\x93[\xd8\xca\xf8\x80#J\u01bf&t\x00\xa4&NV\x9bC[\xa1\xa1\xed1\x02\x12\xf3\u04e2\xe7H)\xfd\xe5\u007fi\xaa\xe8\xc5\xcfO\xac\xf7\x04\xa2\x14I\x05J\vW\xc3NI\r\xa0\xa4\xc0T$\xc0;\xef\nS\xa4\x85\\\xea\x88w\xe1\xec{Tm\x13\fMe\x92\xbb>n\x1cO\x13\u0326\x1b<H\xe0\u0339xq\xac\xa8\r\x01\xa5\xbe\xa7.\x06$C\x06y\x06\u05e6\\\xcd\x1e.\xe8o\x04P\xd5F\xf4H\x14F\xf8g\x88\xa2\\\x8d\x00\xe2a\v\xce\x11\xa6k\x89x\x14H\xc0\xba\x97A\x14\u7d64q\xf3A{\x1cu\x1d\xe4qEiX\xf0\xf6\x85!\u0286\xf0Z<~>J(l\xf9\x15:\x93\x16$\xc6TRO\u0717\xf9;\x85\xd84\x8b\xe8\xebS\x84\aw[A\xc2\x19\x03\xfdx\x90<\xf0\x16\xdaiI\xcf\xccnP\xfd\xa1\xf2\xa3\xa1\xfcO\xa5\xe8\xf0\xe0W\xee6\xf0\xda\u05aec\xfd\xb7\x1c$Y\xf0\xf2Ci\xdbi\x03)\u067b\x02\x8e,$\xce#\t\xd5\xffp\x18&\uf0a0\xc6J#\x13\xe1\x11P&\xbbu\xa3K(\xe1#r_\b\xb8\xbc!\xdb\x0e\xc0\x92u\x11\x1d\xe8\xdb\u0341\xfd\xfb4\x9b\xbaW\xb0w\x16\x05\x83L\xd05q\xda\x10\x8a\x80\x8b(\x03`\xc0+#~\b\x8d\x0f\xd5K\xcf_C\t\xdc\xf8u\bh\x16\xf5\xbe\xb2\x05\xc84a\xb2\xce\x17XY\x8d \xf8\x13\x85\x02\x9f\xe5\xbeG\xab\xf9\x80T\x13\xa1\x1b\x10\x83`\b\x98\x82D\xc0\b_/\u0611\x89a=\u069a\x92]\f\xbd\x13\x96P\x10D\xbd\xdf&LY\x8bm\xb0m\x8cvw\xf1I\xb6\x00l\xeb\xa2\xc5\v\x04u=\xf0(\xc0Bn\xfd\xd00\x1d\xeak\xf8\xf8\xa0\xe0\x8e\x9aU!\x91\u00a0\xee\xc3\x04\xc1x_\x00p\x90\xa2\"H\x0eF\x91F\x12o\x91A\x90\x1b\x92\xfc\x84\x93\x91>\xe6\x1a\xb2\xba\xd3\xc3\x05\xa9\xca\x1f\xe2\x04\xe0\x02\xf0\xe8\x94+P\xd0\xf1v\x13\xd8D/\x03\xc4\u0518\xbfx\nKj\x013n^a\xbd\xee\xe4b(\xb0\xceR\xa3\x18\t{9`f\xa7\x8c-su\x8c\xf6\xb7\xaf4T\x85e\x18\x9f\x97\xf2\xb9\x03\xf1#Wr\x85\x14\xb1\x00\xa1`?\xcd)\x1a\xbc\x99x\xd0\xe2\x18\xd8\u01e9m\x00l\x0f\x9a\x0eM\x9d\xb7e\xaa:\x1d\xb1\t_y\x8bFA\xc2\xdeQf!-\x92 \x83\xfcQ\x89\xbc-\xc9\u0776/\x05\x1f\xf9\xb0\xd9}X\x97{Z\xc8d\xf7\x96U3\"(\aq/)Z\xd3!(\x03\xef\x900\xf4\u07c3\x1f\\L\t\x88r\xb1\x8e\x16H\xa4\x17\xe3k$$\xa2\x91~\x03T\xce:\x9a\x81i\xb3%\x00\xe2L\n G*3\x123\xdc\xc1Y\x0f\x1ax\x1f\xfeF\x9d\xc5\xda\x01\x18\xbe^\x82E\xdaH~\\F\x96\x04\xd7\xe4\x12\x96h\xc6]\xb8\xa4}\xa4V)i\u3930\x0ej\xe5\xc2\u0655l\xcbs\x95y\x82+0\x1e$\xa7\bU\x90\x0f\xad\xb84\xa6\xcaw\\\x91\xca\x033\x06B\x8a\x93\"&\xae\xdfSM\xb6\xa79\x13\x01e\xbc\x8e\xaex\xf5\xee\x84\"\x0f\x10\u040f\xbe\x05\x8c\u007fF\xf9S\x18\x81\\\u00d4K\x16\xe3~\xab\xa4\x86\x17n\x9b\xf4j\xac\x88\a\x03\r\x88R\xe8\xc5\xd8G\xf17\xc9\x19\xff\xe5\xd0\x1eD\x8a\xc0\x0e\xd8=\n\x94\xc5$\xf3\xdf\xdc\\\\\xdc\x11/\xe1\x18\xa5\xa5\xbc\xec\xd4MD\u01d9\xb4\xae\x06~\xd3R\xdb\x10\r\xe0\xef\x93V\xd5h\x11.\xc0;\xb6\x15\"raR \x9e\xfc\x013\u007f\xee\xbdnv%C\xdf8a\xed>\xc0\x013\xc1\xa0\x84\xe1a9\xfc\x01\f\xd8\xe4\x90\a\xa5n\x16\xda\x02f!\xc8\x12p\xe7/-\x01\xf5c\x00\xad\v\xf61es\xaa\xbd/\xf8\x8f\xb8\xd8x\bW\u0245U\x172\xb4\xf6\x01y\xf8\x82\xe7\xeb`\f\xf5\xb8\xc5\x13\x83[lQl\xa3\xd07\x9a\xb7\xdc\xdc\x11W\xbd?\u0271\x9e<a\xf1x\xbcI\xcdv\x81KM\xc4r\u0428t#\u01f5\\\x15\u068cN\x06%\xc8\xc6-\xcc\u145e\u007f\xf0\u0359M-\x80X\x05$\xd4b\x81c\uce9c9\x11G\x14Q\x05\xef5\x01\fz^\xd1\x00;Yc\xe0Q\x00\x15\x90\xd8G\xf4\x9cy==lIh\x06l\u0503]\xa8\x86\x13P\x1c\xa3](`\x168s\xf0,p\xa4N~u\x06\xe9-\x8f\x1a\x1c\xa1\x1a\x12}\u0602\x81\xe9i\xfe\x0e\x86#D\x83\x86\xb0\x93p\xe3J7\x89\x00\xc9A~\x81P\xb6 ^\xb9\x0e\xd5|\xa6+\xf4<\xff\x94\xb0C\xbe\xec%\x9e\xacKT\xed.\x1a\x9c\xb0\xa8\xa9\xaa\a\xb6\xec\xe3\u0792\xbd\xc91\xd6]X~\x99\f\xc0\xa7\xc7\xd6\u03e1\xdb=\xe7\x9e\x00>?\xb2}\x91\t!E`\x120\xa1\x1e$\xaa \x00\xa0'\u0369Y\xd7*#\xe9\xb8\x01=\xc3l\xa4\f9K\x01\x01[`\t\x19P3\nA\x81\x9b ?\xcc\xc5\x19\x80@qM\xf9\xe8$\b\xc5\x14\xd4\x16\x88\x06H\x11\x124\x18\xab\xdaj`i\xf4\x88\xbaS\x81]\rc\x9d\x9e\x13\xbbCvb\xf8,\x83\"\x8f\x1f\x14\xc8DRA\x81-\x11\xe96\xa4i6\xaeU)\xa3o\xa8\xae\v7\xe4\x93{U\":\xa9=\xc31\nj^\x91i\x89\xc1\xf3\xcbH\xee\u0210\xb2\u06f0\x03\x1c$\xe6\xed`h\xea\x86\xdc\xd3\xc9d\x93\xa2\r\xacY\xfe\x03%\x99V\xd9i\u007fW\x9esp-0\x04Rb\xde\xe3^i\xa9\xe0\xf6\x8e/i@T\xfa\x8d\xc8\x11Z\xc0\x92\xa6\x99\xba\xb9qKc\xce$\xad\x0e\xdb\xdd5\x88[\rh\xde<D\x10\x96\x03w0\xfa\x16\xc3\xfc\x88\xf6\xa7]\u007fV>\x80\u0339\x87\u01e6\xb2\xc78\xe7\xf5\x86\xa2\bY\xc3}\xe2\x02\x99\xed\xa1+\\\x92\xc7\x01\xd1\xef\x00\x8c\xd9\x04\x83\xf6\x94z\xb6\xb7\xf6QX\xd6\b\xb9\xe8\x9dd\xa2\x13%\x91\xd58^\xc5l\x9cJ\xd2f\x1e\xe8\x10\xbc\xef\a\xa1|c\x10<\xf0\xea[\xa9\x1c\u038e[\x00\x06\xa6z}\x82\xcc\xeb\x1a\x1e\xe5\xc1\x1d\xf0\x01q\x95\xabr\x85o\xbe\bY\xcbN\x8e\x87Tz\xe87Ko-A!\xae\x15)\xc8\b\xc1\x10c\x06\u04a4\xab\x81\xbc>\x06\xda\xdfo\x0f\xe1l\x8dK_\x96\xfbd\x14\xd8M\xd4M\x03)&\u0787\x1fd\xe8\u007fz~\xad\u007f\x034}\xdb\x15\x883\x1c\xe1J\a/\xafR*`y\xd2/\x95*\x18\x8c\x82\xf2\x8c\xec~\xa27Y\x1d\xa1\u00b6\x80\xa0\x89\x9f4\x1c \x91\x8f\xc7\xdc\x18\x85\x12I\x85\xec\x04\x01\t$\x1d=\xa2\xb0\x1c\xb1&/\xc1\x93,\x0f\u0203\xbd\x10\r\xe0\u0501\x8a8=\xab\xa5^\x0e\xc4Zk(\x9dN\x80\xd7\xd1\xe2\xd8\xe4\xe1\t\xa9\xfa\xd37)\xa7\u06e6J8F\xe4\x87\uf9d5\x06Rht\xe50\xee\x95\u06b52\b\x06\xd2tX\u07ccC\vTN\xa2\x9a\xc0\xbb\xaaKUn}KTNQ\xce\xc2z\x89\xb5g\xb9\x02\"|q\xdfL\xa8\x15\xba\xb8v\x81%\x87x\x11>E\x10\x97\n\xc8\x0e]\u06bd\x19N9c\xbf\xc0\xe8\x89d\x82\xd9\xeb)\xaf\u01e2\n\x843\xef\xea\xa1\x06\xdbL\xf4\xd6-E\xe7\xcd6\x91\xb7\x1b\u0417fh\xfa\xba\x15\x17\x84\x9a\xb6\xd5s\xfb\x18+\xcb\xc5`0@\x02z\v\u026c\ua143\r\xb5\u058e\xc9uU#\xa5\xf7B\xd4\x0e\x03\xe8^\x10B^\xc1O\x80k\xc67\xe02\xc2\xf5\xaf/Ej\x9d\xb4\xbcp\xb2\xc1\xac\xa5\x83\n\x1d\x82\x11\x81&\xbe\x1c\x16[Rh1\xd6\bQ\xe8[\xe73\xbb\xdb\v\xe81\xcf\xea\x87\xe9/6\u04a08sF,\xf02\xd9|;=\x885A@\x0e\x13\xad\x9b\xac\xb8A\x8ayX\t\x0e`\x88\u048b\xcc\x13\x16\xb0\xec\xe4\U00064384\r!{\x12\a\x88%\x03s\xc0\xe8\x80q\xd3jU(\x97\xf0\x18\x85\xedV\xf3\xadw\x98s\ud6a0A\x9ddh;\xf9\x15\xb8\x8c\xb2f\xfe\x92B\x8c\x9aW4Y\xdb'L\xce\t\xee*3+\xc7\x14U\x113I\xb7\x0f3\xcc\x1f\xfce\xb2\xc1e\xa7\xc7\x02.K\xa0\xaa\xea\xeb\x93\xde\xe8P\xc2V\xd4\x18\xa3\x81E\xec7\x8f\xdc\xed\x04P\xb40p_\x13\u04ea\x0eH\x8dz\x84\x90\x90\x9f\x87\xa0\xf0`\xdap\xf4\u007fa\b\xe9\xbc\a\xb7=\xd9\u02ed\x8eN\x00\xea\xf4\x1c\xb3\x89{-\u027b\x03E`5\u06ccWV\x8d\xbe*El\xfamSv/$\x84\x02f:\xd4\x0ey\x059\xb0\xec\x15\x83\x83\xcc\xe0\xfc\xdf \xec\\\x1c+\xb9\xab\xb8P{pE\x8d\xc5u*k\xf7\x16\x8f\xb9y\xd6\xc4d\\\xe8\xc3\x14+\x99(?}Q\xb5\x11\bO\xdd\xd7\xd1\x14\xbaP\x13\xa5\xdcR\xd0\x1dA\a\x8e\\\xbf\xa7\xf3\xb8hx\x85\x15@\\S\x80z\xeb\x873\x91\u04a8\xe1\xf5D7\xe64\xf9v\x9e\xb0g\xed\xda\xcc70\x03[&b\x90\xc2\u8eeb\x82j{\xf4\x9a\xcf\\\xea\xaaXm-\xb0\v>@\xb3\x10\xfa[\u0289\x85\x9ep\x9f$U_9\x97b\xab<A\x82C\u4a71\r\xea\xf4\xd78\x8aF\xcfK\xe1\u010d\xd7V(\x93\x87\xc0\x1bS\x98\xb2\x19\x05$f\xa8&\x1b\xe7\x1eX1\xac\xf1\xba\xbd!\x81\x8e3|o\xa9\xd1\x11\xbd\xb9B\xaa\xcav\xee1\xbc\xf8S\x9bE\xed\xa8\xaf3\x8e)\xcb\xf0\xde\x1a\xce\x05@\x9f1\uc2b6\xae\xd5\xd3U\u0185.s\u04db\xddQ[\x01w\x11\x16\x84!\xda)\xb0B$p/6\x15\x80\x19\x82\xa4\xdc+H<\xbd\xa9j\xdc\x1ah\xc1\x02\x9e\r\x04b\xf8\x91\x84(\x05_\x848\xbc\x9f\x1d\u007f\x88g\xa7\x94\x10C~\xcc\xcf\xf7he\x82r\u079c\x96\x89\xf2\x88\xe8FU\x1d\xd4K\x8a\u05c6\x93\xe1\u06a6%]\x8f\x11\xe2\xbayf\xe9\x15S\x1b\x8c\xc1IU\x98T\"\xad\xbcX\x8aR\a!|@#\x1c\xc74\xb1\x9f\u02c4\x88AR\xf4/\xd5C\xeaTV\x06C\x01/8`D0J\xbf\x14sV\x9f\u04c1\a\x97O\v\xb3\xb5\x80\xa8G%X\x99\x83UJL)\x8175\x9f\x8c\xe9\x9dB\v\xcf'\n'\x8d:\xb7,\xb4\x04\x90O\t\xd1\"\x8c\x13D\xa1\xe9\x19\xd1^\bB\xc9<C\x00\xe7\r\x0f\xf2A\x19\x00\xadV\xf1\x89\xcf\x12B\x8b\x05\x80@D\xa5\xa8\x80\x84K\x14\xa1t\x94\xc1\x0e\xdb\xc2{`\xf7\xed\xe7\xbc\x19\x01\xe7\xbd\x13\x99\x89%\xd2\x11\xba\xf0\xb5\x03`\xbal\x1b\xe8\xae\x0f\x10\x01\xbf\ue4bdLC8\x16\xd2\a,4$/\x12\x98\x81\x852\xb48\xe9\tVe\xe9\x8c\vTJ\x9d\xe4\xde\x19\x8b\xf2:M\xa1*\xb9\xd1\xdfU\xfc\xd5\xc9T\x93D\u0790\x87\xc8K\xe3#\xab\xc2\u011a\xb3mM\x15\xa5\x13@K~,Q\x13hHP3\x94BPx\x1e\x87-^\u07b8\x89\xacWq \x03\xbd\x9d\x177\x13\xd5/\x1b\xf4W\xf0\xfe\xf058L\x03t\xeccP\xb7\xf5\x83\xaf\x9e\x83\xf7U\x92\x83\u012e\xe5X\xbe\\\x89\x1af\x84\x1a_\x19\x02\xd2\xf2\xa1\x110\x90\xca\x15}3\xb5\x8d4[.\xd498\xa4\xee\xf3\x161*\x10@\xb9|\x92&6)M\x964_p\xbf\x1a\u0728\x86\xe5/b\u00aa\xf4\bf\x86\u6647k\xfci\xbac[\u060ea8}\x85d\f\x89\x05\x18\x1d\x12\ua9b0\x8d\x15\xde\x02Way\x12z\x02\xaaK\xb0k\x0f\xfa\x168)$\u019f*\x12Af\u0156\x89X0)Nb\xd2\xe4\xc7?=\xf1\x9e>KVC\xe6^XQ\xd1\x12\x82\u07ac\x9cI]&\x1b\x12\xe1\xf3\xbe\xfacM\t\xfex\x9d,\xe4\xc6:d\xc0\x8b\xf8\x0f\f\x16\xd26)\xc4(r\x9c\xc5\u0732\xf8(\x96^\xb1\xd0Fg\x1d!\xfe\xa8\xbe\x83\xf1S?i\x84\x91Bc\xcabB\u0298_\x82\"\xed\x0fSj\xacd\xc1\xe5\u028c\v\xdb\x0ekj\x94\x94\x19F\x02\x9a\x11\xec\xeax\x12\x81\f\xf6y\xc2h\x14\v7N\x90=d\xe7\x00\x8b\x05\x1c\xc0z\xec\xd0\x03\xd0B\xe8\x11\xdd\x11a\x81\xe0\xc4\\\a-\xd2}9\x98\x105ya\xe3(B\xc6\u04b19\f\x0e\x80\x8b\x8a\xe1\xa9\x11\xa4\x8e\xc1L\xc1\x95\xa6}\x9f\x17\xa6a\x10\x92\x8a\xac\u03b04\r\x90\u068d\x18R\xca\xe8-\xad\x15+q\x1cBa\rW\xf8\x82\x06\x83t\x17\x0eI\x94\xed\x01R\xe2t&|\xaf\x16\x87\xa0]~\xc2\xd0`\xcc\x1d\xf92Z\x9d\x8eWd\xa0,\xa3\xf1\xb9\xac \x95\t\xcb\x1a\xb4\x06\xe1\t\xd3R\x92M\xcd\xfd\xe7\xb9\x14+\xf9\x9c\xb2\x83\xe2QBNq^@-J~\x85\x83\xa09_2\xb7\x00\xe0\x85b\x03\xc3\t\x10p1g{\x80\xe33\xb68'\x98Aha\a@`\xb8\xe7\xcc\x03jy\x82.\xa4f\t\x12I\r(\xb4\xeb\xc3ss\x00\xf8]\xae\xa8\x19\xa5n\xc7&\u06cf\xf3g\xa5\xe6$<F#0\f,\xaa\xf7\xc9@!0\x1f\xfe@e\xc1\x8b\x00\x90_pNSB\x00\xa5\xd84\x81\xd6\u0769&\xbbc\xea\x17\x8bM\x12-Vm\x92\xaf\xaa(%u\xa4\fl\xecL]w\x10\xed$\xf4\xf6\xae\x92\b\x91\xd0\u061f\x11\u00e1+C\x00\x89&%\xceT\x94rY\xb8Z\x1e\x12++2J\xfa9I1\x8c/\x85\xbc\xecC@H\u007fX\xfd\x93A\xd0\xf3\x1e\xbe\x16\x9d\xe0^\xc4\x1bQ_\xa1s\x04\x80\x8cQW\xa1\x8f\xa0X\v\xb9@N\xb0`\xd4\xf6]K\u00c5\x8cP6g\xc8\x1c\"t\x83\xb7*w\x11\xe6\xe4(\xa0Rr%\xb8\xdc.\xd1B`8\xc5\n\x12\xed/\xb2\xb0\xbbP\x8c\x91\x1d\xbe:\xd6Bsr\x11\xc7\x02\xb9a\x83\xe8\x1a\xfe\xfc\xc9VZ\x9c\b\x04>p\xb9\xf1BQ\xad*\x98&\x84\u0289\xaa\xf2\xd4ra\xc4\x03\xc1o\x10J\xaa\x1e\x86$A\xed\xbde,njo\x8b\n\xb9\xbef\xd8\x18\xb5M\xf6\xbcW\v\u02f3\x884\b\x140M\x0e\xe9\xaf\u03a4\u0753\x06\xf4\x19\x90I\xa4\x01\x89\u052aF\xdft\x8d(A\x88\xfb\xe6\xfc\xb1\x9ee\x17\xca~\x04\xf3\x8c\xab5\x94\x96\x85\xb6T\x0e\x1c\xb9\x8a!\xb7\xb0\x96#\x84\xadz&\xa4\xe2\xb0'\xbc\xb5\xa3\x12n\x99\x1eE\xb1\xa6\xdc\t-,\xb1\xe7S>\xb3\xd3.\xdc\fTU8tIO\x8a\x18\x88\x03\x90\xa0\xbap\x92A^r\x8awA\xd69<C\x86\xa0\xf8{w8Rm7\xb6k\x0f\xd4\x1b\b\xc3\xd2\xea9.\x8cp\xed\u0722\xc1\xb3\x98\u0244\xc5n\x0f\x13\x9c~\xeb\xa1l\u05f2\xf5\x99\x97\xbbSl\x9e\u0378\xde\xde\u015c.\x14G\xa2m\xc6\xe3gN\x13\x06ci\x8f\x8b\xcc\xc1\x80\xe8\xb87>`\xcbZ\x90\xd0\x16\xae![\x9f{\x9d\xacx\xb4\xd39\x1e\x16\" \xd9P\xb2\xc8q\xf9\xf3\u06be\xe3\xfa\xb1\xfe\xe7s\blIA\xd7I\x9f\x12]`\x9e\x00p\u0357\x16\x11\n\xe0\xe2-\x8ex\x8cc[\x8dQ\xc9\\\xf6R\xa9\xe3\x9f\xfd\u047f\x94\x96J\x84i\xd6<\u063aXho\x0fJ\xa8\xd9\xd5a \u079e\xfb\xb81\x110\x0e\x14\t\x10\x15\x84\xa0\xe1\f\x8b\u0328\xea\xb6\"|\x90@\xffv\xaf\xa9`=u\x0f\u0105T\xe9f#|*\xd5\bT\xb3\x91-\xa3\xc1g\x8a\x1a\x14\x99\x10>_z\xaf\xf9\x95\x00\xbe*U3\x8b\x86\xf1CV\xe3\xa1A\xa9\xa23\xa4\xe2a\"g\x11q\x82\x93\v\xd0\xf7\xa2bIr\x91B\x91\x02)\x1d\x02\xb1\x94\xaeO\x0e\xe8\xd5\xc2d\x98\x06\x93\x88\x1a\xed\x10\xac\xfe\x1dyQ\xe4\xd1e!sl \xa6^P\xcf\f\xcd\xd54 \xc6\x15\xfdrP\xe9\x86\xe0\xa1m:\x051\x87\xed@\xf0\xf2\xea\x04\xa0:,\xf8\xe1\xfbO\x15\x19\xf2\xaeZ\xa7*W8I\x04\\\u7e62\x93\fO\xc1\xdcC\x0fA>\x031\xb4P\xae)!KQ\xb9\x1d=\b\\\x94\xfe\xa1Idg\x1f\xd1F\xf5\xf3]\x19\xf9-\xb9(\xc1S\x86\u06e6'7B\x16!\xc2B\u06aa\xa1kncJ\n\xb0gi\x13n\xda;\xd32\x98@\xc5KEo\xc5\x1d\x14\x04\x10\xb9\xf2}\u01ceN\xe8\xcb'\x85H\x91\x00S\xca0\x1e\x89:,\x06\xeb\x82\u0178\xd1&\x00g\xb6D\x1d=iQ$sj\xb9\xf6w\xee\xc0\x19\x80\x13\xf9iP\xfa\x84\xfc\x1f/b\xb8\x11\nQ\x85g\x0e\x94F\xe9\x01\xca\xccO\x1a\xb0C\u9c93[y\x02\xebf^\xd8\"zK\xc1\x15\xaf\xd4\xc0\xf7b^\t\xc6\n\x9cYw\x9e5\u07a0\xba\x17\x84!\xf5\x13\xadW\xbb\u03d5^\xaa\xc1\x94\x92\xb7'~U\xbc\x89\xbb\x9b\x88\uea95M[\xa3\u0235 bR\xa0L*\x9d\xa54\x1c\xa83\xb7\xcctP\xc5\x1f\xaf\x98v\x90\x88\x14W\"\x86N\xfc4\x19}\x92\xa1\x02\x04\xa4\xb1\x9c\x91(\xb0\xb8o\x84\b\xac\xd2Y\xcbAe\x85o\b\x11\xe5v,\x93L\xec\xe5\xf6\x10\x1b\xe6\xf6\u0193Sd\n0\x95\xc1m\xe3a\x1a\x92\xdan\xe8\x9f7\xef\ty\xe9\x8eH~o\x99\xeb|\xf5=\x84\b~\u00f8T\x93_mX0\u048b]$\n\xec_n\xe0\xa5\xe1p)3\xe3=!/\xbf2\x06\f\x8b+Io3\x00s\xbc\xb5RZ\xea\u007f\u0311\xed\xbfRT?\xd3/Y\xda\x04\xceJb:\xa6\xef\v\xd6H\xfc&\xa8\xa0\xcf\x00[a\xc1\x03\xe9E\x00]3\x00|\r\xc2\xc0\x14\xa8\x95A\x83\xe03\xba\xcc \xc7K\xe0A\t\x9dt\xbc\x97\x84\xaa\x85\x10#\x00w\xe5q\xc4W\xcfM\xf6\x1bV\v\x01n\f/\xec%\x9a\xd2\x1a\xd7 \xc1\u0095\xa5\x89WVT*E\u019a\x05FYT\x95\xdd\x11,\xbfI\xc1\u0121\xbe\xee!\xe4W\xfcW\xfc\"\xec\xba\x1f7\x8dV\xfc\xc8.\x96\x0fIT\xc8\"\x05\xed cr\xe0\xaa\xf8 \x9c\v(x\xb0:\x1d\xf8\xa7\x96\u0081d\xcc\nJ\x15\xc0\x02X\u0082\xdf[\x06\x86 _\xe3\x12*\x9a\xb1\x96\x04\x9c\x87\u05c1K\x16H\xee\xba\x04\xd5\xef\xaa\f5\x86\xc0L\xaf\u04ee\x1e\x00C\xb2\xf4\u0486\x9c\x03\x01\xb1\x9c8\xa4\xb6\f\xc7\xf9\x00\x12\x98\xc0\xe3M\x1a*RA\nu\x01\x87\x847t5\xe0\x85\xc0\xdb~\xc1\xb9\x00>\xaa\u050f\xea\t\xc4$\xe0T\xcdA#Gx\xba\a\xc1tx\xf5]P\xddy\xf0\x97\x03\xf4\xbe\x1f\x88`\x91b\xe6\xa2\xf2\xf8\x8f\xd6\x03\\\xa6\x04z\xbfk\x02\xf3\xb0Eo\x04\xda^\xba\xb7\xf4\xad\x11!*@/\xad0\t\xc9\x18\xe5\xc98\x93\xaa,S\ub99dN\xe9 B\x93\xf6\xa9[\xa1\xb7\xfe\x98`F\x84\x92\xfb\x04\xaa\x9a\xb5L\xed\x8b~\xc1=\xab\x04\x03\x8ev\x84\u03b5\xf1Z\x88X?v\b\x10\xb3G\x026\xbb\xb9\r\x9dG\xb0\xba\u85b1n\xb1a\xb8F\xab\xa8\x14\xbf0&de\xf4I\xf4\b&V\xc0\x843\xe0\x16\x8e\xe9\xf07\x16-\x9b\xdf\xe8\xc1\xd2e\x8f\x1cG\xb5\xacHPNR\xb0\x8aZQ\x84y\x96\x1e\x17ZB1%\r\xd4\x05\x020\x95\xe3\u03e1\x9e\f\xb3\xdb\x13\a.\x98\x00\x03\xe6\xa3\xc6X\u032cv\xb4\xd8\xd09!]Z\x8e\xf4\x832T\x10\xb4\x1fb\u06a8\x80\xcb+\xbc,1C\xf3\x923\xf6\x03S\xc3*h\xe5\xe1\x9d \x19\xcd&\xc9\xd5*\xa1qE\xb7\x8f\xfac\xd1{!E\xbfn\r\x1b\x15\x18\x98\x99\x1bk\xb7\x16\x1c\xb7\xa6a\xe1\xb7\xf7\x1f\xde\x00\xac\x03\xbc=\xb3\xb5\xa44\xdc\u063aJ\xa4`\xd0W]\xb2\xc4\x13z\xb3\x0e\u0767\xe8Q\x85\x99\xb9\xab\x9c\x0e_\xa4\x95\r\"\u055a9\xca\xf7\xaf\xa0\x04\xa3\x06eB\xcf$4\x1fb\x05\xc7S ,\xad\u007f\xa0P\x13v\xf3J\xa3n\x85\\\x01O \xfbN\u0656.\an\x9f\xdb&'n-\x96$\xe4\xd7\x12AC\\\xc0\x92\x9a~(d\x87\x80#\xc0\x00A\x9e{\xfe\x9b\xc7`*Zt&\x89\x9d\xb3s$6\xdbff\xe4 6|ne5\x86H!\xab\x87U\xb6f(;\x02C\xf7\xe6Y\b\x12F\x80\xbd8\xdb>\xc0\x97\xb8\xefQ\xbf\xf2\x00s\xa4\xf6K\x85\xe6Ou*\x13\x9a\xba\xa7Ka\xb8\x8e\x8c\xca\x13nn\x11#B\x898A!\x87UQ\xe5\x17k\a\x890\u0148d\xaaJ\xb3\xa1\u0315\xad.\xee\x8d \x16U\xa5\xf1\x0e\x1aCR\xed$I\xc3?A\xcd\x04Rjhyq4\x1d\xb8M\xa2\u0746\x9a\x9b\xd4\xe0\x85\v\x06\u06b1&')<G\u0190(9x\xa1\xc4(\xfd\x9c\xc4\xc0f\xb6ia\xd5?\xe8\aZZ1\x81\x8e\xa0\xa0\xc7\x06\u0315Y\x8c\x14{\xf6qG\xce\xc0\xf5\xf0\x847\xeb\x1eTI\x1e'@\x96\xf7\x11\n\u06dcB\x8d\xac\xd9\xd4\xe9\x82Vh\xdd/X\xc16\x04\xb6\xa6-\u03ad#>\xa7\xf7\xee\xc2kF\xfb\r=\x16\xc9~kX\x80\xf9\x06\u0316\x022\bDm\x80\x8c\xf20\xa2\xb8\x8a\x99\x9d\xf8\x0fA\\\x86\x90\x19R\xc2\x12L\xff\xa8\u0568\xab\xb6\xffQ\xbf\x03\\\x1d\xedF\xff\xf4J\xd5~O7\xa1\xber\x80Yx\x80\xbd\x0f\xdf\t\x15\x9a\x10Q\xd5tE\xe42T\"\xfa\b(q\xf0\xe2p?\x03\xe6\xc1\x8b;1\xa6\xbfD\x1bC\x02\xb4o@\x0f>\u04013\u036cE\xd4V\x14\xbdD\xb6\x9d\xa5\x89\xc1\u010d\xc0\x85\xdf3\x14,\xbdH\xc47\x1fO,\xe4\x1e\xe0\r\xccG\xe9}\x9e\x98\xc1\u0136@\x00\b\xb0\n\u0696\x85\x1f\"\xc3\xe2'\x17\x88\x85\x10\x18]\x16\x82\u00b8\xb63z\x1a\xb4\xc4OX&%\x04\x18\xa3\x19\xf0\xe5`h\x8b\x04\xa9\x9c\xe1\f\x85P\xe0\xc0+\u048f6-\n\x15Q\xa0\f\x10\xa0)\xc0}\x02\xbd\x01`.\x82Rj\xea/\x14`\x13\xc1\xa8\x0e.\x80f\x03\xdc\x01\xb8\xd4\x00nGQp+1\xc4\x11\xf7\xa7\x83GXt\x0e\x98\xfa6\x8e\t\\[Z+\xb9\x84\xa7\xf2\xb5\xabP=\x94\xdb\xe5\xd6D\xf0\xc4\xe2UR\x0e\xea\xffI\u058dc\x1f%\xf5\x867\xca\x1a\u04e3\xc8e\x99f\xb1\xa4~\xd7<y}\u0405R\xdc\xfeL\xb4\u029d\u02f3Y\x10\x14\x1f&R6h\v\x86v\xe5\x9f\xe5\xfd\x1e\xdd\xc9B\xa8o\xf58Fd\xcf:\\B\x1c\xc5r\x13X\x9e\x004\\\xb9\xc0;\x1e\xf3Y0\x83\xfd\x17(j\x9d\x9c]_d{s;\xfa\xbe\x80J\xc2\xd7\xca\u007f7]\r86[\x1d\xae7\xa1\\\x01\x05\x02\xfeJ\u022b\xf0\x18\x8b\x0e\x03 &\xaf\x9b)\xf7\xe1\xf6EAC\x8d\xa0'\u0248\\\x11\xc7\x1a\xa0\x1f\xea$OD\xe3\x06\xb3\xec\x98\t1@`i?\xed~\x11\x91\xf8\u02a0\xea$\xe5_\x92\x94\n\"7\x96$\xc0\x14X\x87\xa0\xd2K\x03\xe4\x1e\xa8C\x93\xc5l\xb8u\x05\x17\x8f\x04\x83\xa7@\xc2\xce.[\xc0\xcaB\xeb\xc8\xfc\xb9\x82\x10\xf8ED\xe8&`\xb8hr\x9f%\xbeJE\xe1r\r\xac\xb7\xa1{\xc1\x85\xa2\u013d\x03\x00\xa4\x1bB\x12\xdc$\xd0v7\xc4\xc0\x83 \xe9\x9cx\x92\xe9\x96KY\xdb8\x1f[!\n\x89\x81\x82U}.\xebg@6\x90\x19\xbe\a%\x99\x8b\xb7\x86,\xd0<c\x15g>Q\vf\xf6~)3<teB\xe0\x87\xcd \xca4_\u01c0|c\xc9\xcd\r\xb0\xb2y\x06\x9dd\xabw\x87!\r\xf4\x17\x18\"\xf8\xe4\xee\x03\xb24T\xd3$\xa0\xca6\xd2\xe4i\v\xc1\xce\f\xb0\xbc\u4010ZO4\xe0\xac\xc0l\x84fh\xa2@T\u0116\r\x0e\x91hQ\xa0\xb6@\"7\x86ig0^0\x9d[M\vQ\t\xc7\xe2<\x85\x83\xe6\u05a2\x82\xa6\x9ef\xc4c\xd0\xec\xc9R\x86\xf0\xb5X\x06\xf18\xb1g*\xaf\x8e9\xb5X\u07b0\xb7\x86S5\xa8x\x82E\x98c\xa4\xc4L\u0242\x9a\x8c3\u0617Z^?}\xbd\xb7\xb9\xb00\xe3LV\xb0\x8d\r\x193\x84\xc3X\x80\x049\x16a\xa8\xae4=\xe4\x1f(\x13\x0fm\xc1!\xb93\x96\x1b\x13\x97\xad\xf3Y\a\xb5Bb\u07ed\xa3$\xa3\x9b\xe2;Y\x16t\xf1\x9e\xfa\xc0\v8+\xe90\x8aHz*\xfe(\x10\xac|QZhf\xa1\xac1S\"\xc6G\x02\x82\xd9,y9]\x91]\x01\xaaT\xa0\xf7\xe3\x9d\xe1\xaehnU\xd2\xf5\x0e`\xf1\x96\x94\u0686\xea%\x1c;\"\xa5\xf0\xad\r\xace\t\xb4\xdfx\xf3OA*\xd0GW\xd8{\x8e\xe47t\tC\x8f\xb0\xd1\xf9\x116J\x13G2\xe1\xbb0LO\xd9K\xa1\x8ea\x93g\xe3[\xb6\xda\b\x86\xbe\x05\v\xb7$euo\xf7j\xac\aMX\xa5\xee\x1e'\xb8\xeeD\xb6\xfb\x9f\xfe\xfaXW\x12b\xe6q\xc0-fG\v.\x88\x1d\xac\xde'V\xfe\x01tY\xf2[v\x1faw\x82\xe74:b3#^\f\xd0'\x8a#\x83\x8a\xf0\xe1\xe3\x91&n\xe0\xe5\x12\f\u01f80\x91\u5ff1\xad\a\x06\xd1D>\xb6\xaf\x83\a\x8c\xdc\xf3\x05(\x80\x82:\fa0;\x9f\x05\xe3M\xe1\xcfX\x9c\x9c\n\xb6w)\x04L\x17\x05\x1a3_\xf9l\u007f\xddMGxbg\xb4\x12\x83\u0100\xe4\xc0\xab\"\xfe9e\u0089\x1f\xf6`R\xff\xd9\x17\x1cA[\x00$\xc0\x8a\xb9O\x1d\xea\xe30\xbf\"\r\x80\x14\x05\x92F\u007f\xb9\xab\x1c\xea\xc6A\"\xb1\r\txF\x9e+\x0f=\xc5\x06\xe8\x0e\xb5n\xe1t\x86]\"\x1dg\x02\x8d\xe7c\xfcEW&\x97\x11\xb6\x82R\xd1\x0e\x94$\x90\x16\x0e\a\xb1q\xcd\x12{\tK\xdb\x1ez\x15\x01!\x1c\x96\x84:\x167\xab%iMa\xea\\\xc1$1\rDb\xef\u053cU\x11\xff\x01\xd5\xc8\x1b\xc620\x02\xe3U\xe7\u007f\xed,\x12\x85A\x96\x88\x83\x0e\xa7\xd1;\v\x8cdD\xfc\xd2\xc2\v}\x11r\fD\xd81\x10\xa3\xddQ\u0341y\xbf\xe9\u0570\x80|\u0148\xa29\x9dJ\xd8c\nK\x01\x9c8dq\xae\xf0\xa1\x10l\xc8\tgNP\xd3k\xab\xdaNm\xb2\xef\xca\x17\xa5_\xcc^\xbbCX:\xdc?\x8b\x81\xabQ\x14\xb5\x90\x18\v*\xbd\u0185j\x17\x18\xc9Q\x94\xd0/-_R\xa1\xc8\v\f\xf5\x9fU\f\xe0\x84^f\xfb\u007f\xe4\n\xe3\x9de\x00\xb0\x02\x9c\xdb&2`\xdd\b\x82F\xa9\x89[\xdd\xf0&b\xcbS\xf2T\xb31\xe1V`\xb1~u\xd4|rU,\x01\xdbH!\b<N\u0730\t\u05bb\x0f\xc0_\xb6U\xa1a\xef\xe9\x03!\x90d\xd6\xca\x1f\xe2ke~\xb6\xc4h\xa1(\u0123\x8f\x8cT\xf2hZt\xc8;\tm\xb6\xac\xbfWS\x1c\x8f*\x88^\x9cN8\x98\x15T\x90\x8c@T\x19\x9cH\xdc\xe2\x04d\x1d\x94\xbf\x8d\xc9kX\xa4\xf4\xb6$\x0f\xb9\x01\x102\xb1\x1c~\x94\xf4\x00.\x9auq\xab\xef\ng\x96\xd4\xfb*@\b'\x19\xf0\xd8\v8\xbah\x96\x93\xd7\x16\xb1\u012a\xb6\x03I\xd5\xf0\xb2\xaea\t\x0495\xb66\x00\xb9`d,r\t1\t\xc5h\x1e[l\x94A\xa0\xd1(\v\xfcAa\x1f\x9a\v\xd1\x1e\x1d\xcd\x1b0\x01\x838p\x15\x15b\x95\x122\x97\x044\xd0h\xe3\xa5\xd2\x1d\x016aT9<\u0356\xac\xef\x82\xc6\xc5\xf5\u0724\x8c\x9e\x84x\xe0\x96R\xa4!HZM\xa8\x06-uQ\xec*s\xd4m\x9e\x8a\x11N3\r\f\x00=@NVi\xb5\xa2\x06\x9f\x80\x90\xb1\xa5\x00&\x06T\xd9h\xdc\x04\v\x92\xf1g\b\xb2j\xa4.\xb8.1H\b\x88\xb8\xd7\x1d,\x93\x8bD1%\f\xb8\x1c\x81\xa6\u03a1\xa3\x84Wis\xa9\x9b\xafF\xf2\xf8\x83\x8bi\x8c\xefE\xa8\x87\x93mb\xb2\x1bu\t1\"H\x9e-x\x06a\xf4(\x99\x15\x1b\x96Q\xa2r\xe9a\xd3\x17\xf9\xf4\x12\xb0J1'\xc2'\xfa\xa3\xed\x13\xa7:yUd\xb7En\xed/J\xb4\xa0\xccp\xdc6\xa2z\x18h\x96T\xb4\xee\xba6\xe8`=\xaf\xe6\x02\x15\x86M\xb4\xf0\b\x1b\xa05j\xe8\xa4\tz\xaf\u0725\x8a\x95b\u0575\x00\x92*\xe5\x80\xe9\xc2.\xea\x8d7#:\xb5Z\a\r%\xaa(\t=\xcb\xdeQ\xf7\x82\u0a44\xa6\x84\xe3\x0e\xa3\x18\xa8\x88hC\xa5]\xac\xd2\xe8\u02b7=:\b\xbb<d\x86\x96\xbaJ@c^\xacBh\x85#K\xade\xd3. \xc0\xf0\xa7\xa8e^\x12\xbc\u02bd\x9eO\xc7\xe7,\xecO\xad\xb5\n\xea\xd3\u02a7\xf7\x81\xb7%e\xb5tm\xfec\x8c\xb0\xf8\x9d\xb8+\xa6W\xec\f\x98\xce\x0e\xe9\u01f6F\xa7\xc8\xd1R\xebsC\xb0\x8f\x94\xee\nT,.\xee\xc3-l~\x04P\xbd\xa1-P\xd2\xfa`\x17\x90O\\AF\xb2\xbf\xac\x02\xa6\xb0dBpD\xe9\xf6[q\xa0")
+
+func third_partySwaggerUiFontsDroidSansV6Latin700EotBytes() ([]byte, error) {
+	return _third_partySwaggerUiFontsDroidSansV6Latin700Eot, nil
+}
+
+func third_partySwaggerUiFontsDroidSansV6Latin700Eot() (*asset, error) {
+	bytes, err := third_partySwaggerUiFontsDroidSansV6Latin700EotBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/fonts/droid-sans-v6-latin-700.eot", size: 22924, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiFontsDroidSansV6Latin700Svg = []byte(`<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg">
+<defs >
+<font id="DroidSans" horiz-adv-x="1123" ><font-face
+    font-family="Droid Sans"
+    units-per-em="2048"
+    panose-1="2 11 8 6 3 8 4 2 2 4"
+    ascent="1907"
+    descent="-492"
+    alphabetic="0" />
+<glyph unicode=" " glyph-name="space" horiz-adv-x="532" />
+<glyph unicode="!" glyph-name="exclam" horiz-adv-x="586" d="M416 485H172L121 1462H467L416 485ZM117 143Q117 190 130 222T168 275T224 304T293 313Q328 313 359 304T415 275T453 223T467 143Q467 98 453 66T415 13T360 -17T293 -27Q256 -27 224 -18T168 13T131
+66T117 143Z" />
+<glyph unicode="&quot;" glyph-name="quotedbl" horiz-adv-x="967" d="M412 1462L371 934H174L133 1462H412ZM834 1462L793 934H596L555 1462H834Z" />
+<glyph unicode="#" glyph-name="numbersign" horiz-adv-x="1323" d="M999 844L952 612H1210V406H913L836 0H616L694 406H500L424 0H209L283 406H45V612H322L369 844H117V1053H406L483 1460H702L625 1053H823L901 1460H1116L1038 1053H1278V844H999ZM539 612H735L782
+844H586L539 612Z" />
+<glyph unicode="$" glyph-name="dollar" horiz-adv-x="1128" d="M1061 457Q1061 382 1035 318T956 206T825 127T645 86V-119H508V82Q442 84 386 90T281 107T188 133T100 168V432Q142 411 191 392T294 358T401 331T508 317V635Q500 638 491 642Q483 645 475 648T461
+653Q370 688 302 726T189 811T121 915T98 1044Q98 1119 126 1180T208 1287T337 1361T508 1399V1556H645V1405Q732 1400 823 1380T1014 1317L913 1083Q848 1109 778 1129T645 1155V862L684 848Q779 813 850 776T968 693T1038 590T1061 457ZM760 451Q760 475 754
+493T733 526T698 553T645 580V328Q704 337 732 367T760 451ZM399 1051Q399 1004 425 973T508 920V1153Q454 1147 427 1123T399 1051Z" />
+<glyph unicode="%" glyph-name="percent" horiz-adv-x="1804" d="M315 1024Q315 897 337 835T410 772Q459 772 482 834T506 1024Q506 1274 410 1274Q360 1274 338 1213T315 1024ZM758 1026Q758 918 738 832T674 687T565 597T408 565Q323 565 259 596T151 687T85
+832T63 1026Q63 1134 83 1219T145 1362T253 1452T408 1483Q494 1483 559 1452T669 1363T735 1219T758 1026ZM1425 1462L614 0H375L1186 1462H1425ZM1298 440Q1298 313 1320 251T1393 188Q1442 188 1465 250T1489 440Q1489 690 1393 690Q1343 690 1321 629T1298
+440ZM1741 442Q1741 334 1721 249T1657 104T1548 14T1391 -18Q1306 -18 1242 13T1135 104T1069 248T1047 442Q1047 550 1067 635T1129 778T1236 868T1391 899Q1477 899 1542 868T1652 779T1718 635T1741 442Z" />
+<glyph unicode="&amp;" glyph-name="ampersand" horiz-adv-x="1479" d="M1475 0H1098L1001 100Q921 45 825 13T612 -20Q492 -20 395 10T228 94T120 225T82 395Q82 472 100 532T153 642T235 731T344 807Q306 853 280 895T237 979T214 1062T207 1149Q207 1227 237
+1288T322 1393T452 1460T618 1483Q704 1483 776 1462T901 1401T984 1301T1014 1165Q1014 1096 992 1039T931 932T842 842T731 766L991 498Q1026 564 1052 637T1098 784H1415Q1400 727 1380 664T1332 538T1270 411T1192 291L1475 0ZM403 424Q403 380 419 345T463
+286T530 249T614 236Q674 236 725 251T819 295L510 625Q459 583 431 535T403 424ZM731 1124Q731 1155 721 1176T695 1212T658 1232T616 1239Q594 1239 572 1233T531 1214T501 1178T489 1122Q489 1070 512 1024T575 932Q652 976 691 1020T731 1124Z" />
+<glyph unicode="&apos;" glyph-name="quotesingle" horiz-adv-x="545" d="M412 1462L371 934H174L133 1462H412Z" />
+<glyph unicode="(" glyph-name="parenleft" horiz-adv-x="694" d="M82 561Q82 686 100 807T155 1043T248 1263T383 1462H633Q492 1269 420 1038T348 563Q348 444 366 326T420 95T509 -124T631 -324H383Q305 -234 249 -131T155 84T100 317T82 561Z" />
+<glyph unicode=")" glyph-name="parenright" horiz-adv-x="694" d="M612 561Q612 437 594 317T539 85T446 -131T311 -324H63Q132 -230 185 -124T274 95T328 326T346 563Q346 807 274 1038T61 1462H311Q389 1369 445 1264T539 1044T594 808T612 561Z" />
+<glyph unicode="*" glyph-name="asterisk" horiz-adv-x="1116" d="M688 1556L647 1188L1020 1292L1053 1040L713 1016L936 719L709 598L553 911L416 600L180 719L401 1016L63 1042L102 1292L467 1188L426 1556H688Z" />
+<glyph unicode="+" glyph-name="plus" horiz-adv-x="1128" d="M455 612H88V831H455V1200H674V831H1040V612H674V248H455V612Z" />
+<glyph unicode="," glyph-name="comma" horiz-adv-x="594" d="M459 215Q445 161 426 100T383 -23T334 -146T283 -264H63Q78 -203 92 -137T120 -6T145 122T164 238H444L459 215Z" />
+<glyph unicode="-" glyph-name="hyphen" horiz-adv-x="659" d="M61 424V674H598V424H61Z" />
+<glyph unicode="." glyph-name="period" horiz-adv-x="584" d="M117 143Q117 190 130 222T168 275T224 304T293 313Q328 313 359 304T415 275T453 223T467 143Q467 98 453 66T415 13T360 -17T293 -27Q256 -27 224 -18T168 13T131 66T117 143Z" />
+<glyph unicode="/" glyph-name="slash" horiz-adv-x="846" d="M836 1462L291 0H14L559 1462H836Z" />
+<glyph unicode="0" glyph-name="zero" horiz-adv-x="1128" d="M1065 731Q1065 554 1038 415T950 179T794 31T563 -20Q436 -20 342 31T186 179T94 415T63 731Q63 908 90 1048T178 1285T333 1433T563 1485Q689 1485 783 1434T940 1286T1034 1049T1065 731ZM371 731Q371
+481 414 355T563 229Q667 229 712 354T758 731Q758 982 713 1108T563 1235Q510 1235 474 1203T414 1108T381 951T371 731Z" />
+<glyph unicode="1" glyph-name="one" horiz-adv-x="1128" d="M817 0H508V846Q508 872 508 908T510 984T513 1064T516 1137Q511 1131 499 1119T472 1093T441 1063T410 1036L242 901L92 1087L563 1462H817V0Z" />
+<glyph unicode="2" glyph-name="two" horiz-adv-x="1128" d="M1063 0H82V215L426 586Q491 656 544 715T635 830T694 944T715 1069Q715 1143 671 1184T551 1225Q472 1225 399 1186T246 1075L78 1274Q123 1315 172 1352T280 1419T410 1465T569 1483Q674 1483 757
+1454T900 1372T990 1242T1022 1071Q1022 985 992 907T910 753T790 603T643 451L467 274V260H1063V0Z" />
+<glyph unicode="3" glyph-name="three" horiz-adv-x="1128" d="M1006 1135Q1006 1059 982 999T915 893T815 817T690 770V764Q867 742 958 657T1049 426Q1049 330 1015 249T909 107T729 14T473 -20Q355 -20 251 -1T57 59V322Q102 298 152 280T252 250T350 231T442
+225Q528 225 585 241T676 286T724 355T739 444Q739 489 721 525T661 587T552 627T387 641H283V858H385Q477 858 538 874T635 919T687 986T702 1067Q702 1145 654 1189T500 1233Q452 1233 411 1224T334 1200T269 1168T215 1133L59 1339Q101 1370 150 1396T258 1441T383
+1472T526 1483Q634 1483 722 1460T874 1392T971 1283T1006 1135Z" />
+<glyph unicode="4" glyph-name="four" horiz-adv-x="1128" d="M1085 303H909V0H608V303H4V518L625 1462H909V543H1085V303ZM608 543V791Q608 804 608 828T610 884T612 948T615 1011T618 1063T621 1096H612Q594 1054 572 1007T520 913L276 543H608Z" />
+<glyph unicode="5" glyph-name="five" horiz-adv-x="1128" d="M598 934Q692 934 773 905T914 820T1008 681T1042 489Q1042 370 1005 276T896 116T718 15T473 -20Q418 -20 364 -15T261 -1T167 24T86 59V326Q121 306 167 289T262 259T362 239T457 231Q591 231 661
+286T731 463Q731 571 663 627T451 684Q425 684 396 681T338 673T283 663T238 651L115 717L170 1462H942V1200H438L414 913Q446 920 488 927T598 934Z" />
+<glyph unicode="6" glyph-name="six" horiz-adv-x="1128" d="M76 621Q76 726 87 830T128 1029T208 1207T336 1349T522 1444T776 1479Q797 1479 822 1478T872 1476T922 1471T965 1464V1217Q927 1226 885 1231T799 1237Q664 1237 577 1204T439 1110T367 966T340
+780H352Q372 816 400 847T467 901T552 937T659 950Q754 950 830 919T958 829T1039 684T1067 487Q1067 368 1034 274T938 115T788 15T590 -20Q482 -20 388 18T225 136T116 335T76 621ZM584 227Q625 227 658 242T716 289T754 369T768 483Q768 590 724 651T588 713Q542
+713 504 695T439 648T398 583T383 510Q383 459 395 409T433 318T496 252T584 227Z" />
+<glyph unicode="7" glyph-name="seven" horiz-adv-x="1128" d="M207 0L727 1200H55V1460H1063V1266L530 0H207Z" />
+<glyph unicode="8" glyph-name="eight" horiz-adv-x="1128" d="M565 1481Q656 1481 737 1459T879 1393T976 1283T1012 1128Q1012 1062 992 1009T937 912T854 834T750 772Q808 741 863 703T962 618T1031 511T1057 379Q1057 288 1021 214T920 88T765 8T565 -20Q447
+-20 355 7T200 84T105 207T72 371Q72 446 94 506T154 614T243 699T352 764Q303 795 260 831T186 912T136 1011T117 1130Q117 1217 153 1282T252 1392T395 1459T565 1481ZM358 389Q358 349 371 316T409 258T473 221T561 207Q666 207 718 256T770 387Q770 429 753
+462T708 524T645 577T575 623L553 637Q509 615 473 590T412 534T372 467T358 389ZM563 1255Q530 1255 502 1245T453 1216T420 1169T408 1106Q408 1064 420 1034T454 980T504 938T565 901Q596 917 624 936T673 979T708 1035T721 1106Q721 1141 709 1169T676 1216T626
+1245T563 1255Z" />
+<glyph unicode="9" glyph-name="nine" horiz-adv-x="1128" d="M1055 838Q1055 733 1044 629T1003 429T923 252T795 109T609 15T354 -20Q333 -20 308 -19T258 -17T208 -13T166 -6V242Q203 232 245 227T332 221Q467 221 554 254T692 348T764 493T791 678H778Q758
+642 730 611T664 557T578 521T471 508Q376 508 300 539T172 629T91 774T63 971Q63 1090 96 1184T192 1343T342 1444T541 1479Q649 1479 743 1441T906 1323T1015 1123T1055 838ZM547 1231Q506 1231 472 1216T414 1170T376 1090T362 975Q362 869 407 807T543 745Q589
+745 627 763T692 810T733 875T748 948Q748 999 736 1049T698 1140T635 1206T547 1231Z" />
+<glyph unicode=":" glyph-name="colon" horiz-adv-x="584" d="M117 143Q117 190 130 222T168 275T224 304T293 313Q328 313 359 304T415 275T453 223T467 143Q467 98 453 66T415 13T360 -17T293 -27Q256 -27 224 -18T168 13T131 66T117 143ZM117 969Q117 1016
+130 1048T168 1101T224 1130T293 1139Q328 1139 359 1130T415 1101T453 1049T467 969Q467 924 453 892T415 839T360 809T293 799Q256 799 224 808T168 838T131 891T117 969Z" />
+<glyph unicode=";" glyph-name="semicolon" horiz-adv-x="594" d="M444 238L459 215Q445 161 426 100T383 -23T334 -146T283 -264H63Q78 -203 92 -137T120 -6T145 122T164 238H444ZM117 969Q117 1016 130 1048T168 1101T224 1130T293 1139Q328 1139 359 1130T415
+1101T453 1049T467 969Q467 924 453 892T415 839T360 809T293 799Q256 799 224 808T168 838T131 891T117 969Z" />
+<glyph unicode="&lt;" glyph-name="less" horiz-adv-x="1128" d="M1040 203L88 641V784L1040 1280V1040L397 723L1040 442V203Z" />
+<glyph unicode="=" glyph-name="equal" horiz-adv-x="1128" d="M88 807V1024H1040V807H88ZM88 418V637H1040V418H88Z" />
+<glyph unicode="&gt;" glyph-name="greater" horiz-adv-x="1128" d="M88 442L731 723L88 1040V1280L1040 784V641L88 203V442Z" />
+<glyph unicode="?" glyph-name="question" horiz-adv-x="940" d="M264 485V559Q264 610 274 651T306 730T362 803T444 877Q486 910 515 936T562 987T588 1041T596 1106Q596 1163 558 1200T440 1237Q371 1237 292 1208T127 1137L25 1358Q68 1383 118 1405T223 1445T334
+1473T444 1483Q546 1483 628 1459T767 1387T854 1273T885 1120Q885 1057 871 1008T830 916T761 834T664 750Q622 717 596 693T554 646T534 601T528 545V485H264ZM231 143Q231 190 244 222T282 275T338 304T408 313Q443 313 474 304T530 275T568 223T582 143Q582
+98 568 66T530 13T475 -17T408 -27Q371 -27 339 -18T282 13T245 66T231 143Z" />
+<glyph unicode="@" glyph-name="at" horiz-adv-x="1774" d="M1673 752Q1673 657 1651 564T1582 398T1467 279T1303 233Q1265 233 1232 242T1170 269T1122 310T1090 362H1075Q1056 337 1031 314T975 272T907 244T825 233Q742 233 678 261T569 342T502 468T479 631Q479
+734 510 820T599 968T740 1065T926 1100Q971 1100 1019 1095T1111 1082T1195 1064T1262 1044L1241 625Q1239 603 1239 582T1239 555Q1239 513 1245 486T1262 444T1286 422T1315 416Q1350 416 1376 443T1419 516T1445 623T1454 754Q1454 882 1416 982T1311 1151T1150
+1256T948 1292Q795 1292 679 1241T484 1099T365 882T324 608Q324 470 359 364T463 185T633 75T866 37Q922 37 981 44T1098 63T1213 92T1321 129V-63Q1227 -105 1113 -129T868 -154Q687 -154 545 -103T304 46T154 283T102 602Q102 726 129 839T207 1050T331 1227T499
+1363T706 1450T948 1481Q1106 1481 1239 1431T1468 1286T1619 1056T1673 752ZM711 627Q711 515 749 466T850 416Q892 416 922 435T972 490T1002 575T1016 686L1028 907Q1008 912 981 915T926 918Q867 918 826 893T760 827T723 734T711 627Z" />
+<glyph unicode="A" glyph-name="A" horiz-adv-x="1331" d="M1018 0L918 348H414L313 0H0L475 1468H854L1331 0H1018ZM846 608L752 928Q746 946 734 987T709 1077T683 1177T666 1262Q662 1240 656 1210T641 1147T623 1079T606 1015T592 962T582 928L489 608H846Z" />
+<glyph unicode="B" glyph-name="B" horiz-adv-x="1315" d="M184 1462H612Q750 1462 854 1443T1028 1380T1133 1266T1169 1092Q1169 1030 1154 976T1110 881T1040 813T944 776V766Q999 754 1046 732T1129 670T1185 570T1206 424Q1206 324 1171 246T1071 113T912
+29T700 0H184V1462ZM494 883H655Q713 883 752 893T815 925T849 977T860 1051Q860 1135 808 1171T641 1208H494V883ZM494 637V256H676Q737 256 778 270T845 310T882 373T893 455Q893 496 882 529T845 587T775 624T668 637H494Z" />
+<glyph unicode="C" glyph-name="C" horiz-adv-x="1305" d="M805 1225Q716 1225 648 1191T533 1092T462 935T438 727Q438 610 459 519T525 366T639 271T805 238Q894 238 983 258T1178 315V55Q1130 35 1083 21T987 -2T887 -15T776 -20Q607 -20 483 34T278 186T158
+422T119 729Q119 895 164 1033T296 1272T511 1427T805 1483Q914 1483 1023 1456T1233 1380L1133 1128Q1051 1167 968 1196T805 1225Z" />
+<glyph unicode="D" glyph-name="D" horiz-adv-x="1434" d="M1315 745Q1315 560 1265 421T1119 188T885 47T569 0H184V1462H612Q773 1462 902 1416T1124 1280T1265 1055T1315 745ZM1001 737Q1001 859 977 947T906 1094T792 1180T637 1208H494V256H608Q804 256 902
+376T1001 737Z" />
+<glyph unicode="E" glyph-name="E" horiz-adv-x="1147" d="M1026 0H184V1462H1026V1208H494V887H989V633H494V256H1026V0Z" />
+<glyph unicode="F" glyph-name="F" horiz-adv-x="1124" d="M489 0H184V1462H1022V1208H489V831H985V578H489V0Z" />
+<glyph unicode="G" glyph-name="G" horiz-adv-x="1483" d="M739 821H1319V63Q1261 44 1202 29T1080 3T947 -14T799 -20Q635 -20 509 28T296 172T164 408T119 733Q119 905 169 1044T316 1280T556 1430T883 1483Q1000 1483 1112 1458T1317 1393L1214 1145Q1146 1179
+1061 1202T881 1225Q779 1225 698 1190T558 1089T469 932T438 727Q438 619 459 530T527 375T645 274T819 238Q885 238 930 244T1016 258V563H739V821Z" />
+<glyph unicode="H" glyph-name="H" horiz-adv-x="1485" d="M1300 0H991V631H494V0H184V1462H494V889H991V1462H1300V0Z" />
+<glyph unicode="I" glyph-name="I" horiz-adv-x="797" d="M731 0H66V176L244 258V1204L66 1286V1462H731V1286L553 1204V258L731 176V0Z" />
+<glyph unicode="J" glyph-name="J" horiz-adv-x="678" d="M-2 -430Q-67 -430 -116 -424T-199 -408V-150Q-162 -158 -122 -164T-33 -170Q13 -170 52 -160T121 -126T167 -60T184 43V1462H494V53Q494 -73 458 -164T356 -314T199 -402T-2 -430Z" />
+<glyph unicode="K" glyph-name="K" horiz-adv-x="1298" d="M1298 0H946L610 608L494 522V0H184V1462H494V758L616 965L950 1462H1294L827 803L1298 0Z" />
+<glyph unicode="L" glyph-name="L" horiz-adv-x="1096" d="M184 0V1462H494V256H1026V0H184Z" />
+<glyph unicode="M" glyph-name="M" horiz-adv-x="1870" d="M772 0L451 1147H442Q448 1055 452 969Q454 932 455 893T458 816T460 743T461 680V0H184V1462H606L922 344H928L1264 1462H1686V0H1397V692Q1397 718 1397 751T1399 821T1401 896T1404 970Q1408 1054
+1411 1145H1403L1057 0H772Z" />
+<glyph unicode="N" glyph-name="N" horiz-adv-x="1604" d="M1419 0H1026L451 1106H442Q448 1029 452 953Q456 888 458 817T461 688V0H184V1462H575L1149 367H1155Q1152 443 1148 517Q1147 549 1146 582T1143 649T1142 714T1141 770V1462H1419V0Z" />
+<glyph unicode="O" glyph-name="O" horiz-adv-x="1548" d="M1430 733Q1430 564 1391 425T1270 187T1066 34T774 -20Q606 -20 483 34T279 187T159 425T119 735Q119 905 158 1043T279 1280T483 1431T776 1485Q944 1485 1067 1432T1270 1280T1390 1043T1430 733ZM438
+733Q438 618 458 527T519 372T624 274T774 240Q863 240 926 274T1030 371T1090 526T1110 733Q1110 848 1091 939T1031 1095T927 1193T776 1227Q689 1227 625 1193T520 1095T458 940T438 733Z" />
+<glyph unicode="P" glyph-name="P" horiz-adv-x="1225" d="M494 774H555Q686 774 752 826T819 995Q819 1104 760 1156T573 1208H494V774ZM1133 1006Q1133 910 1104 822T1009 667T834 560T565 520H494V0H184V1462H590Q731 1462 833 1431T1002 1341T1101 1198T1133 1006Z" />
+<glyph unicode="Q" glyph-name="Q" horiz-adv-x="1548" d="M1430 733Q1430 614 1411 510T1352 319T1253 166T1112 55L1473 -348H1075L807 -18Q800 -18 794 -19Q789 -20 784 -20T774 -20Q606 -20 483 34T279 187T159 425T119 735Q119 905 158 1043T279 1280T483
+1431T776 1485Q944 1485 1067 1432T1270 1280T1390 1043T1430 733ZM438 733Q438 618 458 527T519 372T624 274T774 240Q863 240 926 274T1030 371T1090 526T1110 733Q1110 848 1091 939T1031 1095T927 1193T776 1227Q689 1227 625 1193T520 1095T458 940T438 733Z"
+/>
+<glyph unicode="R" glyph-name="R" horiz-adv-x="1290" d="M494 813H578Q707 813 763 864T819 1016Q819 1120 759 1164T573 1208H494V813ZM494 561V0H184V1462H584Q865 1462 999 1354T1133 1024Q1133 949 1113 888T1060 780T983 697T891 637Q1002 459 1090 319Q1128
+259 1163 202T1227 100T1273 28L1290 0H946L629 561H494Z" />
+<glyph unicode="S" glyph-name="S" horiz-adv-x="1073" d="M985 406Q985 308 952 230T854 96T696 10T481 -20Q375 -20 277 2T94 68V356Q142 333 191 312T290 273T391 246T492 236Q543 236 579 247T638 279T671 328T682 391Q682 432 665 463T616 522T540 576T440
+631Q394 655 337 689T230 773T145 895T111 1067Q111 1165 143 1242T236 1373T381 1455T573 1483Q626 1483 676 1476T776 1456T876 1424T979 1380L879 1139Q834 1160 795 1176T719 1203T647 1219T575 1225Q497 1225 456 1184T414 1073Q414 1036 426 1008T466 954T537
+903T643 844Q718 804 781 763T889 671T960 556T985 406Z" />
+<glyph unicode="T" glyph-name="T" horiz-adv-x="1124" d="M717 0H408V1204H41V1462H1083V1204H717V0Z" />
+<glyph unicode="U" glyph-name="U" horiz-adv-x="1466" d="M1292 1462V516Q1292 402 1258 304T1153 134T976 21T727 -20Q592 -20 489 18T316 128T210 298T174 520V1462H483V543Q483 462 499 405T546 311T625 257T735 240Q866 240 924 316T983 545V1462H1292Z" />
+<glyph unicode="V" glyph-name="V" horiz-adv-x="1249" d="M936 1462H1249L793 0H455L0 1462H313L561 582Q566 565 574 525T592 437T611 341T625 260Q630 293 639 341T658 436T677 524T692 582L936 1462Z" />
+<glyph unicode="W" glyph-name="W" horiz-adv-x="1898" d="M1546 0H1194L1014 721Q1010 736 1005 763T992 824T978 895T965 967T955 1031T948 1079Q946 1061 942 1032T931 968T919 896T906 825T893 763T883 719L705 0H352L0 1462H305L471 664Q474 648 479 618T492
+549T506 469T521 387T534 313T543 256Q546 278 551 312T563 384T576 464T590 540T601 603T610 643L813 1462H1085L1288 643Q1291 631 1296 604T1308 541T1322 464T1335 385T1347 312T1356 256Q1359 278 1364 312T1377 387T1391 469T1406 549T1418 617T1427 664L1593
+1462H1898L1546 0Z" />
+<glyph unicode="X" glyph-name="X" horiz-adv-x="1284" d="M1284 0H930L631 553L332 0H0L444 754L31 1462H373L647 936L915 1462H1249L831 737L1284 0Z" />
+<glyph unicode="Y" glyph-name="Y" horiz-adv-x="1196" d="M598 860L862 1462H1196L752 569V0H444V559L0 1462H336L598 860Z" />
+<glyph unicode="Z" glyph-name="Z" horiz-adv-x="1104" d="M1055 0H49V201L668 1206H68V1462H1036V1262L418 256H1055V0Z" />
+<glyph unicode="[" glyph-name="bracketleft" horiz-adv-x="678" d="M627 -324H143V1462H627V1251H403V-113H627V-324Z" />
+<glyph unicode="\" glyph-name="backslash" horiz-adv-x="846" d="M289 1462L834 0H557L12 1462H289Z" />
+<glyph unicode="]" glyph-name="bracketright" horiz-adv-x="678" d="M51 -113H274V1251H51V1462H535V-324H51V-113Z" />
+<glyph unicode="^" glyph-name="asciicircum" horiz-adv-x="1090" d="M8 520L446 1470H590L1085 520H846L524 1163Q455 1002 384 839T244 520H8Z" />
+<glyph unicode="_" glyph-name="underscore" horiz-adv-x="842" d="M846 -324H-4V-184H846V-324Z" />
+<glyph unicode="` + "`" + `" glyph-name="grave" horiz-adv-x="1182" d="M645 1241Q611 1269 564 1310T470 1396T386 1480T332 1548V1569H674Q690 1535 711 1495T756 1414T803 1335T848 1268V1241H645Z" />
+<glyph unicode="a" glyph-name="a" horiz-adv-x="1176" d="M809 0L750 152H741Q708 107 675 75T603 21T516 -10T403 -20Q335 -20 277 1T177 66T110 176T86 334Q86 512 200 596T541 690L719 696V780Q719 849 679 882T567 915Q495 915 427 894T289 838L190 1040Q274
+1087 376 1114T590 1141Q799 1141 910 1043T1022 745V0H809ZM719 518L618 514Q557 512 515 498T448 461T411 405T399 332Q399 262 433 233T522 203Q564 203 600 217T662 260T704 330T719 426V518Z" />
+<glyph unicode="b" glyph-name="b" horiz-adv-x="1245" d="M756 1139Q842 1139 913 1102T1035 992T1114 811T1143 561Q1143 417 1115 309T1034 127T909 17T748 -20Q692 -20 649 -8T571 24T512 69T465 123H444L393 0H160V1556H465V1194Q465 1161 463 1123T459 1051Q456
+1012 453 973H465Q486 1008 513 1038T575 1090T656 1126T756 1139ZM653 895Q602 895 567 877T509 821T477 728T465 596V563Q465 482 474 419T506 314T564 249T655 227Q746 227 788 313T831 565Q831 730 789 812T653 895Z" />
+<glyph unicode="c" glyph-name="c" horiz-adv-x="1022" d="M625 -20Q505 -20 409 13T244 115T139 293T102 553Q102 720 139 832T245 1013T410 1110T625 1139Q711 1139 796 1118T956 1059L868 827Q802 856 741 874T625 893Q514 893 464 809T414 555Q414 387 464
+307T621 227Q708 227 779 249T924 307V53Q887 35 852 21T782 -2T708 -15T625 -20Z" />
+<glyph unicode="d" glyph-name="d" horiz-adv-x="1245" d="M489 -20Q403 -20 332 17T210 126T131 307T102 557Q102 701 130 809T211 991T337 1102T498 1139Q552 1139 597 1127T678 1092T742 1040T793 975H803Q797 1014 792 1054Q787 1088 784 1126T780 1198V1556H1085V0H852L793
+145H780Q759 111 732 81T670 28T590 -7T489 -20ZM600 223Q654 223 692 241T753 297T788 391T801 522V555Q801 636 791 699T758 804T696 869T598 891Q502 891 457 805T412 553Q412 388 457 306T600 223Z" />
+<glyph unicode="e" glyph-name="e" horiz-adv-x="1190" d="M612 922Q531 922 478 865T416 686H805Q804 737 792 780T756 854T696 904T612 922ZM651 -20Q531 -20 430 15T256 120T143 298T102 551Q102 698 139 808T242 991T402 1102T610 1139Q721 1139 810 1106T962
+1007T1058 848T1092 631V483H410Q412 419 430 368T482 281T563 226T672 207Q723 207 768 212T857 229T942 256T1028 295V59Q988 38 948 24T862 -1T765 -15T651 -20Z" />
+<glyph unicode="f" glyph-name="f" horiz-adv-x="793" d="M741 889H514V0H209V889H41V1036L209 1118V1200Q209 1307 235 1377T309 1490T425 1549T578 1567Q670 1567 733 1553T840 1520L768 1296Q737 1307 703 1316T623 1325Q563 1325 539 1287T514 1188V1118H741V889Z" />
+<glyph unicode="g" glyph-name="g" horiz-adv-x="1130" d="M1085 1116V950L922 899Q942 865 950 829T958 750Q958 665 931 595T851 474T718 397T532 369Q509 369 482 371T442 377Q422 360 411 342T399 297Q399 276 412 264T446 244T495 234T553 231H727Q808 231
+872 213T980 156T1049 60T1073 -80Q1073 -175 1035 -251T922 -381T734 -463T475 -492Q361 -492 276 -471T134 -409T49 -311T20 -182Q20 -121 41 -76T97 1T176 53T268 84Q247 93 227 109T190 146T163 192T152 246Q152 278 161 304T189 352T234 395T295 436Q207 474
+156 558T104 756Q104 846 132 917T214 1037T348 1113T532 1139Q552 1139 577 1137T626 1131T672 1123T705 1116H1085ZM285 -158Q285 -183 295 -206T330 -248T393 -276T489 -287Q645 -287 724 -243T803 -125Q803 -62 754 -41T602 -20H461Q434 -20 403 -26T346 -49T303
+-91T285 -158ZM395 752Q395 661 429 611T532 561Q604 561 636 611T668 752Q668 842 637 895T532 948Q395 948 395 752Z" />
+<glyph unicode="h" glyph-name="h" horiz-adv-x="1284" d="M1130 0H825V653Q825 774 788 834T672 895Q613 895 573 871T509 800T475 684T465 526V0H160V1556H465V1239Q465 1197 463 1151T458 1065Q454 1019 451 975H467Q516 1062 592 1100T764 1139Q847 1139 914
+1116T1030 1042T1104 915T1130 729V0Z" />
+<glyph unicode="i" glyph-name="i" horiz-adv-x="625" d="M147 1407Q147 1450 160 1478T195 1524T248 1549T313 1556Q347 1556 377 1549T429 1525T465 1479T479 1407Q479 1365 466 1336T430 1290T377 1265T313 1257Q279 1257 249 1264T196 1289T160 1336T147 1407ZM465
+0H160V1118H465V0Z" />
+<glyph unicode="j" glyph-name="j" horiz-adv-x="625" d="M102 -492Q54 -492 3 -485T-82 -467V-227Q-51 -237 -24 -241T37 -246Q62 -246 84 -239T123 -212T150 -160T160 -76V1118H465V-121Q465 -198 446 -265T383 -383T270 -463T102 -492ZM147 1407Q147 1450 160
+1478T195 1524T248 1549T313 1556Q347 1556 377 1549T429 1525T465 1479T479 1407Q479 1365 466 1336T430 1290T377 1265T313 1257Q279 1257 249 1264T196 1289T160 1336T147 1407Z" />
+<glyph unicode="k" glyph-name="k" horiz-adv-x="1208" d="M453 608L565 778L838 1118H1182L778 633L1208 0H856L584 430L465 348V0H160V1556H465V862L449 608H453Z" />
+<glyph unicode="l" glyph-name="l" horiz-adv-x="625" d="M465 0H160V1556H465V0Z" />
+<glyph unicode="m" glyph-name="m" horiz-adv-x="1929" d="M1120 0H815V653Q815 774 779 834T666 895Q608 895 570 871T508 800T475 684T465 526V0H160V1118H393L434 975H451Q475 1018 508 1049T582 1100T667 1129T758 1139Q873 1139 953 1100T1077 975H1102Q1126
+1018 1160 1049T1235 1100T1321 1129T1413 1139Q1593 1139 1684 1042T1776 729V0H1470V653Q1470 774 1434 834T1321 895Q1212 895 1166 809T1120 561V0Z" />
+<glyph unicode="n" glyph-name="n" horiz-adv-x="1284" d="M1130 0H825V653Q825 774 789 834T672 895Q612 895 572 871T509 800T475 684T465 526V0H160V1118H393L434 975H451Q475 1018 509 1049T585 1100T672 1129T766 1139Q848 1139 915 1116T1030 1042T1104
+915T1130 729V0Z" />
+<glyph unicode="o" glyph-name="o" horiz-adv-x="1227" d="M414 561Q414 394 461 310T614 225Q719 225 766 310T813 561Q813 728 766 810T612 893Q507 893 461 811T414 561ZM1124 561Q1124 421 1089 313T987 131T825 19T610 -20Q499 -20 406 18T246 131T140 313T102
+561Q102 700 137 808T239 989T401 1101T616 1139Q727 1139 820 1101T980 990T1086 808T1124 561Z" />
+<glyph unicode="p" glyph-name="p" horiz-adv-x="1245" d="M748 -20Q693 -20 650 -8T572 24T512 69T465 123H449Q453 88 457 57Q460 31 462 4T465 -39V-492H160V1118H408L451 973H465Q486 1007 513 1037T575 1089T656 1125T756 1139Q843 1139 914 1102T1036 992T1115
+811T1143 561Q1143 418 1114 310T1033 128T908 17T748 -20ZM653 895Q602 895 567 877T509 821T477 728T465 596V563Q465 482 474 419T506 314T564 249T655 227Q746 227 788 313T831 565Q831 730 789 812T653 895Z" />
+<glyph unicode="q" glyph-name="q" horiz-adv-x="1245" d="M602 219Q657 219 694 237T755 293T789 386T801 518V555Q801 636 792 699T759 804T697 869T600 891Q504 891 459 805T414 553Q414 385 459 302T602 219ZM489 -20Q402 -20 331 17T209 126T130 307T102
+557Q102 700 130 808T211 990T337 1101T498 1139Q554 1139 599 1127T680 1092T745 1040T795 975H803L827 1118H1085V-492H780V-23Q780 -4 782 24T787 80Q790 112 793 145H780Q760 111 733 81T671 28T590 -7T489 -20Z" />
+<glyph unicode="r" glyph-name="r" horiz-adv-x="889" d="M743 1139Q755 1139 769 1139T797 1137T822 1134T840 1130V844Q832 846 818 848T789 851T758 853T733 854Q674 854 625 839T540 791T485 703T465 569V0H160V1118H391L436 950H451Q475 993 503 1028T565
+1087T643 1125T743 1139Z" />
+<glyph unicode="s" glyph-name="s" horiz-adv-x="985" d="M905 332Q905 244 873 178T782 68T639 2T451 -20Q396 -20 349 -17T260 -5T179 15T100 45V297Q142 276 188 259T281 230T370 210T451 203Q492 203 521 210T568 231T595 263T604 303Q604 324 598 340T568
+375T501 417T381 475Q308 508 255 540T167 613T115 704T98 827Q98 905 128 963T213 1061T345 1119T518 1139Q618 1139 708 1116T893 1047L801 831Q725 867 656 890T518 913Q456 913 429 891T401 831Q401 811 408 796T436 764T495 728T594 680Q665 649 722 619T820
+549T883 458T905 332Z" />
+<glyph unicode="t" glyph-name="t" horiz-adv-x="848" d="M614 223Q659 223 699 233T782 258V31Q739 9 676 -5T537 -20Q464 -20 401 -3T292 56T220 170T193 350V889H47V1018L215 1120L303 1356H498V1118H770V889H498V350Q498 285 530 254T614 223Z" />
+<glyph unicode="u" glyph-name="u" horiz-adv-x="1284" d="M891 0L850 143H834Q809 100 775 70T699 19T612 -10T518 -20Q436 -20 369 3T254 77T180 204T154 389V1118H459V465Q459 344 495 284T612 223Q672 223 712 247T775 318T809 434T819 592V1118H1124V0H891Z" />
+<glyph unicode="v" glyph-name="v" horiz-adv-x="1104" d="M395 0L0 1118H319L504 481Q521 424 533 363T549 252H555Q558 305 570 364T600 481L784 1118H1104L709 0H395Z" />
+<glyph unicode="w" glyph-name="w" horiz-adv-x="1651" d="M1014 0L928 391Q924 408 918 439T903 510T887 594T869 683Q849 786 825 905H819Q796 786 777 682Q769 638 761 593T744 509T730 437T719 387L629 0H301L0 1118H303L416 623Q425 584 434 530T452 420T468
+315T479 236H485Q486 255 489 285T498 351T508 422T519 491T529 547T537 582L659 1118H995L1112 582Q1117 560 1125 514T1141 416T1156 314T1163 236H1169Q1172 261 1179 310T1196 415T1215 528T1235 623L1352 1118H1651L1346 0H1014Z" />
+<glyph unicode="x" glyph-name="x" horiz-adv-x="1122" d="M389 571L29 1118H375L561 782L750 1118H1096L731 571L1112 0H766L561 362L356 0H10L389 571Z" />
+<glyph unicode="y" glyph-name="y" horiz-adv-x="1104" d="M0 1118H334L514 489Q530 437 537 378T547 272H553Q555 295 558 323T567 380T578 437T592 489L768 1118H1104L662 -143Q600 -320 493 -406T225 -492Q173 -492 135 -487T70 -475V-233Q91 -238 123 -242T190
+-246Q238 -246 272 -233T330 -197T372 -140T403 -66L422 -10L0 1118Z" />
+<glyph unicode="z" glyph-name="z" horiz-adv-x="936" d="M877 0H55V180L512 885H86V1118H858V920L416 233H877V0Z" />
+<glyph unicode="{" glyph-name="braceleft" horiz-adv-x="745" d="M287 367T222 408T31 449V688Q93 688 141 697T223 728T272 784T287 866V1184Q287 1258 306 1310T374 1396T509 1446T725 1462V1237Q685 1236 653 1230T598 1209T563 1166T551 1096V797Q545 610
+317 575V563Q432 546 493 491T551 342V43Q551 0 563 -27T597 -69T652 -91T725 -98V-324Q594 -324 509 -308T375 -259T306 -172T287 -45V270Q287 367 222 408Z" />
+<glyph unicode="|" glyph-name="bar" horiz-adv-x="1128" d="M455 1550H674V-465H455V1550Z" />
+<glyph unicode="}" glyph-name="braceright" horiz-adv-x="745" d="M469 -45Q469 -119 450 -172T382 -258T247 -308T31 -324V-98Q71 -97 103 -91T157 -70T192 -27T205 43V342Q202 436 263 491T438 563V575Q211 610 205 797V1096Q205 1139 193 1166T158 1208T103
+1230T31 1237V1462Q162 1462 247 1446T381 1397T450 1311T469 1184V866Q468 818 484 784T533 729T614 698T725 688V449Q600 449 535 408T469 270V-45Z" />
+<glyph unicode="~" glyph-name="asciitilde" horiz-adv-x="1128" d="M528 616Q491 632 463 643T411 660T366 669T322 672Q293 672 262 663T201 637T143 598T88 551V782Q139 836 202 863T344 891Q374 891 399 889T453 879T517 860T600 827Q638 811 666 801T719
+784T764 775T807 772Q836 772 867 781T928 807T986 845T1040 893V662Q939 553 784 553Q754 553 729 555T675 564T611 583T528 616Z" />
+<glyph unicode="&#xa0;" glyph-name="nbspace" horiz-adv-x="532" />
+<glyph unicode="&#xa1;" glyph-name="exclamdown" horiz-adv-x="586" d="M168 606H412L463 -369H117L168 606ZM467 948Q467 901 454 869T416 816T360 787T291 778Q256 778 225 787T169 816T131 868T117 948Q117 993 131 1025T169 1078T224 1108T291 1118Q328 1118
+360 1109T416 1079T453 1026T467 948Z" />
+<glyph unicode="&#xa2;" glyph-name="cent" horiz-adv-x="1128" d="M543 -20V186Q451 199 377 236T251 340T171 506T143 743Q143 884 171 985T251 1155T378 1260T543 1311V1483H721V1319Q759 1318 797 1313T870 1299T937 1281T993 1260L907 1034Q886 1044 860
+1053T805 1070T750 1082T698 1087Q632 1087 586 1067T511 1006T468 901T455 750Q455 579 512 500T698 420Q774 420 844 438T965 481V242Q914 213 852 198T721 180V-20H543Z" />
+<glyph unicode="&#xa3;" glyph-name="sterling" horiz-adv-x="1128" d="M680 1483Q790 1483 879 1459T1049 1401L956 1171Q885 1200 827 1217T705 1235Q638 1235 601 1197T563 1063V870H897V651H563V508Q563 453 550 413T514 343T466 294T412 260H1090V0H82V248Q124
+266 157 287T214 337T250 407T262 506V651H84V870H262V1065Q262 1178 293 1257T380 1387T512 1460T680 1483Z" />
+<glyph unicode="&#xa4;" glyph-name="currency" horiz-adv-x="1128" d="M168 723Q168 777 182 826T221 920L92 1047L240 1194L367 1067Q410 1092 461 1106T563 1120Q617 1120 665 1107T760 1065L887 1194L1036 1051L907 922Q932 880 946 829T961 723Q961 667 947
+618T907 524L1032 399L887 254L760 379Q716 356 667 342T563 328Q507 328 458 340T365 379L240 256L94 401L221 526Q168 617 168 723ZM375 723Q375 684 390 650T430 590T490 550T563 535Q603 535 638 549T699 589T741 649T756 723Q756 763 741 797T700 857T638
+898T563 913Q524 913 490 898T431 858T390 798T375 723Z" />
+<glyph unicode="&#xa5;" glyph-name="yen" horiz-adv-x="1128" d="M565 860L809 1462H1122L760 715H954V537H709V399H954V221H709V0H422V221H174V399H422V537H174V715H365L8 1462H324L565 860Z" />
+<glyph unicode="&#xa6;" glyph-name="brokenbar" horiz-adv-x="1128" d="M455 1550H674V735H455V1550ZM455 350H674V-465H455V350Z" />
+<glyph unicode="&#xa7;" glyph-name="section" horiz-adv-x="995" d="M121 805Q121 849 131 886T160 955T203 1012T254 1055Q191 1095 156 1154T121 1288Q121 1353 150 1406T232 1498T360 1556T526 1577Q628 1577 716 1554T889 1493L807 1303Q739 1335 669 1360T520
+1386Q439 1386 402 1363T365 1292Q365 1267 377 1246T415 1206T481 1167T578 1124Q649 1096 707 1062T807 987T872 895T895 782Q895 682 861 621T770 522Q832 482 863 430T895 303Q895 229 864 170T776 68T638 3T455 -20Q345 -20 261 0T106 59V266Q145 246 190
+229T281 198T371 176T455 168Q511 168 548 177T607 202T639 239T649 285Q649 310 642 329T612 368T549 408T442 457Q366 489 306 521T205 593T143 685T121 805ZM344 827Q344 764 400 716T575 616L590 610Q605 621 619 635T644 668T661 708T668 756Q668 788 658
+815T621 867T550 917T434 967Q416 960 400 947T372 915T352 875T344 827Z" />
+<glyph unicode="&#xa8;" glyph-name="dieresis" horiz-adv-x="1182" d="M248 1405Q248 1440 259 1465T288 1507T332 1532T387 1540Q416 1540 441 1532T486 1508T516 1466T528 1405Q528 1371 517 1346T486 1305T442 1280T387 1272Q358 1272 333 1280T289 1304T259
+1346T248 1405ZM651 1405Q651 1440 662 1465T692 1507T737 1532T793 1540Q821 1540 846 1532T891 1508T922 1466T934 1405Q934 1371 923 1346T892 1305T847 1280T793 1272Q733 1272 692 1305T651 1405Z" />
+<glyph unicode="&#xa9;" glyph-name="copyright" horiz-adv-x="1704" d="M895 1010Q798 1010 745 936T692 731Q692 596 740 524T895 451Q952 451 1018 466T1141 510V319Q1084 292 1025 277T889 262Q782 262 702 296T569 392T488 540T461 733Q461 836 487 921T565
+1068T697 1164T881 1198Q964 1198 1041 1176T1186 1120L1112 952Q999 1010 895 1010ZM100 731Q100 835 127 931T202 1110T320 1263T472 1380T652 1456T852 1483Q956 1483 1052 1456T1231 1381T1384 1263T1501 1111T1577 931T1604 731Q1604 627 1577 531T1502 352T1384
+200T1232 82T1052 7T852 -20Q748 -20 652 6T473 82T320 199T203 351T127 531T100 731ZM242 731Q242 604 290 493T420 300T614 169T852 121Q979 121 1090 169T1283 299T1414 493T1462 731Q1462 858 1414 969T1284 1162T1090 1293T852 1341Q725 1341 614 1293T421
+1163T290 969T242 731Z" />
+<glyph unicode="&#xaa;" glyph-name="ordfeminine" horiz-adv-x="743" d="M520 764L489 874Q449 816 393 784T268 752Q218 752 178 765T108 806T63 876T47 975Q47 1035 68 1076T130 1144T230 1184T365 1202L455 1206Q455 1269 426 1296T342 1323Q302 1323 253
+1306T152 1262L86 1397Q148 1429 222 1454T387 1479Q455 1479 505 1460T589 1405T638 1319T655 1206V764H520ZM373 1081Q335 1078 312 1068T275 1044T257 1012T252 977Q252 939 271 921T317 903Q349 903 374 914T418 944T445 991T455 1051V1087L373 1081Z" />
+<glyph unicode="&#xab;" glyph-name="guillemotleft" horiz-adv-x="1198" d="M82 573L391 1028L610 909L393 561L610 213L391 94L82 547V573ZM588 573L897 1028L1116 909L899 561L1116 213L897 94L588 547V573Z" />
+<glyph unicode="&#xac;" glyph-name="logicalnot" horiz-adv-x="1128" d="M1040 248H821V612H88V831H1040V248Z" />
+<glyph unicode="&#xad;" glyph-name="uni00AD" horiz-adv-x="659" d="M61 424V674H598V424H61Z" />
+<glyph unicode="&#xae;" glyph-name="registered" horiz-adv-x="1704" d="M1157 905Q1157 811 1119 756T1014 672L1251 272H997L819 610H772V272H543V1188H807Q989 1188 1073 1118T1157 905ZM772 778H803Q869 778 897 806T926 901Q926 936 919 959T896 995T857
+1014T801 1020H772V778ZM100 731Q100 835 127 931T202 1110T320 1263T472 1380T652 1456T852 1483Q956 1483 1052 1456T1231 1381T1384 1263T1501 1111T1577 931T1604 731Q1604 627 1577 531T1502 352T1384 200T1232 82T1052 7T852 -20Q748 -20 652 6T473 82T320
+199T203 351T127 531T100 731ZM242 731Q242 604 290 493T420 300T614 169T852 121Q979 121 1090 169T1283 299T1414 493T1462 731Q1462 858 1414 969T1284 1162T1090 1293T852 1341Q725 1341 614 1293T421 1163T290 969T242 731Z" />
+<glyph unicode="&#xaf;" glyph-name="overscore" horiz-adv-x="1024" d="M1030 1556H-6V1757H1030V1556Z" />
+<glyph unicode="&#xb0;" glyph-name="degree" horiz-adv-x="877" d="M92 1137Q92 1208 119 1271T193 1381T303 1455T438 1483Q510 1483 573 1456T683 1381T757 1271T784 1137Q784 1065 757 1002T684 893T574 820T438 793Q366 793 303 819T193 892T119 1002T92
+1137ZM283 1137Q283 1106 295 1078T328 1029T377 996T438 983Q470 983 498 995T548 1029T581 1078T594 1137Q594 1169 582 1197T548 1247T499 1281T438 1294Q406 1294 378 1282T328 1248T295 1198T283 1137Z" />
+<glyph unicode="&#xb1;" glyph-name="plusminus" horiz-adv-x="1128" d="M455 674H88V893H455V1262H674V893H1040V674H674V309H455V674ZM88 0V219H1040V0H88Z" />
+<glyph unicode="&#xb2;" glyph-name="twosuperior" horiz-adv-x="776" d="M702 586H55V754L279 973Q325 1018 355 1051T404 1111T430 1161T438 1212Q438 1250 414 1270T350 1290Q310 1290 267 1270T170 1202L47 1354Q112 1411 193 1447T383 1483Q449 1483 503
+1467T596 1419T656 1341T678 1233Q678 1187 666 1147T626 1065T557 980T455 881L350 786H702V586Z" />
+<glyph unicode="&#xb3;" glyph-name="threesuperior" horiz-adv-x="776" d="M666 1249Q666 1180 626 1130T496 1051V1038Q547 1028 584 1007T645 959T682 898T694 829Q694 708 606 639T332 569Q256 569 190 586T59 639V829Q125 789 191 764T330 739Q404 739 438
+766T473 846Q473 867 465 886T438 919T387 943T307 952H195V1112H287Q339 1112 371 1121T421 1145T445 1180T451 1221Q451 1259 426 1284T350 1309Q303 1309 261 1290T162 1231L61 1372Q123 1419 198 1450T377 1481Q439 1481 492 1465T583 1418T644 1345T666 1249Z"
+/>
+<glyph unicode="&#xb4;" glyph-name="acute" horiz-adv-x="1182" d="M332 1241V1268Q353 1297 377 1335T424 1413T469 1494T506 1569H848V1548Q837 1530 816 1506T768 1453T710 1396T648 1338T587 1285T535 1241H332Z" />
+<glyph unicode="&#xb5;" glyph-name="mu" horiz-adv-x="1290" d="M465 465Q465 344 502 284T621 223Q679 223 718 247T781 318T815 434T825 592V1118H1130V0H897L854 150H842Q807 65 755 23T627 -20Q573 -20 528 3T455 70Q457 28 460 -15Q462 -52 463 -94T465
+-172V-492H160V1118H465V465Z" />
+<glyph unicode="&#xb6;" glyph-name="paragraph" horiz-adv-x="1341" d="M1167 -260H1006V1356H840V-260H678V559Q617 541 532 541Q437 541 360 566T228 651T143 806T113 1042Q113 1189 145 1287T237 1446T380 1531T563 1556H1167V-260Z" />
+<glyph unicode="&#xb7;" glyph-name="middot" horiz-adv-x="584" d="M117 723Q117 770 130 802T168 855T224 884T293 893Q328 893 359 884T415 855T453 803T467 723Q467 678 453 646T415 593T360 563T293 553Q256 553 224 562T168 592T131 645T117 723Z" />
+<glyph unicode="&#xb8;" glyph-name="cedilla" horiz-adv-x="420" d="M418 -250Q418 -307 403 -352T351 -428T256 -475T109 -492Q64 -492 28 -486T-37 -471V-303Q-22 -307 -4 -310T34 -317T72 -322T106 -324Q135 -324 156 -311T178 -262Q178 -225 141 -197T12
+-154L90 0H283L256 -61Q287 -71 316 -88T367 -128T404 -182T418 -250Z" />
+<glyph unicode="&#xb9;" glyph-name="onesuperior" horiz-adv-x="776" d="M584 586H346V1032Q346 1052 346 1082T348 1144T351 1201T354 1239Q348 1231 339 1221T319 1199T298 1178T279 1161L201 1100L92 1227L393 1462H584V586Z" />
+<glyph unicode="&#xba;" glyph-name="ordmasculine" horiz-adv-x="754" d="M696 1116Q696 1029 674 962T609 848T508 777T375 752Q306 752 248 776T147 847T81 961T57 1116Q57 1203 79 1270T143 1384T244 1455T379 1479Q447 1479 504 1455T605 1385T672 1271T696
+1116ZM260 1116Q260 1016 287 966T377 915Q437 915 464 965T492 1116Q492 1216 465 1265T377 1315Q315 1315 288 1266T260 1116Z" />
+<glyph unicode="&#xbb;" glyph-name="guillemotright" horiz-adv-x="1198" d="M1118 547L809 94L590 213L807 561L590 909L809 1028L1118 573V547ZM612 547L303 94L84 213L301 561L84 909L303 1028L612 573V547Z" />
+<glyph unicode="&#xbc;" glyph-name="onequarter" horiz-adv-x="1804" d="M1370 1462L559 0H320L1131 1462H1370ZM794 586H556V1032Q556 1052 556 1082T558 1144T561 1201T564 1239Q558 1231 549 1221T529 1199T508 1178T489 1161L411 1100L302 1227L603 1462H794V586ZM1682
+152H1557V1H1319V152H936V306L1321 883H1557V320H1682V152ZM1319 320V484Q1319 526 1320 572T1325 668Q1320 655 1311 634T1290 590T1268 546T1248 511L1121 320H1319Z" />
+<glyph unicode="&#xbd;" glyph-name="onehalf" horiz-adv-x="1804" d="M1370 1462L559 0H320L1131 1462H1370ZM794 586H556V1032Q556 1052 556 1082T558 1144T561 1201T564 1239Q558 1231 549 1221T529 1199T508 1178T489 1161L411 1100L302 1227L603 1462H794V586ZM1716
+1H1069V169L1293 388Q1339 433 1369 466T1418 526T1444 576T1452 627Q1452 665 1428 685T1364 705Q1324 705 1281 685T1184 617L1061 769Q1126 826 1207 862T1397 898Q1463 898 1517 882T1610 834T1670 756T1692 648Q1692 602 1680 562T1640 480T1571 395T1469
+296L1364 201H1716V1Z" />
+<glyph unicode="&#xbe;" glyph-name="threequarters" horiz-adv-x="1804" d="M1441 1462L630 0H391L1202 1462H1441ZM1712 152H1587V1H1349V152H966V306L1351 883H1587V320H1712V152ZM1349 320V484Q1349 526 1350 572T1355 668Q1350 655 1341 634T1320 590T1298
+546T1278 511L1151 320H1349ZM697 1249Q697 1180 657 1130T527 1051V1038Q578 1028 615 1007T676 959T713 898T725 829Q725 708 637 639T363 569Q287 569 221 586T90 639V829Q156 789 222 764T361 739Q435 739 469 766T504 846Q504 867 496 886T469 919T418 943T338
+952H226V1112H318Q370 1112 402 1121T452 1145T476 1180T482 1221Q482 1259 457 1284T381 1309Q334 1309 292 1290T193 1231L92 1372Q154 1419 229 1450T408 1481Q470 1481 523 1465T614 1418T675 1345T697 1249Z" />
+<glyph unicode="&#xbf;" glyph-name="questiondown" horiz-adv-x="940" d="M686 606V532Q686 481 676 440T644 361T588 288T506 215Q464 182 435 156T388 105T362 51T354 -14Q354 -71 393 -108T510 -145Q579 -145 659 -116T823 -45L926 -266Q883 -292 832 -314T727
+-354T616 -381T506 -391Q404 -391 323 -367T184 -296T97 -182T66 -29Q66 34 79 83T121 175T190 258T287 342Q328 375 354 399T396 446T416 492T422 547V606H686ZM719 948Q719 901 706 869T668 816T612 787T543 778Q508 778 477 787T421 816T383 868T369 948Q369
+993 383 1025T421 1078T476 1108T543 1118Q580 1118 612 1109T668 1079T705 1026T719 948Z" />
+<glyph unicode="&#xc0;" glyph-name="Agrave" horiz-adv-x="1331" d="M1018 0L918 348H414L313 0H0L475 1468H854L1331 0H1018ZM846 608L752 928Q746 946 734 987T709 1077T683 1177T666 1262Q662 1240 656 1210T641 1147T623 1079T606 1015T592 962T582 928L489
+608H846ZM632 1579Q598 1607 551 1648T457 1734T373 1818T319 1886V1907H661Q677 1873 698 1833T743 1752T790 1673T835 1606V1579H632Z" />
+<glyph unicode="&#xc1;" glyph-name="Aacute" horiz-adv-x="1331" d="M1018 0L918 348H414L313 0H0L475 1468H854L1331 0H1018ZM846 608L752 928Q746 946 734 987T709 1077T683 1177T666 1262Q662 1240 656 1210T641 1147T623 1079T606 1015T592 962T582 928L489
+608H846ZM494 1579V1606Q515 1635 539 1673T586 1751T631 1832T668 1907H1010V1886Q999 1868 978 1844T930 1791T872 1734T810 1676T749 1623T697 1579H494Z" />
+<glyph unicode="&#xc2;" glyph-name="Acircumflex" horiz-adv-x="1331" d="M1018 0L918 348H414L313 0H0L475 1468H854L1331 0H1018ZM846 608L752 928Q746 946 734 987T709 1077T683 1177T666 1262Q662 1240 656 1210T641 1147T623 1079T606 1015T592 962T582
+928L489 608H846ZM879 1579Q828 1613 773 1656T666 1755Q612 1699 560 1656T457 1579H254V1606Q280 1635 311 1673T375 1751T438 1832T490 1907H846Q867 1873 897 1833T959 1752T1024 1673T1082 1606V1579H879Z" />
+<glyph unicode="&#xc3;" glyph-name="Atilde" horiz-adv-x="1331" d="M1018 0L918 348H414L313 0H0L475 1468H854L1331 0H1018ZM846 608L752 928Q746 946 734 987T709 1077T683 1177T666 1262Q662 1240 656 1210T641 1147T623 1079T606 1015T592 962T582 928L489
+608H846ZM504 1684Q473 1684 455 1658T424 1577H275Q281 1657 301 1715T353 1811T430 1867T527 1886Q568 1886 607 1870T684 1835T760 1799T834 1782Q865 1782 883 1808T914 1888H1063Q1057 1809 1037 1751T983 1655T907 1598T811 1579Q771 1579 731 1595T653 1631T578
+1667T504 1684Z" />
+<glyph unicode="&#xc4;" glyph-name="Adieresis" horiz-adv-x="1331" d="M1018 0L918 348H414L313 0H0L475 1468H854L1331 0H1018ZM846 608L752 928Q746 946 734 987T709 1077T683 1177T666 1262Q662 1240 656 1210T641 1147T623 1079T606 1015T592 962T582 928L489
+608H846ZM324 1743Q324 1778 335 1803T364 1845T408 1870T463 1878Q492 1878 517 1870T562 1846T592 1804T604 1743Q604 1709 593 1684T562 1643T518 1618T463 1610Q434 1610 409 1618T365 1642T335 1684T324 1743ZM727 1743Q727 1778 738 1803T768 1845T813 1870T869
+1878Q897 1878 922 1870T967 1846T998 1804T1010 1743Q1010 1709 999 1684T968 1643T923 1618T869 1610Q809 1610 768 1643T727 1743Z" />
+<glyph unicode="&#xc5;" glyph-name="Aring" horiz-adv-x="1331" d="M1018 0L918 348H414L313 0H0L475 1468H854L1331 0H1018ZM846 608L752 928Q746 946 734 987T709 1077T683 1177T666 1262Q662 1240 656 1210T641 1147T623 1079T606 1015T592 962T582 928L489
+608H846ZM918 1567Q918 1511 899 1467T845 1391T764 1344T664 1327Q609 1327 563 1343T485 1390T434 1465T416 1565Q416 1620 434 1664T484 1738T563 1785T664 1802Q717 1802 763 1786T843 1739T898 1665T918 1567ZM760 1565Q760 1610 733 1635T664 1661Q622 1661
+595 1636T568 1565Q568 1520 592 1494T664 1468Q706 1468 733 1494T760 1565Z" />
+<glyph unicode="&#xc6;" glyph-name="AE" horiz-adv-x="1888" d="M1767 0H926V348H465L315 0H0L655 1462H1767V1208H1235V887H1731V633H1235V256H1767V0ZM578 608H926V1198H829L578 608Z" />
+<glyph unicode="&#xc7;" glyph-name="Ccedilla" horiz-adv-x="1305" d="M805 1225Q716 1225 648 1191T533 1092T462 935T438 727Q438 610 459 519T525 366T639 271T805 238Q894 238 983 258T1178 315V55Q1130 35 1083 21T987 -2T887 -15T776 -20Q607 -20 483 34T278
+186T158 422T119 729Q119 895 164 1033T296 1272T511 1427T805 1483Q914 1483 1023 1456T1233 1380L1133 1128Q1051 1167 968 1196T805 1225ZM926 -250Q926 -307 911 -352T859 -428T764 -475T617 -492Q572 -492 536 -486T471 -471V-303Q486 -307 504 -310T542 -317T580
+-322T614 -324Q643 -324 664 -311T686 -262Q686 -225 649 -197T520 -154L598 0H791L764 -61Q795 -71 824 -88T875 -128T912 -182T926 -250Z" />
+<glyph unicode="&#xc8;" glyph-name="Egrave" horiz-adv-x="1147" d="M1026 0H184V1462H1026V1208H494V887H989V633H494V256H1026V0ZM572 1579Q538 1607 491 1648T397 1734T313 1818T259 1886V1907H601Q617 1873 638 1833T683 1752T730 1673T775 1606V1579H572Z" />
+<glyph unicode="&#xc9;" glyph-name="Eacute" horiz-adv-x="1147" d="M1026 0H184V1462H1026V1208H494V887H989V633H494V256H1026V0ZM424 1579V1606Q445 1635 469 1673T516 1751T561 1832T598 1907H940V1886Q929 1868 908 1844T860 1791T802 1734T740 1676T679
+1623T627 1579H424Z" />
+<glyph unicode="&#xca;" glyph-name="Ecircumflex" horiz-adv-x="1147" d="M1026 0H184V1462H1026V1208H494V887H989V633H494V256H1026V0ZM832 1579Q781 1613 726 1656T619 1755Q565 1699 513 1656T410 1579H207V1606Q233 1635 264 1673T328 1751T391 1832T443
+1907H799Q820 1873 850 1833T912 1752T977 1673T1035 1606V1579H832Z" />
+<glyph unicode="&#xcb;" glyph-name="Edieresis" horiz-adv-x="1147" d="M1026 0H184V1462H1026V1208H494V887H989V633H494V256H1026V0ZM273 1743Q273 1778 284 1803T313 1845T357 1870T412 1878Q441 1878 466 1870T511 1846T541 1804T553 1743Q553 1709 542 1684T511
+1643T467 1618T412 1610Q383 1610 358 1618T314 1642T284 1684T273 1743ZM676 1743Q676 1778 687 1803T717 1845T762 1870T818 1878Q846 1878 871 1870T916 1846T947 1804T959 1743Q959 1709 948 1684T917 1643T872 1618T818 1610Q758 1610 717 1643T676 1743Z"
+/>
+<glyph unicode="&#xcc;" glyph-name="Igrave" horiz-adv-x="797" d="M731 0H66V176L244 258V1204L66 1286V1462H731V1286L553 1204V258L731 176V0ZM355 1579Q321 1607 274 1648T180 1734T96 1818T42 1886V1907H384Q400 1873 421 1833T466 1752T513 1673T558 1606V1579H355Z"
+/>
+<glyph unicode="&#xcd;" glyph-name="Iacute" horiz-adv-x="797" d="M731 0H66V176L244 258V1204L66 1286V1462H731V1286L553 1204V258L731 176V0ZM237 1579V1606Q258 1635 282 1673T329 1751T374 1832T411 1907H753V1886Q742 1868 721 1844T673 1791T615 1734T553
+1676T492 1623T440 1579H237Z" />
+<glyph unicode="&#xce;" glyph-name="Icircumflex" horiz-adv-x="797" d="M731 0H66V176L244 258V1204L66 1286V1462H731V1286L553 1204V258L731 176V0ZM609 1579Q558 1613 503 1656T396 1755Q342 1699 290 1656T187 1579H-16V1606Q10 1635 41 1673T105 1751T168
+1832T220 1907H576Q597 1873 627 1833T689 1752T754 1673T812 1606V1579H609Z" />
+<glyph unicode="&#xcf;" glyph-name="Idieresis" horiz-adv-x="797" d="M731 0H66V176L244 258V1204L66 1286V1462H731V1286L553 1204V258L731 176V0ZM54 1743Q54 1778 65 1803T94 1845T138 1870T193 1878Q222 1878 247 1870T292 1846T322 1804T334 1743Q334 1709
+323 1684T292 1643T248 1618T193 1610Q164 1610 139 1618T95 1642T65 1684T54 1743ZM457 1743Q457 1778 468 1803T498 1845T543 1870T599 1878Q627 1878 652 1870T697 1846T728 1804T740 1743Q740 1709 729 1684T698 1643T653 1618T599 1610Q539 1610 498 1643T457
+1743Z" />
+<glyph unicode="&#xd0;" glyph-name="Eth" horiz-adv-x="1434" d="M47 850H184V1462H612Q773 1462 902 1416T1124 1280T1265 1055T1315 745Q1315 560 1265 421T1119 188T885 47T569 0H184V596H47V850ZM1001 737Q1001 859 977 947T906 1094T792 1180T637 1208H494V850H731V596H494V256H608Q804
+256 902 376T1001 737Z" />
+<glyph unicode="&#xd1;" glyph-name="Ntilde" horiz-adv-x="1604" d="M1419 0H1026L451 1106H442Q448 1029 452 953Q456 888 458 817T461 688V0H184V1462H575L1149 367H1155Q1152 443 1148 517Q1147 549 1146 582T1143 649T1142 714T1141 770V1462H1419V0ZM623
+1684Q592 1684 574 1658T543 1577H394Q400 1657 420 1715T472 1811T549 1867T646 1886Q687 1886 726 1870T803 1835T879 1799T953 1782Q984 1782 1002 1808T1033 1888H1182Q1176 1809 1156 1751T1102 1655T1026 1598T930 1579Q890 1579 850 1595T772 1631T697 1667T623
+1684Z" />
+<glyph unicode="&#xd2;" glyph-name="Ograve" horiz-adv-x="1548" d="M1430 733Q1430 564 1391 425T1270 187T1066 34T774 -20Q606 -20 483 34T279 187T159 425T119 735Q119 905 158 1043T279 1280T483 1431T776 1485Q944 1485 1067 1432T1270 1280T1390 1043T1430
+733ZM438 733Q438 618 458 527T519 372T624 274T774 240Q863 240 926 274T1030 371T1090 526T1110 733Q1110 848 1091 939T1031 1095T927 1193T776 1227Q689 1227 625 1193T520 1095T458 940T438 733ZM729 1579Q695 1607 648 1648T554 1734T470 1818T416 1886V1907H758Q774
+1873 795 1833T840 1752T887 1673T932 1606V1579H729Z" />
+<glyph unicode="&#xd3;" glyph-name="Oacute" horiz-adv-x="1548" d="M1430 733Q1430 564 1391 425T1270 187T1066 34T774 -20Q606 -20 483 34T279 187T159 425T119 735Q119 905 158 1043T279 1280T483 1431T776 1485Q944 1485 1067 1432T1270 1280T1390 1043T1430
+733ZM438 733Q438 618 458 527T519 372T624 274T774 240Q863 240 926 274T1030 371T1090 526T1110 733Q1110 848 1091 939T1031 1095T927 1193T776 1227Q689 1227 625 1193T520 1095T458 940T438 733ZM590 1579V1606Q611 1635 635 1673T682 1751T727 1832T764 1907H1106V1886Q1095
+1868 1074 1844T1026 1791T968 1734T906 1676T845 1623T793 1579H590Z" />
+<glyph unicode="&#xd4;" glyph-name="Ocircumflex" horiz-adv-x="1548" d="M1430 733Q1430 564 1391 425T1270 187T1066 34T774 -20Q606 -20 483 34T279 187T159 425T119 735Q119 905 158 1043T279 1280T483 1431T776 1485Q944 1485 1067 1432T1270 1280T1390
+1043T1430 733ZM438 733Q438 618 458 527T519 372T624 274T774 240Q863 240 926 274T1030 371T1090 526T1110 733Q1110 848 1091 939T1031 1095T927 1193T776 1227Q689 1227 625 1193T520 1095T458 940T438 733ZM975 1579Q924 1613 869 1656T762 1755Q708 1699
+656 1656T553 1579H350V1606Q376 1635 407 1673T471 1751T534 1832T586 1907H942Q963 1873 993 1833T1055 1752T1120 1673T1178 1606V1579H975Z" />
+<glyph unicode="&#xd5;" glyph-name="Otilde" horiz-adv-x="1548" d="M1430 733Q1430 564 1391 425T1270 187T1066 34T774 -20Q606 -20 483 34T279 187T159 425T119 735Q119 905 158 1043T279 1280T483 1431T776 1485Q944 1485 1067 1432T1270 1280T1390 1043T1430
+733ZM438 733Q438 618 458 527T519 372T624 274T774 240Q863 240 926 274T1030 371T1090 526T1110 733Q1110 848 1091 939T1031 1095T927 1193T776 1227Q689 1227 625 1193T520 1095T458 940T438 733ZM612 1684Q581 1684 563 1658T532 1577H383Q389 1657 409 1715T461
+1811T538 1867T635 1886Q676 1886 715 1870T792 1835T868 1799T942 1782Q973 1782 991 1808T1022 1888H1171Q1165 1809 1145 1751T1091 1655T1015 1598T919 1579Q879 1579 839 1595T761 1631T686 1667T612 1684Z" />
+<glyph unicode="&#xd6;" glyph-name="Odieresis" horiz-adv-x="1548" d="M1430 733Q1430 564 1391 425T1270 187T1066 34T774 -20Q606 -20 483 34T279 187T159 425T119 735Q119 905 158 1043T279 1280T483 1431T776 1485Q944 1485 1067 1432T1270 1280T1390 1043T1430
+733ZM438 733Q438 618 458 527T519 372T624 274T774 240Q863 240 926 274T1030 371T1090 526T1110 733Q1110 848 1091 939T1031 1095T927 1193T776 1227Q689 1227 625 1193T520 1095T458 940T438 733ZM428 1743Q428 1778 439 1803T468 1845T512 1870T567 1878Q596
+1878 621 1870T666 1846T696 1804T708 1743Q708 1709 697 1684T666 1643T622 1618T567 1610Q538 1610 513 1618T469 1642T439 1684T428 1743ZM831 1743Q831 1778 842 1803T872 1845T917 1870T973 1878Q1001 1878 1026 1870T1071 1846T1102 1804T1114 1743Q1114
+1709 1103 1684T1072 1643T1027 1618T973 1610Q913 1610 872 1643T831 1743Z" />
+<glyph unicode="&#xd7;" glyph-name="multiply" horiz-adv-x="1128" d="M408 723L109 1024L260 1178L561 879L866 1178L1020 1028L715 723L1016 420L866 268L561 569L260 270L111 422L408 723Z" />
+<glyph unicode="&#xd8;" glyph-name="Oslash" horiz-adv-x="1548" d="M1430 733Q1430 564 1391 425T1270 187T1066 34T774 -20Q595 -20 467 41L395 -76L227 18L309 152Q212 252 166 400T119 735Q119 905 158 1043T279 1280T483 1431T776 1485Q867 1485 944 1469T1087
+1421L1157 1532L1323 1436L1243 1307Q1337 1208 1383 1063T1430 733ZM438 733Q438 553 485 438L942 1184Q873 1227 776 1227Q689 1227 625 1193T520 1095T458 940T438 733ZM1110 733Q1110 904 1067 1020L612 279Q646 260 686 250T774 240Q863 240 926 274T1030
+371T1090 526T1110 733Z" />
+<glyph unicode="&#xd9;" glyph-name="Ugrave" horiz-adv-x="1466" d="M1292 1462V516Q1292 402 1258 304T1153 134T976 21T727 -20Q592 -20 489 18T316 128T210 298T174 520V1462H483V543Q483 462 499 405T546 311T625 257T735 240Q866 240 924 316T983 545V1462H1292ZM706
+1579Q672 1607 625 1648T531 1734T447 1818T393 1886V1907H735Q751 1873 772 1833T817 1752T864 1673T909 1606V1579H706Z" />
+<glyph unicode="&#xda;" glyph-name="Uacute" horiz-adv-x="1466" d="M1292 1462V516Q1292 402 1258 304T1153 134T976 21T727 -20Q592 -20 489 18T316 128T210 298T174 520V1462H483V543Q483 462 499 405T546 311T625 257T735 240Q866 240 924 316T983 545V1462H1292ZM570
+1579V1606Q591 1635 615 1673T662 1751T707 1832T744 1907H1086V1886Q1075 1868 1054 1844T1006 1791T948 1734T886 1676T825 1623T773 1579H570Z" />
+<glyph unicode="&#xdb;" glyph-name="Ucircumflex" horiz-adv-x="1466" d="M1292 1462V516Q1292 402 1258 304T1153 134T976 21T727 -20Q592 -20 489 18T316 128T210 298T174 520V1462H483V543Q483 462 499 405T546 311T625 257T735 240Q866 240 924 316T983 545V1462H1292ZM942
+1579Q891 1613 836 1656T729 1755Q675 1699 623 1656T520 1579H317V1606Q343 1635 374 1673T438 1751T501 1832T553 1907H909Q930 1873 960 1833T1022 1752T1087 1673T1145 1606V1579H942Z" />
+<glyph unicode="&#xdc;" glyph-name="Udieresis" horiz-adv-x="1466" d="M1292 1462V516Q1292 402 1258 304T1153 134T976 21T727 -20Q592 -20 489 18T316 128T210 298T174 520V1462H483V543Q483 462 499 405T546 311T625 257T735 240Q866 240 924 316T983 545V1462H1292ZM393
+1743Q393 1778 404 1803T433 1845T477 1870T532 1878Q561 1878 586 1870T631 1846T661 1804T673 1743Q673 1709 662 1684T631 1643T587 1618T532 1610Q503 1610 478 1618T434 1642T404 1684T393 1743ZM796 1743Q796 1778 807 1803T837 1845T882 1870T938 1878Q966
+1878 991 1870T1036 1846T1067 1804T1079 1743Q1079 1709 1068 1684T1037 1643T992 1618T938 1610Q878 1610 837 1643T796 1743Z" />
+<glyph unicode="&#xdd;" glyph-name="Yacute" horiz-adv-x="1196" d="M598 860L862 1462H1196L752 569V0H444V559L0 1462H336L598 860ZM422 1579V1606Q443 1635 467 1673T514 1751T559 1832T596 1907H938V1886Q927 1868 906 1844T858 1791T800 1734T738 1676T677
+1623T625 1579H422Z" />
+<glyph unicode="&#xde;" glyph-name="Thorn" horiz-adv-x="1225" d="M1133 770Q1133 676 1108 590T1024 438T870 333T633 293H494V0H184V1462H494V1233H655Q779 1233 869 1200T1017 1107T1104 961T1133 770ZM494 543H578Q699 543 759 595T819 770Q819 878 766
+929T598 981H494V543Z" />
+<glyph unicode="&#xdf;" glyph-name="germandbls" horiz-adv-x="1395" d="M1188 1241Q1188 1177 1167 1129T1114 1042T1045 975T976 922T923 877T901 834Q901 814 913 797T952 760T1020 715T1118 651Q1167 620 1205 588T1269 517T1309 432T1323 326Q1323 154 1206
+67T862 -20Q764 -20 692 -6T559 43V285Q583 269 617 254T690 226T768 207T842 199Q922 199 966 229T1010 322Q1010 349 1003 370T976 412T918 457T821 516Q758 552 716 584T647 647T609 713T598 788Q598 841 618 880T670 950T737 1007T805 1059T856 1117T877 1188Q877
+1251 827 1290T680 1329Q572 1329 519 1281T465 1128V0H160V1139Q160 1248 197 1328T302 1462T467 1541T680 1567Q795 1567 889 1546T1049 1483T1152 1380T1188 1241Z" />
+<glyph unicode="&#xe0;" glyph-name="agrave" horiz-adv-x="1176" d="M809 0L750 152H741Q708 107 675 75T603 21T516 -10T403 -20Q335 -20 277 1T177 66T110 176T86 334Q86 512 200 596T541 690L719 696V780Q719 849 679 882T567 915Q495 915 427 894T289 838L190
+1040Q274 1087 376 1114T590 1141Q799 1141 910 1043T1022 745V0H809ZM719 518L618 514Q557 512 515 498T448 461T411 405T399 332Q399 262 433 233T522 203Q564 203 600 217T662 260T704 330T719 426V518ZM808 1241Q774 1269 727 1310T633 1396T549 1480T495 1548V1569H837Q853
+1535 874 1495T919 1414T966 1335T1011 1268V1241H808Z" />
+<glyph unicode="&#xe1;" glyph-name="aacute" horiz-adv-x="1176" d="M809 0L750 152H741Q708 107 675 75T603 21T516 -10T403 -20Q335 -20 277 1T177 66T110 176T86 334Q86 512 200 596T541 690L719 696V780Q719 849 679 882T567 915Q495 915 427 894T289 838L190
+1040Q274 1087 376 1114T590 1141Q799 1141 910 1043T1022 745V0H809ZM719 518L618 514Q557 512 515 498T448 461T411 405T399 332Q399 262 433 233T522 203Q564 203 600 217T662 260T704 330T719 426V518ZM441 1241V1268Q462 1297 486 1335T533 1413T578 1494T615
+1569H957V1548Q946 1530 925 1506T877 1453T819 1396T757 1338T696 1285T644 1241H441Z" />
+<glyph unicode="&#xe2;" glyph-name="acircumflex" horiz-adv-x="1176" d="M809 0L750 152H741Q708 107 675 75T603 21T516 -10T403 -20Q335 -20 277 1T177 66T110 176T86 334Q86 512 200 596T541 690L719 696V780Q719 849 679 882T567 915Q495 915 427 894T289
+838L190 1040Q274 1087 376 1114T590 1141Q799 1141 910 1043T1022 745V0H809ZM719 518L618 514Q557 512 515 498T448 461T411 405T399 332Q399 262 433 233T522 203Q564 203 600 217T662 260T704 330T719 426V518ZM801 1496Q750 1530 695 1573T588 1672Q534 1616
+482 1573T379 1496H176V1523Q202 1552 233 1590T297 1668T360 1749T412 1824H768Q789 1790 819 1750T881 1669T946 1590T1004 1523V1496H801Z" />
+<glyph unicode="&#xe3;" glyph-name="atilde" horiz-adv-x="1176" d="M809 0L750 152H741Q708 107 675 75T603 21T516 -10T403 -20Q335 -20 277 1T177 66T110 176T86 334Q86 512 200 596T541 690L719 696V780Q719 849 679 882T567 915Q495 915 427 894T289 838L190
+1040Q274 1087 376 1114T590 1141Q799 1141 910 1043T1022 745V0H809ZM719 518L618 514Q557 512 515 498T448 461T411 405T399 332Q399 262 433 233T522 203Q564 203 600 217T662 260T704 330T719 426V518ZM681 1346Q650 1346 632 1320T601 1239H452Q458 1319 478
+1377T530 1473T607 1529T704 1548Q745 1548 784 1532T861 1497T937 1461T1011 1444Q1042 1444 1060 1470T1091 1550H1240Q1234 1471 1214 1413T1160 1317T1084 1260T988 1241Q948 1241 908 1257T830 1293T755 1329T681 1346Z" />
+<glyph unicode="&#xe4;" glyph-name="adieresis" horiz-adv-x="1176" d="M809 0L750 152H741Q708 107 675 75T603 21T516 -10T403 -20Q335 -20 277 1T177 66T110 176T86 334Q86 512 200 596T541 690L719 696V780Q719 849 679 882T567 915Q495 915 427 894T289
+838L190 1040Q274 1087 376 1114T590 1141Q799 1141 910 1043T1022 745V0H809ZM719 518L618 514Q557 512 515 498T448 461T411 405T399 332Q399 262 433 233T522 203Q564 203 600 217T662 260T704 330T719 426V518ZM254 1405Q254 1440 265 1465T294 1507T338 1532T393
+1540Q422 1540 447 1532T492 1508T522 1466T534 1405Q534 1371 523 1346T492 1305T448 1280T393 1272Q364 1272 339 1280T295 1304T265 1346T254 1405ZM657 1405Q657 1440 668 1465T698 1507T743 1532T799 1540Q827 1540 852 1532T897 1508T928 1466T940 1405Q940
+1371 929 1346T898 1305T853 1280T799 1272Q739 1272 698 1305T657 1405Z" />
+<glyph unicode="&#xe5;" glyph-name="aring" horiz-adv-x="1176" d="M809 0L750 152H741Q708 107 675 75T603 21T516 -10T403 -20Q335 -20 277 1T177 66T110 176T86 334Q86 512 200 596T541 690L719 696V780Q719 849 679 882T567 915Q495 915 427 894T289 838L190
+1040Q274 1087 376 1114T590 1141Q799 1141 910 1043T1022 745V0H809ZM719 518L618 514Q557 512 515 498T448 461T411 405T399 332Q399 262 433 233T522 203Q564 203 600 217T662 260T704 330T719 426V518ZM842 1479Q842 1423 823 1379T769 1303T688 1256T588 1239Q533
+1239 487 1255T409 1302T358 1377T340 1477Q340 1532 358 1576T408 1650T487 1697T588 1714Q641 1714 687 1698T767 1651T822 1577T842 1479ZM684 1477Q684 1522 657 1547T588 1573Q546 1573 519 1548T492 1477Q492 1432 516 1406T588 1380Q630 1380 657 1406T684
+1477Z" />
+<glyph unicode="&#xe6;" glyph-name="ae" horiz-adv-x="1806" d="M1268 -20Q1137 -20 1030 30T854 186Q811 132 769 94T678 30T568 -8T424 -20Q356 -20 295 1T187 66T113 176T86 334Q86 512 200 596T541 690L719 696V780Q719 849 679 882T567 915Q495 915 427
+894T289 838L190 1040Q274 1087 376 1114T590 1141Q804 1141 913 1010Q1039 1139 1227 1139Q1338 1139 1427 1106T1579 1007T1674 848T1708 631V483H1026Q1028 419 1046 368T1098 281T1179 226T1288 207Q1382 207 1469 228T1645 295V59Q1605 38 1565 24T1479 -1T1382
+-15T1268 -20ZM719 518L618 514Q557 512 515 498T448 461T411 405T399 332Q399 262 433 233T522 203Q564 203 600 217T662 260T704 330T719 426V518ZM1229 922Q1147 922 1094 865T1032 686H1421Q1420 737 1408 780T1373 854T1313 904T1229 922Z" />
+<glyph unicode="&#xe7;" glyph-name="ccedilla" horiz-adv-x="1022" d="M625 -20Q505 -20 409 13T244 115T139 293T102 553Q102 720 139 832T245 1013T410 1110T625 1139Q711 1139 796 1118T956 1059L868 827Q802 856 741 874T625 893Q514 893 464 809T414 555Q414
+387 464 307T621 227Q708 227 779 249T924 307V53Q887 35 852 21T782 -2T708 -15T625 -20ZM778 -250Q778 -307 763 -352T711 -428T616 -475T469 -492Q424 -492 388 -486T323 -471V-303Q338 -307 356 -310T394 -317T432 -322T466 -324Q495 -324 516 -311T538 -262Q538
+-225 501 -197T372 -154L450 0H643L616 -61Q647 -71 676 -88T727 -128T764 -182T778 -250Z" />
+<glyph unicode="&#xe8;" glyph-name="egrave" horiz-adv-x="1190" d="M612 922Q531 922 478 865T416 686H805Q804 737 792 780T756 854T696 904T612 922ZM651 -20Q531 -20 430 15T256 120T143 298T102 551Q102 698 139 808T242 991T402 1102T610 1139Q721 1139
+810 1106T962 1007T1058 848T1092 631V483H410Q412 419 430 368T482 281T563 226T672 207Q723 207 768 212T857 229T942 256T1028 295V59Q988 38 948 24T862 -1T765 -15T651 -20ZM834 1241Q800 1269 753 1310T659 1396T575 1480T521 1548V1569H863Q879 1535 900
+1495T945 1414T992 1335T1037 1268V1241H834Z" />
+<glyph unicode="&#xe9;" glyph-name="eacute" horiz-adv-x="1190" d="M612 922Q531 922 478 865T416 686H805Q804 737 792 780T756 854T696 904T612 922ZM651 -20Q531 -20 430 15T256 120T143 298T102 551Q102 698 139 808T242 991T402 1102T610 1139Q721 1139
+810 1106T962 1007T1058 848T1092 631V483H410Q412 419 430 368T482 281T563 226T672 207Q723 207 768 212T857 229T942 256T1028 295V59Q988 38 948 24T862 -1T765 -15T651 -20ZM447 1241V1268Q468 1297 492 1335T539 1413T584 1494T621 1569H963V1548Q952 1530
+931 1506T883 1453T825 1396T763 1338T702 1285T650 1241H447Z" />
+<glyph unicode="&#xea;" glyph-name="ecircumflex" horiz-adv-x="1190" d="M612 922Q531 922 478 865T416 686H805Q804 737 792 780T756 854T696 904T612 922ZM651 -20Q531 -20 430 15T256 120T143 298T102 551Q102 698 139 808T242 991T402 1102T610 1139Q721
+1139 810 1106T962 1007T1058 848T1092 631V483H410Q412 419 430 368T482 281T563 226T672 207Q723 207 768 212T857 229T942 256T1028 295V59Q988 38 948 24T862 -1T765 -15T651 -20ZM819 1241Q768 1275 713 1318T606 1417Q552 1361 500 1318T397 1241H194V1268Q220
+1297 251 1335T315 1413T378 1494T430 1569H786Q807 1535 837 1495T899 1414T964 1335T1022 1268V1241H819Z" />
+<glyph unicode="&#xeb;" glyph-name="edieresis" horiz-adv-x="1190" d="M612 922Q531 922 478 865T416 686H805Q804 737 792 780T756 854T696 904T612 922ZM651 -20Q531 -20 430 15T256 120T143 298T102 551Q102 698 139 808T242 991T402 1102T610 1139Q721 1139
+810 1106T962 1007T1058 848T1092 631V483H410Q412 419 430 368T482 281T563 226T672 207Q723 207 768 212T857 229T942 256T1028 295V59Q988 38 948 24T862 -1T765 -15T651 -20ZM266 1405Q266 1440 277 1465T306 1507T350 1532T405 1540Q434 1540 459 1532T504
+1508T534 1466T546 1405Q546 1371 535 1346T504 1305T460 1280T405 1272Q376 1272 351 1280T307 1304T277 1346T266 1405ZM669 1405Q669 1440 680 1465T710 1507T755 1532T811 1540Q839 1540 864 1532T909 1508T940 1466T952 1405Q952 1371 941 1346T910 1305T865
+1280T811 1272Q751 1272 710 1305T669 1405Z" />
+<glyph unicode="&#xec;" glyph-name="igrave" horiz-adv-x="625" d="M465 0H160V1118H465V0ZM269 1241Q235 1269 188 1310T94 1396T10 1480T-44 1548V1569H298Q314 1535 335 1495T380 1414T427 1335T472 1268V1241H269Z" />
+<glyph unicode="&#xed;" glyph-name="iacute" horiz-adv-x="625" d="M465 0H160V1118H465V0ZM145 1241V1268Q166 1297 190 1335T237 1413T282 1494T319 1569H661V1548Q650 1530 629 1506T581 1453T523 1396T461 1338T400 1285T348 1241H145Z" />
+<glyph unicode="&#xee;" glyph-name="icircumflex" horiz-adv-x="625" d="M465 0H160V1118H465V0ZM521 1241Q470 1275 415 1318T308 1417Q254 1361 202 1318T99 1241H-104V1268Q-78 1297 -47 1335T17 1413T80 1494T132 1569H488Q509 1535 539 1495T601 1414T666
+1335T724 1268V1241H521Z" />
+<glyph unicode="&#xef;" glyph-name="idieresis" horiz-adv-x="625" d="M465 0H160V1118H465V0ZM-32 1405Q-32 1440 -21 1465T8 1507T52 1532T107 1540Q136 1540 161 1532T206 1508T236 1466T248 1405Q248 1371 237 1346T206 1305T162 1280T107 1272Q78 1272 53
+1280T9 1304T-21 1346T-32 1405ZM371 1405Q371 1440 382 1465T412 1507T457 1532T513 1540Q541 1540 566 1532T611 1508T642 1466T654 1405Q654 1371 643 1346T612 1305T567 1280T513 1272Q453 1272 412 1305T371 1405Z" />
+<glyph unicode="&#xf0;" glyph-name="eth" horiz-adv-x="1182" d="M457 1309Q423 1330 384 1354T303 1401L399 1571Q472 1537 536 1503T657 1430L883 1569L983 1415L809 1309Q881 1240 935 1162T1024 993T1078 798T1096 573Q1096 431 1060 321T957 135T795 20T582
+-20Q471 -20 378 14T218 113T112 272T74 489Q74 611 106 705T197 863T337 961T516 995Q612 995 680 964T780 883L801 885Q773 973 723 1050T606 1184L375 1040L274 1196L457 1309ZM784 532Q784 579 773 622T737 698T675 750T586 770Q478 770 432 700T385 487Q385
+424 396 372T432 283T495 226T586 205Q692 205 738 286T784 532Z" />
+<glyph unicode="&#xf1;" glyph-name="ntilde" horiz-adv-x="1284" d="M1130 0H825V653Q825 774 789 834T672 895Q612 895 572 871T509 800T475 684T465 526V0H160V1118H393L434 975H451Q475 1018 509 1049T585 1100T672 1129T766 1139Q848 1139 915 1116T1030
+1042T1104 915T1130 729V0ZM477 1346Q446 1346 428 1320T397 1239H248Q254 1319 274 1377T326 1473T403 1529T500 1548Q541 1548 580 1532T657 1497T733 1461T807 1444Q838 1444 856 1470T887 1550H1036Q1030 1471 1010 1413T956 1317T880 1260T784 1241Q744 1241
+704 1257T626 1293T551 1329T477 1346Z" />
+<glyph unicode="&#xf2;" glyph-name="ograve" horiz-adv-x="1227" d="M414 561Q414 394 461 310T614 225Q719 225 766 310T813 561Q813 728 766 810T612 893Q507 893 461 811T414 561ZM1124 561Q1124 421 1089 313T987 131T825 19T610 -20Q499 -20 406 18T246
+131T140 313T102 561Q102 700 137 808T239 989T401 1101T616 1139Q727 1139 820 1101T980 990T1086 808T1124 561ZM841 1241Q807 1269 760 1310T666 1396T582 1480T528 1548V1569H870Q886 1535 907 1495T952 1414T999 1335T1044 1268V1241H841Z" />
+<glyph unicode="&#xf3;" glyph-name="oacute" horiz-adv-x="1227" d="M414 561Q414 394 461 310T614 225Q719 225 766 310T813 561Q813 728 766 810T612 893Q507 893 461 811T414 561ZM1124 561Q1124 421 1089 313T987 131T825 19T610 -20Q499 -20 406 18T246
+131T140 313T102 561Q102 700 137 808T239 989T401 1101T616 1139Q727 1139 820 1101T980 990T1086 808T1124 561ZM434 1241V1268Q455 1297 479 1335T526 1413T571 1494T608 1569H950V1548Q939 1530 918 1506T870 1453T812 1396T750 1338T689 1285T637 1241H434Z"
+/>
+<glyph unicode="&#xf4;" glyph-name="ocircumflex" horiz-adv-x="1227" d="M414 561Q414 394 461 310T614 225Q719 225 766 310T813 561Q813 728 766 810T612 893Q507 893 461 811T414 561ZM1124 561Q1124 421 1089 313T987 131T825 19T610 -20Q499 -20 406 18T246
+131T140 313T102 561Q102 700 137 808T239 989T401 1101T616 1139Q727 1139 820 1101T980 990T1086 808T1124 561ZM821 1241Q770 1275 715 1318T608 1417Q554 1361 502 1318T399 1241H196V1268Q222 1297 253 1335T317 1413T380 1494T432 1569H788Q809 1535 839
+1495T901 1414T966 1335T1024 1268V1241H821Z" />
+<glyph unicode="&#xf5;" glyph-name="otilde" horiz-adv-x="1227" d="M414 561Q414 394 461 310T614 225Q719 225 766 310T813 561Q813 728 766 810T612 893Q507 893 461 811T414 561ZM1124 561Q1124 421 1089 313T987 131T825 19T610 -20Q499 -20 406 18T246
+131T140 313T102 561Q102 700 137 808T239 989T401 1101T616 1139Q727 1139 820 1101T980 990T1086 808T1124 561ZM444 1346Q413 1346 395 1320T364 1239H215Q221 1319 241 1377T293 1473T370 1529T467 1548Q508 1548 547 1532T624 1497T700 1461T774 1444Q805
+1444 823 1470T854 1550H1003Q997 1471 977 1413T923 1317T847 1260T751 1241Q711 1241 671 1257T593 1293T518 1329T444 1346Z" />
+<glyph unicode="&#xf6;" glyph-name="odieresis" horiz-adv-x="1227" d="M414 561Q414 394 461 310T614 225Q719 225 766 310T813 561Q813 728 766 810T612 893Q507 893 461 811T414 561ZM1124 561Q1124 421 1089 313T987 131T825 19T610 -20Q499 -20 406 18T246
+131T140 313T102 561Q102 700 137 808T239 989T401 1101T616 1139Q727 1139 820 1101T980 990T1086 808T1124 561ZM266 1405Q266 1440 277 1465T306 1507T350 1532T405 1540Q434 1540 459 1532T504 1508T534 1466T546 1405Q546 1371 535 1346T504 1305T460 1280T405
+1272Q376 1272 351 1280T307 1304T277 1346T266 1405ZM669 1405Q669 1440 680 1465T710 1507T755 1532T811 1540Q839 1540 864 1532T909 1508T940 1466T952 1405Q952 1371 941 1346T910 1305T865 1280T811 1272Q751 1272 710 1305T669 1405Z" />
+<glyph unicode="&#xf7;" glyph-name="divide" horiz-adv-x="1128" d="M88 612V831H1040V612H88ZM424 373Q424 415 435 444T465 490T509 516T563 524Q591 524 616 516T660 491T690 444T702 373Q702 333 691 304T660 257T616 230T563 221Q535 221 510 229T465 256T435
+304T424 373ZM424 1071Q424 1113 435 1142T465 1189T509 1215T563 1223Q591 1223 616 1215T660 1189T690 1142T702 1071Q702 1031 691 1003T660 956T616 929T563 920Q535 920 510 928T465 955T435 1002T424 1071Z" />
+<glyph unicode="&#xf8;" glyph-name="oslash" horiz-adv-x="1227" d="M1124 561Q1124 421 1089 313T987 131T825 19T610 -20Q553 -20 501 -10T401 18L344 -76L182 14L250 125Q181 199 142 308T102 561Q102 700 137 808T239 989T401 1101T616 1139Q678 1139 735
+1126T844 1090L893 1169L1053 1073L991 975Q1054 903 1089 799T1124 561ZM414 561Q414 475 426 410L709 868Q669 893 612 893Q507 893 461 811T414 561ZM813 561Q813 625 807 674L539 240Q556 232 574 229T614 225Q719 225 766 310T813 561Z" />
+<glyph unicode="&#xf9;" glyph-name="ugrave" horiz-adv-x="1284" d="M891 0L850 143H834Q809 100 775 70T699 19T612 -10T518 -20Q436 -20 369 3T254 77T180 204T154 389V1118H459V465Q459 344 495 284T612 223Q672 223 712 247T775 318T809 434T819 592V1118H1124V0H891ZM839
+1241Q805 1269 758 1310T664 1396T580 1480T526 1548V1569H868Q884 1535 905 1495T950 1414T997 1335T1042 1268V1241H839Z" />
+<glyph unicode="&#xfa;" glyph-name="uacute" horiz-adv-x="1284" d="M891 0L850 143H834Q809 100 775 70T699 19T612 -10T518 -20Q436 -20 369 3T254 77T180 204T154 389V1118H459V465Q459 344 495 284T612 223Q672 223 712 247T775 318T809 434T819 592V1118H1124V0H891ZM461
+1241V1268Q482 1297 506 1335T553 1413T598 1494T635 1569H977V1548Q966 1530 945 1506T897 1453T839 1396T777 1338T716 1285T664 1241H461Z" />
+<glyph unicode="&#xfb;" glyph-name="ucircumflex" horiz-adv-x="1284" d="M891 0L850 143H834Q809 100 775 70T699 19T612 -10T518 -20Q436 -20 369 3T254 77T180 204T154 389V1118H459V465Q459 344 495 284T612 223Q672 223 712 247T775 318T809 434T819 592V1118H1124V0H891ZM842
+1241Q791 1275 736 1318T629 1417Q575 1361 523 1318T420 1241H217V1268Q243 1297 274 1335T338 1413T401 1494T453 1569H809Q830 1535 860 1495T922 1414T987 1335T1045 1268V1241H842Z" />
+<glyph unicode="&#xfc;" glyph-name="udieresis" horiz-adv-x="1284" d="M891 0L850 143H834Q809 100 775 70T699 19T612 -10T518 -20Q436 -20 369 3T254 77T180 204T154 389V1118H459V465Q459 344 495 284T612 223Q672 223 712 247T775 318T809 434T819 592V1118H1124V0H891ZM295
+1405Q295 1440 306 1465T335 1507T379 1532T434 1540Q463 1540 488 1532T533 1508T563 1466T575 1405Q575 1371 564 1346T533 1305T489 1280T434 1272Q405 1272 380 1280T336 1304T306 1346T295 1405ZM698 1405Q698 1440 709 1465T739 1507T784 1532T840 1540Q868
+1540 893 1532T938 1508T969 1466T981 1405Q981 1371 970 1346T939 1305T894 1280T840 1272Q780 1272 739 1305T698 1405Z" />
+<glyph unicode="&#xfd;" glyph-name="yacute" horiz-adv-x="1104" d="M0 1118H334L514 489Q530 437 537 378T547 272H553Q555 295 558 323T567 380T578 437T592 489L768 1118H1104L662 -143Q600 -320 493 -406T225 -492Q173 -492 135 -487T70 -475V-233Q91 -238
+123 -242T190 -246Q238 -246 272 -233T330 -197T372 -140T403 -66L422 -10L0 1118ZM393 1241V1268Q414 1297 438 1335T485 1413T530 1494T567 1569H909V1548Q898 1530 877 1506T829 1453T771 1396T709 1338T648 1285T596 1241H393Z" />
+<glyph unicode="&#xfe;" glyph-name="thorn" horiz-adv-x="1245" d="M465 973Q485 1008 512 1038T576 1090T656 1126T756 1139Q842 1139 913 1102T1035 992T1114 811T1143 561Q1143 418 1115 310T1036 128T914 17T756 -20Q701 -20 656 -10T576 20T513 64T465 117H451Q454
+85 458 55Q461 29 463 3T465 -39V-492H160V1556H465V1165Q465 1141 463 1108T458 1045Q454 1010 451 973H465ZM653 895Q602 895 567 877T509 821T477 728T465 596V563Q465 482 474 419T506 314T564 249T655 227Q746 227 788 313T831 565Q831 730 789 812T653 895Z"
+/>
+<glyph unicode="&#xff;" glyph-name="ydieresis" horiz-adv-x="1104" d="M0 1118H334L514 489Q530 437 537 378T547 272H553Q555 295 558 323T567 380T578 437T592 489L768 1118H1104L662 -143Q600 -320 493 -406T225 -492Q173 -492 135 -487T70 -475V-233Q91
+-238 123 -242T190 -246Q238 -246 272 -233T330 -197T372 -140T403 -66L422 -10L0 1118ZM466 1405Q466 1440 477 1465T506 1507T550 1532T605 1540Q634 1540 659 1532T704 1508T734 1466T746 1405Q746 1371 735 1346T704 1305T660 1280T605 1272Q576 1272 551 1280T507
+1304T477 1346T466 1405ZM869 1405Q869 1440 880 1465T910 1507T955 1532T1011 1540Q1039 1540 1064 1532T1109 1508T1140 1466T1152 1405Q1152 1371 1141 1346T1110 1305T1065 1280T1011 1272Q951 1272 910 1305T869 1405Z" />
+<glyph unicode="&#x2013;" glyph-name="endash" horiz-adv-x="1024" d="M82 436V666H942V436H82Z" />
+<glyph unicode="&#x2014;" glyph-name="emdash" horiz-adv-x="2048" d="M82 436V666H1966V436H82Z" />
+<glyph unicode="&#x2018;" glyph-name="quoteleft" horiz-adv-x="440" d="M37 961L23 983Q37 1037 56 1098T99 1221T148 1344T199 1462H418Q403 1401 389 1335T361 1204T336 1076T317 961H37Z" />
+<glyph unicode="&#x2019;" glyph-name="quoteright" horiz-adv-x="440" d="M403 1462L418 1440Q404 1385 385 1325T342 1202T293 1078T242 961H23Q37 1021 51 1087T79 1219T104 1347T123 1462H403Z" />
+<glyph unicode="&#x201a;" glyph-name="quotesinglbase" horiz-adv-x="594" d="M459 215Q445 161 426 100T383 -23T334 -146T283 -264H63Q78 -203 92 -137T120 -6T145 122T164 238H444L459 215Z" />
+<glyph unicode="&#x201c;" glyph-name="quotedblleft" horiz-adv-x="907" d="M489 983Q503 1037 523 1098T566 1221T615 1344T666 1462H885Q870 1401 856 1335T828 1204T803 1076T784 961H504L489 983ZM23 983Q37 1037 56 1098T99 1221T148 1344T199 1462H418Q403
+1401 389 1335T361 1204T336 1076T317 961H37L23 983Z" />
+<glyph unicode="&#x201d;" glyph-name="quotedblright" horiz-adv-x="907" d="M418 1440Q404 1385 385 1325T342 1202T293 1078T242 961H23Q37 1021 51 1087T79 1219T104 1347T123 1462H403L418 1440ZM885 1440Q871 1385 852 1325T809 1202T760 1078T709 961H489Q504
+1021 518 1087T546 1219T571 1347T590 1462H870L885 1440Z" />
+<glyph unicode="&#x201e;" glyph-name="quotedblbase" horiz-adv-x="1061" d="M459 215Q445 161 426 100T383 -23T334 -146T283 -264H63Q78 -203 92 -137T120 -6T145 122T164 238H444L459 215ZM926 215Q912 161 893 100T850 -23T801 -146T750 -264H530Q545 -203
+559 -137T587 -6T612 122T631 238H911L926 215Z" />
+<glyph unicode="&#x2022;" glyph-name="bullet" horiz-adv-x="770" d="M98 748Q98 834 120 894T180 992T271 1047T385 1065Q444 1065 496 1048T588 992T649 894T672 748Q672 663 650 603T588 505T497 448T385 430Q324 430 272 448T181 504T120 603T98 748Z" />
+<glyph unicode="&#x2039;" glyph-name="guilsinglleft" horiz-adv-x="692" d="M82 573L391 1028L610 909L393 561L610 213L391 94L82 547V573Z" />
+<glyph unicode="&#x203a;" glyph-name="guilsinglright" horiz-adv-x="692" d="M610 547L301 94L82 213L299 561L82 909L301 1028L610 573V547Z" />
+</font>
+</defs>
+</svg>
+`)
+
+func third_partySwaggerUiFontsDroidSansV6Latin700SvgBytes() ([]byte, error) {
+	return _third_partySwaggerUiFontsDroidSansV6Latin700Svg, nil
+}
+
+func third_partySwaggerUiFontsDroidSansV6Latin700Svg() (*asset, error) {
+	bytes, err := third_partySwaggerUiFontsDroidSansV6Latin700SvgBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/fonts/droid-sans-v6-latin-700.svg", size: 73575, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiFontsDroidSansV6Latin700Ttf = []byte("\x00\x01\x00\x00\x00\x11\x01\x00\x00\x04\x00\x10GDEF\x00\x10\x00\xd2\x00\x00\x8b`\x00\x00\x00\x16GPOS\xf2ZM^\x00\x00\x8bx\x00\x00\x12\xc0GSUB\x00\x15\x00\n\x00\x00\x9e8\x00\x00\x00\fOS/2\xa2\t\xb7\x96\x00\x00{\xa8\x00\x00\x00`cmapmag\xda\x00\x00|\b\x00\x00\x00\x8ccvt K\xe2RQ\x00\x00\x86\x00\x00\x00\x02\x06fpgms\xd3#\xb0\x00\x00|\x94\x00\x00\a\x05gasp\x00\a\x00\a\x00\x00\x8bT\x00\x00\x00\fglyf}]p\b\x00\x00\x01\x1c\x00\x00u\x1chead\xf5\xcd \xd7\x00\x00x\x00\x00\x00\x006hhea\r\x9b\x05a\x00\x00{\x84\x00\x00\x00$hmtx\x9f\xc7I\xb4\x00\x00x8\x00\x00\x03Llocada\x83\"\x00\x00vX\x00\x00\x01\xa8maxp\x03\x17\x02\x14\x00\x00v8\x00\x00\x00 name\x19w4\x0f\x00\x00\x88\b\x00\x00\x01dpost\xa2\xc2\x0f;\x00\x00\x89l\x00\x00\x01\xe7prepeq\u058a\x00\x00\x83\x9c\x00\x00\x02b\x00\x02\x00u\xff\xe5\x01\xd3\x05\xb6\x00\x03\x00\x17\x00]@B\xb0\x19\xe0\x19\xf0\x19\x03\x1f\x19/\x19?\x19\u007f\x19\x9f\x19\x05\xd7\x03\x01\xc6\x03\x01w\x03\x01\x16\x03f\x03\x02\x03\x03\x01\x03\x0e\x96\xd8\x02\x01\xc9\x02\x01x\x02\x01i\x02\x01\x02 \x04\x01\x00\x04`\x04\x02\x04\x01\t\x9b\x13\x02\x03\x00?/\xfd\xce\x01/]q3]]]]\xed2]]]]]]]10\x01#\x03!\x014>\x0232\x1e\x02\x15\x14\x0e\x02#\".\x02\x01\xa0\xf43\x01Z\xfe\xa2\x1b0@%#?0\x1c\x1c0?#%@0\x1b\x01\xe5\x03\xd1\xfa\xd9/A(\x12\x12(A/-@*\x13\x13*@\x00\x00\x00\x02\x00\x85\x03\xa6\x03B\x05\xb6\x00\x03\x00\a\x00/@\x1a\x04\x98\a\a\t_\t\x01\x00\x98\x00\x03\x10\x03\x02\b\x03\x06\x00\x01\x01\x01\x01\a\x03\x03\x00?33/]3\x01/^]\xe1]\x129/\xe110\x01\x03#\x03!\x03#\x03\x01\x9c)\xc5)\x02\xbd)\xc5)\x05\xb6\xfd\xf0\x02\x10\xfd\xf0\x02\x10\x00\x00\x02\x00-\x00\x00\x04\xfe\x05\xb4\x00\x1b\x00\x1f\x00\xcd@\x80\x03\x03\x1a\x1a\x18\x16\x1e\x1d\a\x04\x06\x17\x17\x06\x19\x00\x01\x04\x04\x05\xb1\xf4\x18\x01P\x18\x01\x18\x18!\x15\x1f\x1c\b\x04\t\x14\x14\x12\x0f\x0e\v\x04\x13\xb1\n`\x10\x01\x10\x10\f\f\t\xfb\n\x01`\np\n\x02\n\x1c\x01H\r\x01\r\xae\f\b\x04\f\x1f\x00\xe7\x10\x01\x10\xae\x11\x19\x15\x11\xf4\f\x01\xe5\f\x01\x92\f\x01T\f\x010\f@\f\x02\xeb\x11\xfb\x11\x02\x9d\x11\x01[\x11\x01?\x11O\x11\x02\f\x11\f\x11\x05\x17\x13\x06\n\x05\x00/3?3\x1299//]]]]]]]]]\x1133\x10\xe9]22\x1133\x10\xe9]22\x01/]]33/3/]\x10\xec\x1792\x11\x12\x179\x113/]]\xec\x17923\x11\x12\x179\x113/3/10\x01\a!\x15!\x03#\x13#\x03#\x13#5!7#5!\x133\x033\x133\x033\x15\x0537#\x03\xe7/\x01\x02\xfe\xd7M\xdcN\xc2L\xd7J\xee\x01\x15/\xfc\x01!M\xdbM\xc6N\xd7N\xf0\xfd\x1d\xc4/\xc4\x03L\xe8\xce\xfej\x01\x96\xfej\x01\x96\xce\xe8\xd1\x01\x97\xfei\x01\x97\xfei\xd1\xe8\xe8\x00\x00\x00\x00\x03\x00b\xff\x89\x04%\x06\x14\x003\x00<\x00C\x00\xce@F&.@#@\xfb@\x01?@\x01@:\x06\x13\xf4\a\x01\xe6\a\x01\x00\a\x10\a0\a\x03\a\a\x1e\v4\x1b4+4{4\x8b4\x054)\x0f\x00O\x00\x02\x00E\x04=\x14=$=t=\x84=\x05=\x0e\x90\x1e\xa0\x1e\x02\x1e\xb8\xff\xc0@?\v\x0fH\x1e-*AA&9\x14\x14.@\xb6@\x01\x89@\x01@\x13&%@\x0e\x14H%%# &@&P&\x80&\xb0&\x05\x0f&\x01&:\x0e\x13\x13\bP\a`\a\x02\a\a\x05@\b\x01\b\x00/]33/]\x113\x1133/]]33/+\x11\x129]]\x1133\x113\x113\x1133\x01/+]3\xc9]\x10\xde]2\xc9]\x119/]]]3\xc923]]\x113\x10\xc9210\x01\x14\x0e\x02\a\x15#5.\x03'\x11\x1e\x03\x17\x11&'.\x01'.\x0354>\x02753\x15\x1e\x01\x17\a.\x01'\x11\x17\x1e\x03\x054.\x02'\x15>\x01\x01\x14\x16\x175\x0e\x01\x04%5i\x9cf\x89BpbY+*cjm4\b\t\b\x10\x06[\x88[-9j\x98_\x89W\xb6deA\x8d>'_\x8e^.\xfe\xd3\r\x1c+\x1f;8\xfe\x974967\x01\xc9K\x80`>\n\xcd\xc9\x02\f\x16\x1f\x13\x01\b\x15&\x1f\x16\x03\x01>\x03\x04\x03\x06\x02#L^rHK{[9\t\x9d\x97\x05(+\xea\x1a)\x05\xfe\xdb\x0e#J\\rR\x18$\x1e\x19\x0e\xfc\t<\x02\x8e/?\x15\xe9\x060\x00\x00\x00\x00\x05\x00?\xff\xee\x06\xcd\x05\xcb\x00\n\x00\x1e\x00\"\x00-\x00A\x00\x9d\xb51\x18\t\rH?\xb8\xff\xe8@\x0e\t\rH:\x18\t\rH5\x18\t\rH\x1c\xb8\xff\xe8@$\t\rH\x18\x18\t\rH\x13(\t\rH\x0e\x18\t\rH#\xb48\xb5.Y\"\x01\"\x1fV \x01 !\x1f\x10!\xb8\xff\xf0@#\x1f!\x1f!\x15)\xb4.C\x06\xb4\v\xb5\x00\xb4\x15+\xb6=\xb7&\xb63\x19\"\x06!\x03\xb6\x10\xb7\b\xb6\x1a\a\x00?\xe9\xfc\xe9/??\xe9\xfc\xe9\x01/\xe9\xfc\xe9\x10\xde\xe9\x1299//88\x113]\x113]\x10\xfc\xe910\x00+\x01++\x00++\x01+\x00++\x01\x14\x1632654#\"\x06\x05\x14\x0e\x02#\".\x0254>\x0232\x1e\x02\t\x01#\x01\x13\x14\x1632654#\"\x06\x05\x14\x0e\x02#\".\x0254>\x0232\x1e\x02\x01;-21/`2-\x01\xbb)V\x84[U\x81W,(U\x82ZV\x83X-\x02\x9b\xfc\xd5\xef\x03+p-21/`2-\x01\xbb)V\x84[U\x80W,(T\x82ZV\x83X-\x04\x00\u007f}|\x80\xfa{}l\xacv??v\xacll\xaau>>u\xaa\x01H\xfaJ\x05\xb6\xfc\x02\u007f}|\x80\xfa{}l\xabv??v\xabll\xaau>>u\xaa\x00\x00\x03\x00R\xff\xec\x05\xc3\x05\xcb\x00-\x009\x00I\x00\x9f@A'G():\x89:\x02:H\x1eG#$-\x04\x00&D\x86D\x02DH\x14\x0267\x0f\x04\x14\x01\xf4\x1e\x01\xd0\x1e\xe0\x1e\x02;\x1eK\x1e\x02\x04\x14\x14\x14\x02(\x1e\x14\x14\x1e(\x03\n\v\x01\x1b\x01\x02\x01\x00\xb8\xff\xc0@\"\t\fH\x00\x00K.G\n\x0267\x0f\x04?\x01?\x19''3-$#G\x04\x01\x19\x043\x05\x16\x01\x15\x00??3?\x12\x179\x129/\x113\x11\x12\x179\x01/\xe9\x113/+3]\x12\x179///]]]]\x11\x12\x179\x10\xe9]\x11\x179\x10\xe9]\x10\xe910)\x01'\x0e\x01#\".\x0254>\x027.\x0354>\x0232\x1e\x02\x15\x14\x0e\x02\a\x01>\x017!\x0e\x03\a%\x14\x1e\x023267\x01\x0e\x01\x014.\x02#\"\x0e\x02\x15\x14\x16\x17>\x01\x05\xc3\xfe\x87aP\xc1tx\u00cbL%Da<&5 \x0e=m\x97ZV\x91i<-Lg;\x01\x04#5\x13\x01=\x0f)6F+\xfc\xeb 9M-<f+\xfe\xcb38\x01H\x14!)\x15\x16-%\x17.(MOd7A<m\x99]MybP$.USS-N{W.*QwLEsbR#\xfe\xf4B\x92J9~\u007f~9\x85,F0\x1a\x1f\x1c\x01J*`\x02}\x1f+\x1c\r\f\x1b-!4\\.,X\x00\x01\x00\x85\x03\xa6\x01\x9c\x05\xb6\x00\x03\x000@\x1e\x0f\x05\x01\xff\x05\x01\xd0\x05\xe0\x05\x02_\x05\x01\x00\x98\x00\x03\x10\x03\x02\b\x03\x00\x01\x01\x01\x01\x03\x03\x00?3/]\x01/^]\xe1]]]q10\x01\x03#\x03\x01\x9c)\xc5)\x05\xb6\xfd\xf0\x02\x10\x00\x00\x00\x00\x01\x00R\xfe\xbc\x02y\x05\xb6\x00\x13\x00\x1c@\x0f\x0e\x06\xf1\t\xf0/\x00?\x00\x02\x00\x0e\xf9\x05\xf8\x00??\x01/]\xe9\xec210\x134>\x0273\x06\x02\x15\x14\x1e\x02\x17#.\x03R$JqN\xfa\x8d\x90$HjE\xf8NqJ$\x021}\xf3\xe5\xd3]\xc1\xfe2\xf4w\xec\xe2\xd4^Z\xce\xe1\xf0\x00\x00\x01\x00=\xfe\xbc\x02d\x05\xb6\x00\x13\x00\x18@\v\x06\x0e\xf1\v\xf0\x00\x15\x0e\xf8\x05\xf9\x00??\x01\x10\xde\xe9\xec210\x01\x14\x0e\x02\a#>\x0354\x02'3\x1e\x03\x02d$JqN\xf8EjH$\x90\x8d\xfaNqJ$\x021|\xf0\xe1\xceZ^\xd4\xe2\xecw\xf4\x01\xce\xc1]\xd3\xe5\xf3\x00\x00\x01\x00?\x02V\x04\x1d\x06\x14\x00\x0e\x00#@\x14@\x00\x011\x00\x01\x00\x84\x0e\x94\x0e\x02\x0e\x1f\x06\x01\x06\x06\x00\x00\x00?2/]\x01/]\xcd]]10\x01\x03%\x17\x05\x13\a\v\x01'\x13%7\x05\x03\x02\xb0)\x01u!\xfe\xac\xdf\u3709\xec\xdd\xfe\xae'\x01m)\x06\x14\xfe\x90h\xfc\x18\xfe\xd7y\x019\xfe\xc9w\x01)\x1a\xfah\x01p\x00\x00\x00\x01\x00X\x00\xf8\x04\x10\x04\xb0\x00\v\x00 @\x0e\a\x06\t\xaa\x03\x02\x00\v\t\x00\xad\x06\x04\x03\x00/33\xe922\x01/22\xe92210\x01!5!\x113\x11!\x15!\x11#\x01\xc7\xfe\x91\x01o\xdb\x01n\xfe\x92\xdb\x02d\xdb\x01q\xfe\x8f\xdb\xfe\x94\x00\x01\x00?\xfe\xf8\x01\xcb\x00\xee\x00\f\x00V@A\xa0\x0e\xb0\x0e\xe0\x0e\xf0\x0e\x04/\x0e?\x0e\x02\xab\v\xbb\v\x02<\vL\v\x02y\v\x89\v\x99\v\x03\n\v\x1a\v*\v\x03\v\x00\x97&\x056\x05F\x05\x03\x05/\x06?\x06O\x06\x03\x06\x05\x9c\v@\t\fH\v\x00/+\xed\x01/]3]\xed2]]]]]]10%\x0e\x03\a#>\x037!\x01\xcb\x0e'/3\x19\xdc\x0f\x1d\x1b\x16\b\x01\x18\xd76z|{8=\x84\x83}5\x00\x00\x01\x00=\x01\xa8\x02V\x02\xa2\x00\x03\x00\x1a@\r\x02\x05\x1f\x05\x01\x80\x00\x01\x00\x00\xbb\x01\xbd\x00?\xe9\x01/]]\x10\xce10\x135!\x15=\x02\x19\x01\xa8\xfa\xfa\x00\x00\x01\x00u\xff\xe5\x01\xd3\x019\x00\x13\x00&@\x19\xb0\x15\xe0\x15\xf0\x15\x03/\x15?\x15\x02\n\x96\x00\x00\x10\x00`\x00\x03\x00\x05\x9b\x0f\x00/\xed\x01/]\xed]]1074>\x0232\x1e\x02\x15\x14\x0e\x02#\".\x02u\x1b0@%#?0\x1c\x1c0?#%@0\x1b\x8f/A(\x12\x12(A/-@*\x13\x13*@\x00\x00\x00\x00\x01\x00\x0e\x00\x00\x03D\x05\xb6\x00\x03\x00(@\x0e\x06\x01\x01\t\x03\x01\x03\x00\x10\x00\x00\x05\x01\x02\xb8\xff\xf0\xb3\x02\x01\x00\x03\x00?/\x01/83\x113/8210]]\t\x01!\x01\x03D\xfd\xdf\xfe\xeb\x02!\x05\xb6\xfaJ\x05\xb6\x00\x02\x00?\xff\xec\x04)\x05\xcd\x00\x13\x00!\x00\x1e@\x0f\x1an\x00#\x14n\n\x1dt\x0f\a\x17t\x05\x19\x00?\xe9?\xe9\x01/\xe9\x10\xde\xe910\x01\x14\x02\x0e\x01#\".\x01\x0254\x12>\x0132\x1e\x01\x12\x05\x14\x1632654&#\"\x0e\x02\x04)7y\xbf\x87\u007f\xbc|=7x\xbe\x87~\xbc~>\xfdJVjh[[h5I.\x14\x02\u06f1\xfe\xea\xc2ff\xc2\x01\x16\xb1\xb1\x01\x18\xc2gf\xc2\xfe\xe8\xb2\xfa\xfc\xfa\xfc\xfb\xfd@~\xbd\x00\x01\x00\\\x00\x00\x031\x05\xb6\x00\x10\x00%@\x14\x0f\x01\x0e\x0e\a\x00n\x9a\x01\x01 \x01`\x01\x02\x01\x0f\x06\x00\x18\x00??\x01/]]\xe933/\x11310)\x01\x114>\x027\x0e\x03\x0f\x01'\x013\x031\xfe\xcb\x01\x03\x03\x01\x05\x18\x1e \x0f\xa8\x96\x01\xd7\xfe\x03N\x1aIOP!\x06\x18\x1d\x1e\f\x87\xba\x01w\x00\x00\x01\x00N\x00\x00\x04'\x05\xcb\x00!\x00/@\x19!\bn\x19#\x1f\x0f@\x02P\x02`\x02\x03\x02\b \x0e\v\x14\a\x02 \x01\x18\x00?\xc92?\xc93\x129\x01/]33\x10\xde\xe9310)\x015\x01>\x0354&#\"\x06\a'>\x0332\x1e\x02\x15\x14\x0e\x02\x0f\x01\x15!\x04'\xfc+\x01XAjL*YKO\x92P\xa8-bv\x8eXi\xa7v?<h\x89N\xb0\x02T\xd7\x01sFvptCJRNH\xc7)K:#:k\x98_V\x9d\x97\x95M\xb1\x0e\x00\x00\x00\x00\x01\x009\xff\xec\x04\x19\x05\xcb\x00;\x00W@3\x05\v\x01\x05:\x01\x05\x00\"\"\x11\t)n\x00\x00\x1cn\t=2\u007f\x11\x8f\x11\x02\x11\x05\"wl#\x01:#J#\x02##\x171,t7\a\x17u\x12\x0e\x19\x00?3\xe9?\xe93\x129/]]\xe99\x01/]3\x10\xde\xe93/\xe9\x11\x129/\x12910]]\x01\x14\x0e\x02\a\x15\x1e\x01\x15\x14\x0e\x02#\"&'\x11\x1e\x0332>\x0254.\x02+\x01532>\x0254&#\"\x0e\x02\a'>\x0332\x1e\x02\x03\xee1UsC\xb1\xb6E\x8f\u0653v\xd0Z-dda+VrD\x1d%S\x86bhf\\zI\x1eai0SG;\x18\x9c*ct\x86Ll\xb1~E\x04oLy[=\x10\x06\x16\xab\x91`\xa3xC'(\x01\a\x18$\x19\f :Q0-I3\x1c\xd9!9L+NX\x13\x1d#\x11\xce\x1f4'\x16/Y\x81\x00\x00\x02\x00\x04\x00\x00\x04=\x05\xb6\x00\n\x00\x18\x008@\x1d\t\x00\x02n\v\a\x9a\x03\x01\x00\x03\x01\x03\x03\x1a\x18\x05\x01\x05u\t\x18\x18\x02\x11\a\x06\x02\x18\x00??3\x129/3\xe12\x01/2\x129/]]33\xe92210\x01#\x11!\x11!5\x01!\x113!54>\x047#\x0e\x01\a\x03\x04=\xb0\xfe\xd3\xfd\xa4\x02m\x01\x1c\xb0\xfe#\x01\x02\x03\x03\x03\x01\t\x12-\x1d\xf4\x01/\xfe\xd1\x01/\xd7\x03\xb0\xfci\xf8\r1>B<-\n*^/\xfe\x8e\x00\x00\x01\x00V\xff\xec\x04\x12\x05\xb6\x00(\x00b@#%&\x05&\x15&\x02&\"$\x05! \x12\x18H\x89!\x01{!\x01]!m!\x02!!\x0f\x18n\x05*\x0f\xb8\xff\xc0@\x17\f\x0fH\x0f\x1bt\x04\x00\x14\x00\x02\x00\x00\n%s\"\x06\x15t\x10\n\x19\x00?3\xe9?\xe9\x129/]\xe9\x01/+\x10\xde\xe9\x129/]]]+\x12933]\x11310\x012\x1e\x02\x15\x14\x0e\x02#\".\x02'\x11\x1e\x0332654&#\"\x0e\x02\a'\x13!\x11!\x03>\x01\x02V^\xa2xDJ\x90\u054a7lcY$#\\cd-\x86\x8c\x89\x8f\x1a;94\x13{7\x03\x04\xfe\b\x18 U\x03\xa6:p\xa7lw\xbd\x83F\n\x13\x1e\x14\x01\v\x14#\x19\x0foylq\x06\n\v\x06B\x02\xe9\xfe\xfa\xfe\xe1\a\x0e\x00\x00\x00\x02\x00L\xff\xec\x04+\x05\xc7\x00)\x00;\x00M@/\x05\"\x01\n(\x01\n\x03\x01!\r\x01\r\r7/n =\x157nP\x00`\x00\x02\x002u\x15\x02\x1b\x12\x1b\x02\x1b\x1b\a*t%\x19\x10u\a\a\x00?\xe9?\xe9\x129/]3\xe9\x01/]\xe92\x10\xde\xe9\x129/]10]]]\x134>\x0432\x1e\x02\x17\x15.\x01#\"\x0e\x02\a3>\x0332\x1e\x02\x15\x14\x0e\x02#\".\x02\x052>\x0254&#\"\x0e\x02\x15\x14\x1e\x02L\x17;e\x9b\u0651\x15230\x13&U+\x87\xaef+\x05\f\x149L_;_\x98i8C|\xb0nl\xbc\x8bO\x01\xfc)C1\x1bY[.L6\x1d\x193K\x02mi\u043f\xa4yE\x02\x03\x06\x04\xf7\t\vCx\xa8f$?-\x1a>v\xacow\xbc\x83EM\x9e\xf1\xe5\x1f?`Bk{$:H%3eQ2\x00\x00\x00\x01\x007\x00\x00\x04'\x05\xb4\x00\x06\x00-@\x1a\v\x01\x01\x01\x04\b\u007f\x02\x8f\x02\x9f\x02\x03\x02\x04\x06\x01\x06\x00\x05\x02s\x03\x06\x00\x18\x00??\xe99\x01/3]/]\x10\xce2]103\x01!\x11!\x15\x01\xcf\x02\b\xfd`\x03\xf0\xfd\xeb\x04\xb0\x01\x04\xc2\xfb\x0e\x00\x00\x00\x03\x00H\xff\xec\x04!\x05\xc9\x00'\x00:\x00N\x00\x9c@j\x05\x11\x01\n\x17\x01\x05\x03\x01\n%\x01\b\x1e\x01\a\n\x01\n\x1e#\bJ\x01Jn\xfc\x05\x01\xe9\x05\x01\xc6\x05\xd6\x05\x02\x05\x05\b0\x010n\x0fP\a@\x01@n\xe2#\xf2#\x02\xc9#\xd9#\x02##\a(\x01(nP\x19`\x19\x02\x19\x1e\n\n6\x016\xebE\xfbE\x024EDEdE\x03\aE\x01EE\x00-v\x14\x19;v\x00\a\x00?\xe9?\xe9\x119/]]]\xc9]99\x01/]\xe9]3/]]\xe9]\x10\xde\xe9]3/]]]\xe9]\x1299]]10]]]]\x012\x1e\x02\x15\x14\x0e\x02\a\x1e\x03\x15\x14\x0e\x02#\".\x0254>\x027.\x0354>\x02\x03\x14\x1e\x0232654.\x02/\x01\x0e\x03\x13\"\x0e\x02\x15\x14\x1e\x02\x17>\x0354.\x02\x025[\xa2zH(F`8:oV4H\x82\xb5mv\xb8~A,Lf:1V?%I|\xa2v\x1a3L2ih#7F#\x16,H3\x1c\xcd!9)\x18\x19+9 \x1f8+\x1a\x18*:\x05\xc9,X\x84YBkWD\x1c\x1fL_vI[\x94h86d\x92[Kx`J\x1c\x1fIYlAW\x83Y,\xfb\xbc(C0\x1bcQ*C90\x16\x0e\x163=H\x038\x14&8#*=/%\x12\x10&1>(#8&\x14\x00\x00\x02\x00?\xff\xec\x04\x1f\x05\xc7\x00)\x00;\x00G@*\n\"\x01\x05(\x01\x05\x03\x01'\r\x01\r\r \x157n\x00=/n 2u\x1d\x1b\x01\x06\x1b\x01\x1b\x1b\a*t%\a\x10u\a\x19\x00?\xe9?\xe9\x119/]]\xe9\x01/\xe9\x10\xde\xe92\x119/]10]]]\x01\x14\x0e\x04#\".\x02'5\x1e\x0132>\x027#\x0e\x03#\".\x0254>\x0232\x1e\x02%\"\x0e\x02\x15\x14\x1632>\x0254.\x02\x04\x1f\x17;e\x9b\u0652\x15230\x12%U,\x87\xaef+\x05\r\x148L`;_\x98i8C|\xb1nl\xbc\x8aP\xfe\x04)D1\x1bZ[.L6\x1d\x193K\x03Fi\u047e\xa5xE\x02\x03\x05\x04\xf8\n\vCy\xa8e$>.\x1a>v\xacow\xbc\x83FM\x9e\xf2\xe5\x1e?aBj|$:H%3eQ2\x00\x00\x00\x00\x02\x00u\xff\xe5\x01\xd3\x04s\x00\x13\x00'\x000@\x1f\xb0)\xe0)\xf0)\x03/)?)\x02\x1e\n\x96\x14\x00\x00\x10\x00`\x00\x03\x00#\x9b\x19\x10\x05\x9b\x0f\x00/\xed?\xed\x01/]3\xed2]]1074>\x0232\x1e\x02\x15\x14\x0e\x02#\".\x02\x114>\x0232\x1e\x02\x15\x14\x0e\x02#\".\x02u\x1b0@%#?0\x1c\x1c0?#%@0\x1b\x1b0@%#?0\x1c\x1c0?#%@0\x1b\x8f/A(\x12\x12(A/-@*\x13\x13*@\x03g/A(\x12\x12(A/-A)\x13\x13)A\x00\x00\x00\x02\x00?\xfe\xf8\x01\xd3\x04s\x00\f\x00 \x00k@P\xab\f\xbb\f\x02<\fL\f\x02y\f\x89\f\x99\f\x03\n\f\x1a\f*\f\x03\f\x01\xa0\"\xb0\"\xe0\"\xf0\"\x04/\"?\"\x02\x17\x96\x00\r\x10\r`\r\x03\r\x01\x97&\x066\x06F\x06\x03\x06/\a?\aO\a\x03\a\x1c\x9b\x12\x10\x06\x9c\f@\t\fH\f\x00/+\xed?\xed\x01/]3]\xed/]\xed]]\x113]]]]10%\x17\x0e\x03\a#>\x037\x034>\x0232\x1e\x02\x15\x14\x0e\x02#\".\x02\x01\xbc\x0f\x0e'/3\x19\xdc\x0f\x1d\x1b\x16\b/\x1b0@%#?0\x1c\x1c0?#%@0\x1b\xee\x176z|{8=\x84\x83}5\x02\xdb/A(\x12\x12(A/-A)\x13\x13)A\x00\x01\x00X\x00\xcb\x04\x10\x05\x00\x00\x06\x00`@A4\x05D\x05d\x05t\x05\x04\x06\x05\x16\x05\x02\x03\x00\b\x01\x02\x01\x05\x05\x035\x06E\x06\x02\x16\x06&\x06\x02\x06/\x00O\x00\x02\x00:\x04J\x04\x02\x19\x04)\x04\x02\x00\x04\x00\x03\x01 \x030\x03@\x03\xb0\x03\x04\x03\x00/]q33]]/]2]]\x129=/33\x01\x18/\x10\xce210]]%\x015\x01\x15\t\x01\x04\x10\xfcH\x03\xb8\xfd}\x02\x83\xcb\x01\xb6\x8f\x01\xf0\xf0\xfe\xc3\xfe\xe7\x00\x00\x00\x02\x00X\x01\xa2\x04\x10\x04\x00\x00\x03\x00\a\x002@\x1e\a\x02\t\x04\x00I\x04\x01\x04\xad\x90\x05\x01\x05\x05I\x00\x01\x00\xad \x01@\x01\x80\x01\xe0\x01\x04\x01\x00/]\xe9]3/]\xe9]\x01/3\x10\xce210\x135!\x15\x015!\x15X\x03\xb8\xfcH\x03\xb8\x03'\xd9\xd9\xfe{\xdb\xdb\x00\x00\x00\x00\x01\x00X\x00\xcb\x04\x10\x05\x00\x00\x06\x00`@A;\x01K\x01k\x01{\x01\x04\t\x01\x19\x01\x02\x05\b\x03\x06\x05\x04\x01\x01\x035\x00E\x00\x02\x16\x00&\x00\x02\x00/\x06O\x06\x02\x06:\x02J\x02\x02\x19\x02)\x02\x02\x06\x02\x00\x03\x01 \x030\x03@\x03\xb0\x03\x04\x03\x00/]q33]]/]3]]\x129=/33\x01\x18/3\x10\xce10]]\x13\t\x015\x01\x15\x01X\x02\x83\xfd}\x03\xb8\xfcH\x01\xba\x01\x19\x01=\xf0\xfe\x10\x8f\xfeJ\x00\x00\x00\x02\x00\x19\xff\xe5\x03u\x05\xcb\x00'\x00;\x008@\x1e\x03\x1a\x13\x1a\x022\x96(('\x00\x00\x12\vH\x1c=\x12\v\x17\x00-\x9b7\x16\x11\x0eM\x17\x04\x00?\xe93?\xfd\xce\x119\x01/\x10\xde\xe9\x119/\xc93/\xed10]\x0154>\x027>\x0354&#\"\x06\a'>\x0332\x1e\x02\x15\x14\x0e\x02\a\x0e\x03\x1d\x01\x014>\x0232\x1e\x02\x15\x14\x0e\x02#\".\x02\x01\b\x15+D0*:$\x10MOE\x9fUf+emp6f\xa4r=\x1c7S7*5\x1e\v\xfe\xd7\x1b0A%#?0\x1c\x1c0?#%A0\x1b\x01\xe5J3SKG&!438%9J:*\xdd\x19-#\x141^\x86V?cUO,!1,/ <\xfe\xaa/A(\x12\x12(A/-@*\x13\x13*@\x00\x02\x00f\xfff\x06\x89\x05\xc9\x00U\x00f\x00U@,V_\x15\x01\x15\x15J-BB-\x00_\n@#\x01##7\x00h7J(Y\x05?\x10O\x10\x02\x10\x10E2Qb\x1a\x1aQ\x04<E\x00/\xc9?9/\xc9\x10\xc9\x119/]3\xc92\x01/\xc1\x10\xce\x119/]3\xc9\x10\xd9\xc0/\x11\x129/]\xc110\x01\x14\x0e\x02#\".\x02'#\x0e\x03#\".\x0254>\x0232\x1e\x02\x17\x03\x06\x14\x15\x14\x1e\x0232>\x0254.\x02#\"\x0e\x02\x15\x14\x1e\x0232>\x027\x15\x0e\x01#\"$&\x0254>\x0432\x04\x16\x12\x01\x14\x1632>\x02?\x01.\x01#\"\x0e\x02\x06\x89-\\\x8b^&C8)\v\x0f\x132>K,S\x81X.>t\xa6g-`YN\x1c\x15\x02\r\x15\x1b\x0f#4\"\x12L\x87\xbam\x99\xe9\x9dQF\x8a\u02848vuq3^\u50b5\xfe\xe3\xc4h6f\x93\xbc\u205e\x01\n\xc1l\xfc>L?*='\x15\x03\f\x146\x1c;R3\x17\x02\xf0_\xba\x93[\x13#/\x1c\x19/$\x159i\x93Yg\xac}E\n\x10\x14\n\xfe]\x16*\x06*6\x1f\f6\\{E\x80\u020aHf\xb7\xfa\x95\x8a\u0551K\x0e\x18\"\x14\xc0*1g\xc2\x01\x19\xb2|\xe3\u00dfq=e\xbd\xfe\xf2\xfe\xdapc'Gc=\xdd\x05\x062Ri\x00\x00\x00\x02\x00\x00\x00\x00\x053\x05\xbc\x00\a\x00\x16\x00\x8d@\f\x06\x06&\x066\x06F\x06v\x06\x05\x06\xb8\xff\xf0@?\x15\x18H\t\x05)\x059\x05I\x05y\x05\x05\x05\x10\x15\x18H\x02\x16\x03\b\x01\x00\x06\x05\x0e\x0e\x04\t\x00\x19\x00\x02\x00\x00\a`\ap\a\x90\a\x04\a\x10\a\a\x18\u007f\x18\x01\x10\x18\x01\x06\x03\x16\x03\x02\x03\x04\xb8\xff\xf0@\x0e\x04\x02_\x16\x16\x1b\x0e\x01\x0e\x05\x03\x04\x00\x12\x00?2?3]9/\xe9\x01/83]]]\x113/8]3]\x129\x1133\x1299\x129910+]+]!\x03!\x03!\x01!\t\x01\x03.\x03'\x0e\x05\a\x03\x03\xfad\xfe\be\xfe\xc7\x01\xdb\x01{\x01\xdd\xfe\x1b^\x06\x18\x1b\x18\x05\x04\r\x11\x12\x10\r\x03]\x01\\\xfe\xa4\x05\xbc\xfaD\x02`\x01@\x12Rcd#\x16<CD<.\v\xfe\xc0\x00\x00\x00\x03\x00\xb8\x00\x00\x04\xb6\x05\xb6\x00\x17\x00\"\x00/\x00v@L\x06\x13\x01&\x04\x01\x05\x04\x01&\v\x01\v$\x19\x1e\x01\x1eZ\x06\x06\x19*\x01*Z\x11g1\x1f1\x01\x18$Z\x17d0\v#`\xbb\x18\x01\xa9\x18\x01\x88\x18\x01g\x18\x01L\x18\x01;\x18\x01\x19\x18\x01\b\x18\x01\x18\x18\x00$_\x16\x12\"_\x00\x03\x00?\xe9?\xe9\x129/]]]]]]]]\xe99\x01\x10\xf6\xe92]\x10\xf6\xe9]3/\xe9]\x129]10]]]\x13!2\x1e\x02\x15\x14\x0e\x02\a\x15\x1e\x03\x15\x14\x0e\x02#!\x0132>\x0254&+\x01\x19\x0132>\x0254.\x02#\xb8\x01\xac\x8a\u040cG\x1e:S67_G)F\x83\xbbv\xfd\xfc\x016\xa1:N0\x15ir\x93\xb6=S3\x16\x165V@\x05\xb6'W\x8dg>lR7\t\n\f-OxVd\x9dm:\x03s\x15*?*TI\xfd\xc5\xfe\x83\x1c4J-)C0\x1a\x00\x00\x00\x00\x01\x00w\xff\xec\x04\xd1\x05\xcb\x00#\x00B@+e\r\x01\n!\x1a!Z!j!\xba!\x05 \x0eg%\xb0%\x01\x9f%\x01`%\x01\x1f%\x01\x05[\x18f$\x00_\x1d\x04\n_\x13\x13\x00?\xe9?\xe9\x01\x10\xf6\xe9]]]]\x10\xe6210\x00]]\x01\"\x0e\x02\x15\x14\x1e\x023267\x11\x0e\x03#\".\x01\x0254\x126$32\x16\x17\a.\x01\x03%Y\x89]0+Y\x8b`Y\xb3i0^bg;\xa9\xf8\xa2NZ\xae\x01\x00\xa6m\xdbddR\xa6\x04\xc9E\x81\xb9su\xb6}A(%\xfe\xfc\x14\x1c\x12\tl\xc4\x01\x14\xa9\xa6\x01\x15\xc8o70\xfc':\x00\x00\x00\x02\x00\xb8\x00\x00\x05#\x05\xb6\x00\f\x00\x17\x00&@\x15\rZ\x00g\x19?\x19\x01\x14Z\x06d\x18\x13_\a\x03\x14_\x05\x12\x00?\xe9?\xe9\x01\x10\xf6\xe9]\x10\xf6\xe910\x01\x14\x02\x06\x04#!\x11!2\x04\x16\x12\x054.\x02+\x01\x11326\x05#e\xbf\xfe\xeb\xb1\xfe\u007f\x01\xac\xa1\x01\x03\xb8c\xfe\xc61]\x87W\x8fr\xc4\xc5\x02\xe9\xb9\xfe\xe9\xbb^\x05\xb6\\\xb5\xfe\xf4\xb8z\xb1t8\xfcH\xf0\x00\x01\x00\xb8\x00\x00\x04\x02\x05\xb6\x00\v\x00F@*\b\x04\x00g\r\x06\nZ\x01d\f\t_\xaf\x06\x01\x88\x06\x01L\x06\x01;\x06\x01\x19\x06\x01\b\x06\x01\x06\x06\n\x05_\x02\x03\n_\x00\x12\x00?\xe9?\xe9\x129/]]]]]]\xe9\x01\x10\xf6\xe92\x10\xe62210)\x01\x11!\x15!\x11!\x15!\x11!\x04\x02\xfc\xb6\x03J\xfd\xec\x01\xef\xfe\x11\x02\x14\x05\xb6\xfe\xfe\xbf\xfe\xfe\x87\x00\x00\x00\x01\x00\xb8\x00\x00\x03\xfe\x05\xb6\x00\t\x00W@:\b\x9f\x03\x01\x03g\v\x1f\v\x8f\v\xaf\v\x03\x06\x00\\\x01d\n\t_\x9f\x06\xaf\x06\xbf\x06\xdf\x06\x04\x88\x06\x01o\x06\x01L\x06\x01;\x06\x01\x19\x06\x01\b\x06\x01\x06\x06\x00\x05_\x02\x03\x00\x12\x00??\xe9\x129/]]]]]]]\xe9\x01\x10\xf6\xe92]\x10\xe6]210)\x01\x11!\x15!\x11!\x15!\x01\xe9\xfe\xcf\x03F\xfd\xeb\x01\xf0\xfe\x10\x05\xb6\xfe\xfe\x87\xfd\x00\x00\x00\x00\x01\x00w\xff\xec\x05'\x05\xcb\x00'\x00D@(''\f%\\\x14\x90\x01\x01\x01)`)p)\x02\x1f)\x01\x1d[\ff('_+\x00\x01\x00\x00\"\x18_\x11\x04\"_\a\x13\x00?\xe9?\xe9\x129/]\xe9\x01\x10\xf6\xe9]]\x10\xde]2\xe9\x129/10\x01!\x11\x0e\x03#\".\x01\x0254\x126$32\x16\x17\a.\x01#\"\x0e\x02\x15\x14\x1e\x023267\x11!\x02\xe3\x02D:v\u007f\x8bN\xa4\xfd\xadZd\xc3\x01\x1d\xb8u\xe0]gD\xab^f\xa3t>+\\\x91eB[(\xfe\xeb\x035\xfd\n\x13\x1f\x15\fa\xbf\x01\x19\xb8\xac\x01\x16\xc3i2(\xf8\".G\x82\xb8ql\xb3\x82H\f\b\x011\x00\x00\x01\x00\xb8\x00\x00\x05\x14\x05\xb6\x00\v\x00G@+\t\x01Z\x00e\r\x8f\r\x01\x00\r\x01\b\x04Z\x05d\f\x03_\x88\b\x01L\b\x01;\b\x01\x19\b\x01\b\b\x01\b\b\n\x06\x03\x05\x00\x12\x00?2?39/]]]]]\xe9\x01\x10\xf6\xe92]]\x10\xf6\xe9210)\x01\x11!\x11!\x11!\x11!\x11!\x05\x14\xfe\xcb\xfe\x0f\xfe\xca\x016\x01\xf1\x015\x02w\xfd\x89\x05\xb6\xfd\xc3\x02=\x00\x00\x00\x00\x01\x00B\x00\x00\x02\xdb\x05\xb6\x00\v\x00;@#\x9f\r\xff\r\x02\r@\r\x10H0\r\x01\b\v\v\nZ\x05\x02\x02\xc0\x03\x01\x03\t\x04_\x06\x03\n\x03_\x00\x12\x00?\xe92?\xe92\x01/]3\x113\xe92\x113]+]10)\x0157\x11'5!\x15\a\x11\x17\x02\xdb\xfdg\xb2\xb2\x02\x99\xb2\xb2\xb0R\x03\xb2R\xb0\xb0R\xfcNR\x00\x00\x00\x01\xff9\xfeR\x01\xee\x05\xb6\x00\x13\x004@#\x06\x11\x16\x11\x02\x04\x04\fZ\x0fe\x15\x1f\x15o\x15\u007f\x15\x8f\x15\xaf\x15\x05\r\x03\a\a\x17\a'\a\x03\a_\x00\x00/\xe9]?\x01]\x10\xf6\xe12/10]\x03\"&'\x11\x1e\x0132>\x025\x11!\x11\x14\x0e\x02\x02Ab\"%Q0.O;!\x016I\x83\xb6\xfeR\r\t\x01\x02\b\f\x141R>\x05\x8b\xfa\u007f~\xb6w8\x00\x01\x00\xb8\x00\x00\x05\x12\x05\xb6\x00\f\x00r@N9\x02y\x02\x02\x1d\x03\x01\t\n\x19\nI\nY\n\x04\t\x01\x19\x019\x01I\x01Y\x01y\x01\x06\n\v\v\x01d\x00\x01\x00\x00\x01\x00\x10\x00\x00\x0ei\x02\x01\x05\f\x15\fE\fU\f\x04\x02\b\f\x03\x04Z\x05d\r$\b\x01\x02\b\x01\n\x06\x03\x05\x01\x12\x00?3?3\x1299]\x01\x10\xf6\xe9\x172]]\x113/8]]33\x11310]]\x00]])\x01\x01\a\x11!\x11!\x117\x01!\x01\x05\x12\xfe\xa0\xfe\xb0t\xfe\xca\x016z\x01N\x01X\xfe-\x02`V\xfd\xf6\x05\xb6\xfd@\xcf\x01\xf1\xfdm\x00\x00\x00\x00\x01\x00\xb8\x00\x00\x04\x02\x05\xb6\x00\x05\x00)@\x19/\x04?\x04\x8f\x04\xaf\x04\x04\x04\a\x1f\a\x01\x03Z\x00d\x06\x01\x03\x03_\x00\x12\x00?\xe9?\x01\x10\xf6\xe9]\x10\xce]103\x11!\x11!\x11\xb8\x016\x02\x14\x05\xb6\xfbJ\xff\x00\x00\x01\x00\xb8\x00\x00\x06\x96\x05\xb6\x00\x1d\x00\x8d\xb5\x10\x18\t\rH\r\xb8\xff\xe0@Y\t\rHG\x1d\x016\x1d\x01\a\x1d\x17\x1d'\x1d\x03I\x00\x01;\x00\x01\t\x00\x19\x00)\x00\x03\x1b\x10\x88\x13\xa8\x13\xf8\x13\x03\x13\x10\n\rH\x13]\x1d\x00\x0e\x0e\v\x12e\x1fX\x02\xb8\x02\x02\x02\r6\nF\n\x02\a\n\x17\n'\n\x03\n^\vd\x1e\x1c\x02\x02\x10\f\x03\v\x0e\x13\x03\x00\x12\x00?\x172?33/3\x01\x10\xf6\xe9]]22]\x10\xf6\x119\x1133\xe9+]2210]]]]]]++!\x01#\x16\x17\x1e\x03\x15\x11!\x11!\x013\x01!\x11!\x114>\x02767#\x01\x03\x04\xfe\xbf\t\x06\x04\x02\x03\x03\x01\xfe\xeb\x01\xa6\x01<\x06\x01P\x01\xa6\xfe\xdf\x01\x02\x03\x01\x04\x03\b\xfe\xa6\x04{\\V%NLF\x1c\xfdX\x05\xb6\xfb\xa2\x04^\xfaJ\x02\xb4\x1aBJL$T[\xfb\x87\x00\x00\x00\x00\x01\x00\xb8\x00\x00\x05\x8b\x05\xb6\x00\x17\x00\x85@,\x01 \x0e\x18H9\x01I\x01\x02\v\x01\x1b\x01+\x01\x03\x0e\x01I\x16\x01\x16\b\t\fH\x16^\x17e\x19\x00\x19\x10\x19 \x19\xb0\x19\xf0\x19\x05\x19\xb8\xff\xc0\xb3\r\x10H\f\xb8\xff\xe0@\x15\x0e\x18H6\fF\f\x02\x04\f\x14\f$\f\x03\x03\fF\t\x01\t\xb8\xff\xf8@\x10\t\fH\t^\nd\x18\x16\x02\v\x03\x0e\n\x00\x12\x00?22?33\x01\x10\xf6\xe9+]22]]++]\x10\xf6\xe9+]22]]+10)\x01\x01#\x16\x17\x1e\x01\x15\x11!\x11!\x013&'.\x035\x11!\x05\x8b\xfew\xfd\xc1\t\x06\x04\x04\x05\xfe\xeb\x01\x87\x02>\x06\x03\x04\x01\x03\x02\x01\x01\x16\x04RMLA\x8f9\xfdP\x05\xb6\xfb\xb9LJ CC>\x19\x02\xb4\x00\x00\x00\x00\x02\x00w\xff\xec\x05\x96\x05\xcd\x00\x13\x00'\x00(@\x17\x1e[\x00g)/)?)\x02\x14[\nf(#_\x0f\x04\x19_\x05\x13\x00?\xe9?\xe9\x01\x10\xf6\xe9]\x10\xf6\xe910\x01\x14\x02\x0e\x01#\".\x01\x0254\x12>\x0132\x1e\x01\x12\x05\x14\x1e\x0232>\x0254.\x02#\"\x0e\x02\x05\x96O\xa2\xf7\xa8\xa8\xf7\xa1OO\xa2\xf7\xa9\xa8\xf6\xa1O\xfc (S~WY\u007fQ''Q~XW\x80S(\x02\u0769\xfe\xea\xc6ll\xc6\x01\x17\xaa\xaa\x01\x15\xc4kk\xc5\xfe\xeb\xabs\xb7\u007fDD\u007f\xb7ss\xb7\x80DD\x80\xb7\x00\x00\x00\x00\x02\x00\xb8\x00\x00\x04m\x05\xb6\x00\b\x00\x17\x00=@&\x06\x16\x01\x04Z\t\x19\x1f\x19?\x19_\x19\x8f\x19\xaf\x19\x05\x00\x10Z\x11d\x18\x00_\x00\x0f\x01\x0f\x0f\x10\b_\x12\x03\x10\x12\x00??\xe9\x119/]\xe9\x01\x10\xf6\xe92]\x10\xde\xe910]\x0132654&+\x01\x05\x14\x0e\x02+\x01\x11!\x11!2\x1e\x02\x01\xee=\x83\x85w\u007fO\x02\u007f:\x85\u0660G\xfe\xca\x01\x96\x8d\u0345@\x03\x06humh\xca`\xb0\x86P\xfd\xf8\x05\xb6?u\xa9\x00\x02\x00w\xfe\xa4\x05\xc1\x05\xcd\x00\x1b\x00/\x00W@8\x16\x05&\x056\x05\x03\x04\x05\x01\x05\b\x12&[\x00g1/1?1\x02\x1c[\x12f0;\aK\a[\a\x03)\a\x01\v\a\x01\a\x06\x10\x06\x05\r+_\x17\x04!_\r\x13\a\x00/?\xe9?\xe9\x129\x01/83]]]\x10\xf6\xe9]\x10\xf6\xe9\x1299]]10\x01\x14\x0e\x02\a\x01!\x01\"\a\x06\"#\".\x01\x0254\x12>\x0132\x1e\x01\x12\x05\x14\x1e\x0232>\x0254.\x02#\"\x0e\x02\x05\x96'OwQ\x01i\xfer\xfe\xf4\a\x06\x05\v\x04\xa8\xf7\xa1OO\xa2\xf7\xa9\xa8\xf6\xa1O\xfc (S~WY\u007fQ''Q~XW\x80S(\x02\xddw\u046c\x86,\xfem\x01J\x01\x01l\xc6\x01\x17\xaa\xaa\x01\x15\xc4kk\xc5\xfe\xeb\xabs\xb7\u007fDD\u007f\xb7ss\xb7\x80DD\x80\xb7\x00\x02\x00\xb8\x00\x00\x05\n\x05\xb6\x00\b\x00\x1e\x00~@P\t\x1e\x01\t\x1d\x01\x05\x0f\x01\x1e\x15\x1a\x04\x01\x04Z\x04\x15D\x15\x02\x15\x0f\x10\x01\x10\x10\x1d\x00\x1c\x01\x1c\x10\x1c\x1c \x1f \x01\x00\nZ\vd\x1f\x15\f\xbb\x00\x01\xa9\x00\x01\x88\x00\x01g\x00\x01L\x00\x01;\x00\x01\b\x00\x01\x00`\t\t\n\b_\f\x03\x1d\n\x12\x00?3?\xe9\x119/\xe9]]]]]]]\x129\x01\x10\xf6\xe92]\x113/8]39/]9]\xe9]\x11310]]]\x0132654&+\x01\x19\x01!\x11! \x04\x15\x14\x0e\x02\a\x16\x17\x1e\x02\x1f\x01!\x01\x01\xeeT\x81px~O\xfe\xca\x01\x90\x01\x19\x01\f(CW0oX&G8\x12\x11\xfe\xa8\xfe\xc3\x03-gdhX\xfdy\xfd\xcf\x05\xb6\xd9\xddKz_G\x18\xb2\x8c<rZ\x1b\x1c\x021\x00\x00\x00\x01\x00^\xff\xec\x03\xd9\x05\xcb\x009\x00I@-\n\x03\x1a\x03\x02\x05 \x15 \x02\x16\t\x01'\x13\\\x00g;\x1f;?;\x9f;\x030\\\t\x1df:0\x13\x05-_(\"\x04\x0e_\t\x05\x13\x00?3\xe9?3\xe9\x1299\x01\x10\xf62\xe9]\x10\xfe\xe93\x00]10]]\x01\x14\x0e\x02#\"&'\x11\x1e\x0332>\x0254.\x02'.\x0354>\x0232\x1e\x02\x17\a.\x03#\"\x06\x15\x14\x1e\x02\x17\x1e\x03\x03\xd9C\x81\xbbyj\xc5T0bee23I-\x15#?Y7.reDAx\xabj5ecd5d-NJG$NS\x197W>K~[2\x01\x96b\x9do<,,\x01 \x17+\"\x14\x17)9\")?74\x1d\x18De\x8fdb\x9bk8\x0e\x1a&\x19\xf1\x15 \x16\vSE%924!(Se\x80\x00\x00\x00\x01\x00)\x00\x00\x04;\x05\xb6\x00\a\x00>@'\xc0\t\xd0\t\x02o\t\x010\t@\t\x02\x0f\t\x01\x84\x06\x01\x06\x06\x00Z\x01\x03\x03@\x01\x90\x01\x02\x01\a\x03_\x04\x03\x00\x12\x00??\xe12\x01/]3/\x10\xe92/]]]]]10)\x01\x11!\x11!\x11!\x02\xcd\xfe\xcb\xfe\x91\x04\x12\xfe\x92\x04\xb4\x01\x02\xfe\xfe\x00\x01\x00\xae\xff\xec\x05\f\x05\xb6\x00\x17\x000@\x1c\t\b\x01\t\x04\x01\x16Z\x01e\x19\u007f\x19\x8f\x19\x02\x0eZ\vd\x18\x13_\x06\x13\f\x00\x03\x00?2?\xe1\x01\x10\xf6\xe9]\x10\xf6\xe910\x00]]\x01\x11\x14\x0e\x02#\".\x025\x11!\x11\x14\x1e\x023265\x11\x05\fE\x8d\u050f\x87\u03cbH\x015 ?^?\x83u\x05\xb6\xfcNr\u0110RM\x8e\xc7z\x03\xae\xfciQsI\"\x98\x99\x03\x95\x00\x00\x00\x00\x01\x00\x00\x00\x00\x04\xe1\x05\xb6\x00\x10\x00X@+\t\x03\x01\x06\x02\x01\x03\x02\v\v\x04\t\x00\x19\x00\x02\x00\x00\x01`\x01p\x01\x90\x01\x04\x01\x10\x01\x01\x12\x0f\x12o\x12\x02\x06\x05\x16\x05\x02\x05\x04\xb8\xff\xf0@\n\x04\x14\v\x01\v\x02\x12\x04\x00\x03\x00?2?3]\x01/83]]\x113/8]3]\x129\x113310]]\x01!\x01!\x01!\x13\x1e\x03\x17>\x037\x03\xa8\x019\xfe8\xfe\xae\xfe9\x019\xf8\x05\x11\x13\x12\x05\x05\x12\x14\x13\x05\x05\xb6\xfaJ\x05\xb6\xfc\x90\x11P``!!`_P\x12\x00\x01\x00\x00\x00\x00\aj\x05\xb6\x006\x01&@m\t5)595I5\x04f%v%\x02'%\x01\x06%\x01i$y$\x02($\x01\t$\x01\x06\x14&\x146\x14F\x14\x04k\x12{\x12\x8b\x12\x03\x12\x10\n\x0eH\v\x12\x01d\x11t\x11\x84\x11\x036\x11F\x11V\x11\x03%\x11\x01\x16\x11\x01\x05\x11\x01k\x01{\x01\x8b\x01\x039\x01I\x01Y\x01\x03*\x01\x01\x19\x01\x01\n\x01\x01d\x00t\x00\x84\x00\x03\x00\xb8\xff\xf0@>\n\x0eH\x04\x00\x01\x01\x00-V%\x86%\x02\x17%\x01%Y$\x89$\x02\x18$\x01$\t\x12\x11\x1c\x1c\t-\x03\x13\x195\x015\x006`6p6\x906\x046\x10668\x0f8\x01\x16\x14\x01\x14\x13\xb8\xff\xf0@&\x135$\x8f\t\x01{\t\x01,\t<\tL\t\x03\x1b\t\x01\n\t\x01\t\x13\x03-\x1c\x14\x1c\x01\x06\x1c\x01\x1c\x12\x12\x00\x12\x00?2\x113]]\x113?3]]]]]33\x01/83]]\x113/8]3]\x12\x179\x1133\x113]]3]]\x113310]+]]]]]]]]]]]]+]]]]]]]]])\x01\x03.\x05'\x0e\x05\a\x03!\x01!\x13\x1e\x05\x17>\x057\x13!\x13\x1e\x05\x17>\x057\x13!\x06\n\xfe\xa0\xb4\x04\v\x0e\x0e\f\t\x02\x02\t\f\r\r\f\x04\xb2\xfe\x9f\xfe\xa0\x011\xa6\x03\v\x0e\x0f\x0e\f\x03\x03\v\f\x0f\f\v\x03\xcb\x01\x10\xcb\x03\v\r\x0e\r\v\x03\x03\v\x0e\x0f\x0e\v\x03\xa6\x011\x02\xd1\x0f6DJF;\x12\x12;EJD8\x10\xfd1\x05\xb6\xfc\xe2\x10=LTPE\x16\x16DMRG7\f\x033\xfc\xcd\f7GRMD\x16\x16EPTL=\x10\x03\x1e\x00\x00\x00\x00\x01\x00\x00\x00\x00\x05\x04\x05\xb6\x00\v\x00|@8\t\t\x19\t\x02\t\n\n\x00\v\b\x05\x02\x02\x04\t\x01\x19\x01\x02\x01\x00\x00`\x00p\x00\x90\x00\x04\x00\x10\x00\x00\r\x80\r\x01o\r\x01\x06\a\x16\a\x02\a\x06\x06\x06\x03\x16\x03\x02\x03\x04\xb8\xff\xf0@\x14\x04\x04\b\x14\b\x02\v\x02\x1b\x02\x02\b\x02\x01\t\x06\x03\x03\x01\x12\x00?3?3\x1299]]\x01/83]3\x113]]]\x113/8]3]\x129\x11333\x113\x113]10)\x01\t\x01!\t\x01!\t\x01!\x01\x05\x04\xfe\x9e\xfe\xd5\xfe\xd5\xfe\xb4\x01\xbc\xfec\x01V\x01\x12\x01\f\x01N\xfe^\x02)\xfd\xd7\x02\xf2\x02\xc4\xfd\xf2\x02\x0e\xfd+\x00\x01\x00\x00\x00\x00\x04\xac\x05\xb6\x00\b\x00q@\x16\x05\b\x01\n\x01\x01\xcf\n\x010\n\xb0\n\x02\x0f\n\x01\b?\a\x01\a\xb8\xff\xf0@\x1f\a\a\x05\x01\xeb\x02\x01\x8d\x02\x01d\x02t\x02\x02\x19\x02\x01\x02\x10\x02\x02\x00\x04Z0\x05\x01\x05\x03\x00\xb8\xff\xe8@\f\t\x11H\x00\x06\x06\x01\x04\x12\b\x01\x03\x00?3?\x129/3+3\x01/]\xe992/8]]]]3\x113/8]3]]]10]]\t\x01!\x01\x11!\x11\x01!\x02V\x01\b\x01N\xfeD\xfe\xcc\xfeD\x01P\x03\\\x02Z\xfc\x83\xfd\xc7\x02/\x03\x87\x00\x00\x00\x01\x001\x00\x00\x04\x1f\x05\xb6\x00\t\x00t@1i\x03\x01\x03\x10\x13\x18H\v\x03\x01\x03\a\a\x00\t@\t`\tp\t\x90\t\xa0\t\xb0\t\a\t\t\v\xaf\v\xcf\v\xef\v\x03P\v\x01O\v\x01f\b\x01\b\xb8\xff\xf0@\x1c\x13\x18H\x04\b\x01\b\x04O\x02\xaf\x02\xbf\x02\x03\x02\x02\n\a\x04_\x05\x03\x02\b_\x01\x12\x00?\xe92?\xe92\x11\x013/]33]+]]]]\x113/]3\x113]+]10)\x015\x01!\x11!\x15\x01!\x04\x1f\xfc\x12\x02k\xfd\xa8\x03\xc8\xfd\x96\x02}\xc9\x03\xed\x01\x00\xc8\xfc\x12\x00\x00\x00\x01\x00\x8f\xfe\xbc\x02s\x05\xb6\x00\a\x00\"@\x13\x04\x00\xf2\x06\xf0\x00\x01\x10\x01\x02\x01\x05\xf7\x02\xf8\x06\xf7\x01\xf9\x00?\xe1?\xe1\x01/]\xe9\xed210\x01!\x11!\x15#\x113\x02s\xfe\x1c\x01\xe4\xe0\xe0\xfe\xbc\x06\xfa\xd3\xfa\xac\x00\x00\x01\x00\f\x00\x00\x03B\x05\xb6\x00\x03\x00(@\x0e\x06\x00\x01\t\x02\x01\x02\x01\x10\x01\x01\x05\x00\x03\xb8\xff\xf0\xb3\x03\x01\x00\x03\x00?/\x01/83\x113/8310]]\t\x01!\x01\x01!\x02!\xfe\xeb\xfd\xdf\x05\xb6\xfaJ\x05\xb6\x00\x01\x003\xfe\xbc\x02\x17\x05\xb6\x00\a\x00 @\x10\x03\x00\xf2\x01\xf0\x06\x06\t\x00\xf7\a\xf9\x03\xf7\x04\xf8\x00?\xe9?\xe9\x11\x013/\xe9\xed210\x173\x11#5!\x11!3\xdf\xdf\x01\xe4\xfe\x1cq\x05T\xd3\xf9\x06\x00\x00\x01\x00\b\x02\b\x04=\x05\xbe\x00\b\x007@\x1e+\x05\x01\x05\b\x15\b\x02\t\x04\x19\x04\x02\t\x01\x01\x02\x01\x05\x05\x04\x03\x03\n\b\x00\x00\x00\x01\x03\x00?3/\x01/2\x113/39=/3310]]]\x00]\x13\x013\x01#\x01\x06\x02\a\b\x01\xb6\x90\x01\xef\xef\xfe\xbeE\x8fD\x02\b\x03\xb6\xfcJ\x02\x83\xa1\xfe\xba\x9c\x00\x00\x00\x01\xff\xfc\xfe\xbc\x03N\xffH\x00\x03\x00\x12\xb6\x00\x00\x05\x01\x01\xb9\x02\x00/\xe9\x01/\x113/10\x01!5!\x03N\xfc\xae\x03R\xfe\xbc\x8c\x00\x00\x00\x00\x01\x01L\x04\xd9\x03P\x06!\x00\r\x00*@\x19E\a\x01\x03\a\x01\f\f\a\x06\x0f\a_\ao\a\x03\a\a\x0f\x00_\x00\x02\x00\x00/]2/]\x01/33/]]10\x01.\x03'5!\x1e\x03\x17\x15\x02\x85\"_\\L\x10\x01V\x10+.0\x15\x04\xd9\x1cSXQ\x1b\x15\"QQL\x1d\x1b\x00\x00\x00\x02\x00V\xff\xec\x03\xfe\x04u\x00\x1f\x00.\x00a@>\x05\x1d\x15\x1d\x02\n\r\x1a\r\x02\n\n\x1a\n\x02@\x18\x01\x18\x18\f\x10\x02.F\x1eU0O0\xbf0\x0200\x01&G0\f\x01\f Q\x10\x10\a:\x17\x01\x17\x14N\x1b\x10\x02)N\a\x16\x00\x15\x00??\xe92?\xe13]\x129/\xe9\x01/]\xe9]]\x10\xf6\xe922\x119/]10]]]!'#\x0e\x03#\".\x02546?\x0154&#\"\x06\a'>\x0132\x16\x15\x11\x01\a\x0e\x03\x15\x14\x1632>\x025\x03);\t!BNa@DtU0\xe4\xe3\xb2PHH\x89EcT\xccp\xd1\xdf\xfe\xd1e=T3\x17D7*H5\x1e\x98-A*\x14+W\x85[\xb2\xa9\t\x06TEB*#\xca/6\xc4\xc8\xfd\x17\x02\x06\x04\x02\x1c/A(F;\x1d9S6\x00\x00\x00\x00\x02\x00\xa0\xff\xec\x04w\x06\x14\x00\x1f\x000\x008@ \x05\a\x01\x05\x03\x01.G\x05W2\x15\x0f&F\x12T1\x13\x00\x12\x15+M\x10\n\x16\x1b M\x00\x10\x00?\xe92?3\xe9??\x01\x10\xf6\xe922\x10\xf6\xe910]]\x012\x1e\x02\x15\x14\x0e\x02#\".\x02'#\a#\x11!\x11\x14\x06\a\x06\a3>\x03\a\"\x0e\x02\a\x15\x14\x1e\x0232654&\x02\xf4V\x8ef99h\x92X8WD3\x15\x153\xe9\x011\x04\x02\x03\x03\f\x156GZ03G,\x14\x02\x13,I6[UU\x04sJ\x92\u060e\x90\u0652J\x18(3\x1c{\x06\x14\xfe\x96!M!''#<-\x1a\xf4%JqK!Q~U,\xad\xa5\xa5\xa5\x00\x00\x00\x01\x00f\xff\xec\x03\xbc\x04s\x00\x1f\x00<@&\n\a\x01\n\x03\x01\r\x00\x1b\x10\x1b\x02\x1b\x1b!\xb0!\x01/!O!o!\x03\x14G\x05V \x11M\n\x10\x17M\x00\x16\x00?\xe9?\xe9\x01\x10\xf6\xe9]]\x113/]310]]\x05\".\x0254>\x0232\x16\x17\a.\x01#\"\x06\x15\x14\x163267\x15\x0e\x03\x02qx\xc1\x89IK\x89\xc1vV\xaaKXBz7oddkW\x8eJ%FGM\x14B\x8b\u0657\xa7\xe1\x88:*&\xe8\x1d%\xa9\xa9\xa8\xa0-#\xfe\x12\x1c\x12\t\x00\x00\x02\x00f\xff\xec\x04=\x06\x14\x00\x1f\x000\x008@ \n\a\x01\n\x03\x01\x1a\x15%H\x17U2.G\x05V1\x19\x15\x16\x00\x0f+M\n\x10\x1b M\x00\x16\x00?\xe92?\xe92??\x01\x10\xf6\xe9\x10\xf6\xe92210]]\x05\".\x0254>\x0232\x1e\x02\x173&'.\x015\x11!\x11#'#\x0e\x0372>\x02754.\x02#\"\x06\x15\x14\x16\x01\xe9V\x8ef99i\x92X6ZH9\x16\n\x06\x05\x05\a\x011\xe9;\r\x156GY76L/\x17\x01\x14.N;`Z[\x14J\x91\u060e\x90\u0653J\x19-;#'(\"M!\x01f\xf9\xec\x91\"=,\x1a\xf3%KpK!Q~U,\xad\xa5\xa5\xa5\x00\x00\x00\x00\x02\x00f\xff\xec\x04D\x04s\x00\b\x00)\x00e@A\n\x10\x01\n\f\x01\x8f%\x01%%\x1a\t\x04\x01\x04H\x18W+\xcf+\x010+\x01\x03\a\x1a\x01\x1aF\x0eV*9\x1aI\x1a\x02(\x1a\x01\x1aP\xd9\x03\x01\xc8\x03\x01|\x03\x01\x03\x03\x1f\x00O\x13\x10\x1fN\t\x16\x00?\xe9?\xe9\x129/]]]\xe9]]\x01\x10\xf6\xe9]2]]\x10\xf6\xe9]\x129/]10]]\x01\"\x06\a!.\x03\x03\".\x0254>\x0232\x1e\x02\x1d\x01!\x1e\x0332>\x027\x15\x0e\x03\x02dQk\b\x01\x85\x01\x180H\tx\u0292QJ\x85\xbbro\xb3}C\xfdV\x02%C_=3[VT,(QZh\x03\x9arz3V?$\xfcRF\x8d\u05d1\x93\u0713JC\x82\xbdz\x94@gG&\v\x16!\x16\xec\x15\x1d\x14\t\x00\x00\x00\x00\x01\x00)\x00\x00\x03H\x06\x1f\x00\x19\x00J@,\n\x18\t\x0eH\x00\x00\x10\x10\x1b/\x1b\xaf\x1b\x02\x10\x1b\x01\x18\x02F\x03\a\x03\x05\x05\x00\x03\x10\x03\x02\x03\x01\x05N\a\x18\x0f\x14M\r\x01\x02\x15\x00??\xe9?3\xe12\x01/]3/\x113\x10\xe92]]\x113/9/10+\x01#\x11!\x11#5754>\x0232\x16\x17\a.\x01#\"\x06\x1d\x013\x02\xe5\xe3\xfe\u03e8\xa84`\x88U\\~,H\x1fD.<1\xe3\x03y\xfc\x87\x03y\x93RRk\x8dT#\x1d\x12\xe0\v\x12M<F\x00\x00\x03\x00\x14\xfe\x14\x04=\x04s\x00A\x00R\x00]\x00\xbc@\x81\x05\a\x15\a%\a\x03\x05\x1d\x15\x1d%\x1d\x03\x05\x19\x15\x19%\x19\x03\n#\x1a#*#\x03\n5\x01\n9\x1a9*9\x034 \t\rH4\r7\bY\x01YH\x05\x05SJ\x10\x1b\x01\x1b\x1b_\xaf_\x010_\x01\aS\x01SH7* \t\x12H*\x10//7BO%_%o%\x03%%\x107 707\x0374\x05\x02A\x04<VK\n\x01\n\n\x15\\<\x10GG\x01GP \x1bKN\x01N\x15\x00/\xc9]?\xe1]?\xc9\x119/]\xc9\x12\x179\x01/]3/]\xc9\x113/\xc99+\x10\xe9]]]\x113/]\xc9\x129/\xe9]\x1299+10]]]]]]\x01\x15\a\x1e\x01\x15\x14\x0e\x02#\"&'\x0e\x01\x15\x14\x1e\x02;\x012\x1e\x02\x15\x14\x0e\x02#\".\x0254>\x027.\x0354>\x027.\x0154>\x0232\x1e\x02\x17\x01\x14\x1e\x0232654&+\x01\"\x0e\x02\x13\x14\x1632654&#\"\x04=\xa3\x14\x106j\xa0j\x176\r\x14\x17\x1a*8\x1e\xaeQ\x80Y0L\x97\xe0\x93r\xaar9*FY/\x15)!\x15\x13$6\"Xg8l\xa0h\x1421*\f\xfe\\\x150N9\x9c\x9ebg\x8d\x1b>4#nDEH@?I\x89\x04\\\xa63\"I*U\x8dd7\x05\x03\x11%\x1a\x15\x19\x0f\x05%LuQ_\x99k9+QrH=Z@(\v\t *3\x1c 4-(\x15&\xa8rZ\x8ec4\x05\a\b\x03\xfb\x06\x19/$\x15XJ?*\r 5\x03f[dd[Zj\x00\x00\x01\x00\xa0\x00\x00\x04j\x06\x14\x00\x1d\x006@!\x05\x1b\x15\x1b\x02\x01F\x00U\x1f\x00\x1f0\x1f\x80\x1f\x03\x0f\vF\fT\x1e\x15\x05M\x18\x10\r\x00\f\x00\x15\x00?2??\xe92\x01\x10\xf6\xe92]\x10\xf6\xe910])\x01\x114&#\"\x0e\x02\x15\x11!\x11!\x11\x14\x06\a\x06\a3>\x0132\x1e\x02\x15\x04j\xfe\xcfKN;P0\x14\xfe\xcf\x011\x04\x03\x04\x03\x101\x98`S\x87`4\x02\x8dyy0^\x8aY\xfd\xf2\x06\x14\xfe\xc3*]'.,WM/d\x9bl\x00\x00\x02\x00\x93\x00\x00\x01\xdf\x06\x14\x00\x13\x00\x17\x00/@\x1c\xbf\x19\x010\x19`\x19\x90\x19\x03\n\x14F\x00\x15T\x18\x05S\xdf\x0f\x01\x0f\x0f\x16\x0f\x14\x15\x00??3/]\xed\x01\x10\xf62\xe92]]10\x134>\x0232\x1e\x02\x15\x14\x0e\x02#\".\x02\x01!\x11!\x93\x1a-=\"\"<-\x1b\x1b-<\"\"=-\x1a\x01>\xfe\xcf\x011\x05\u007f+9#\x0e\x0e#9+*:#\x0f\x0f#:\xfa\xab\x04^\x00\x00\x02\xff\xae\xfe\x14\x01\xdf\x06\x14\x00\x13\x00'\x00E@,\n\x12\x1a\x12\x02\x14\x04\x04\fF\x1e\x0fU)\xbf)\x010)`)\x90)\x03\x19S\xdf#\x01##\r\x0f\a\a\x17\a'\a\x03\aM\x00\x1b\x00?\xe9]?3/]\xed\x01]]\x10\xf62\xe12/210\x00]\x13\"&'5\x1e\x0132>\x025\x11!\x11\x14\x0e\x02\x034>\x0232\x1e\x02\x15\x14\x0e\x02#\".\x02f0f\"\x1f6\"\x19-!\x14\x011'W\x8a6\x1a-=\"\"<-\x1b\x1b-<\"\"=-\x1a\xfe\x14\x0e\v\xf0\n\t\x0f'A3\x04\xaa\xfb)M\x87e:\ak+9#\x0e\x0e#9+*:#\x0f\x0f#:\x00\x01\x00\xa0\x00\x00\x04\xb8\x06\x14\x00\x0e\x00n\xb6\n\x06\x01\f\x02\x01\x04\xb8\xff\xf0\xb3\x12\x17H\x04\xb8\xff\xf0@6\v\x0eH\x05\x04\x15\x04\x02\x04\a\x02\x03\x03\x060\x05\x01$\x05\x01\x00\x05\x10\x05\x02\x05\x10\x05\x05\x10\r\tF\nT\x0f\v\x00\a\x10\x11\x14H\b\a\x01\a\x00\x02\x06\n\x15\x02\x0f\x00??3\x1299]+?\x01\x10\xf6\xe92\x113/8]]]33\x11399]++10]]\x017\x01!\t\x01!\x01\a\x11!\x11!\x11\a\x01\xc5p\x01\x11\x01X\xfel\x01\xae\xfe\xa0\xfe\xf0w\xfe\xcf\x011\x10\x02`\xaa\x01T\xfe\x1b\xfd\x87\x01\xaeR\xfe\xa4\x06\x14\xfdJ\xfe\x00\x00\x01\x00\xa0\x00\x00\x01\xd1\x06\x14\x00\x03\x00 @\x13\xbf\x05\x010\x05`\x05\x90\x05\x03\x00F\x01T\x04\x02\x00\x00\x15\x00??\x01\x10\xf6\xe9]]10)\x01\x11!\x01\xd1\xfe\xcf\x011\x06\x14\x00\x00\x00\x01\x00\xa0\x00\x00\x06\xf0\x04s\x00*\x00q@4\x05 \x15 \x02\x03\x17\x01\x18\x00F\xf6\x01\x01\x99\x01\x01\x86\x01\x01y\x01\x018\x01\x01&\x01\x01\x19\x01\x01\x01\x01\f#F\"U,_,\x01\x0f\vF\fT+\x18\x10\x10\xb8\xff\xe8@\x10\t\rH\x10'\x05M\x1e\x15\x10\r\x0f#\f\x00\x15\x00?22??3\xe922+\x113\x01\x10\xf6\xe92]\x10\xf6\xe9\x119/]]]]]]]\xe9210]])\x01\x114&#\"\x0e\x02\x15\x11!\x113\x173>\x0332\x16\x173>\x0332\x16\x15\x11!\x114&#\"\x06\x15\x04`\xfe\xcfHM:M.\x14\xfe\xcf\xe9)\x11\x18CPZ.s\xa1+\x19\x18DR[.\xb4\xb7\xfe\xceHMm\\\x02\x8dyy0^\x8aY\xfd\xf2\x04^\x8f+>(\x13OU+>(\x13\xc3\xd7\xfd'\x02\x8dyy\xad\xa1\x00\x00\x01\x00\xa0\x00\x00\x04j\x04s\x00\x1a\x00;@$E\x12\x01\x05\x18\x15\x18\x02\x01F\x00U\x1c\x00\x1c0\x1c\x80\x1c\x03\x0f\vF\fT\x1b\x10\x05M\x15\x10\r\x0f\f\x00\x15\x00?2??\xe92\x01\x10\xf6\xe92]\x10\xf6\xe910]\x00])\x01\x114&#\"\x0e\x02\x15\x11!\x113\x173>\x0332\x1e\x02\x15\x04j\xfe\xcfIP<P/\x14\xfe\xcf\xe9)\x11\x18ER\\0R\x86`4\x02\x8dyy0^\x8aY\xfd\xf2\x04^\x8f+>(\x13/d\x9bl\x00\x00\x00\x00\x02\x00f\xff\xec\x04d\x04s\x00\v\x00\x1f\x006@!\x05\x0e\x01\x05\x1e\x01\n\x14\x01\n\x18\x01\x06G\fW!_!\x01\x00G\x16V \tM\x1b\x10\x03M\x11\x16\x00?\xe9?\xe9\x01\x10\xf6\xe9]\x10\xf6\xe910]]]]\x01\x14\x1632654&#\"\x06\x05\x14\x0e\x02#\".\x0254>\x0232\x1e\x02\x01\x9e^ji^^ki]\x02\xc6G\x85\xbfwo\xba\x87LG\x85\xbexo\xba\x87L\x021\xa7\xa9\xaa\xa6\xa7\xa5\xa5\xa7\x8c\u0614MM\x94\u060c\x8b\u0613LL\x93\xd8\x00\x00\x02\x00\xa0\xfe\x14\x04w\x04s\x00\x1f\x000\x008@ \x05\x1d\x01\x05\x19\x01.G\x1bW2&\x10\fF\rT1\x11 M\x16\x10\x0e\x0f\f\x1b\x05+M\x00\x16\x00?\xe92???\xe92\x01\x10\xf6\xe922\x10\xf6\xe910]]\x05\".\x02'#\x16\x17\x1e\x01\x15\x11!\x113\x173>\x0332\x1e\x02\x15\x14\x0e\x02\x03\"\x0e\x02\a\x15\x14\x1e\x0232654&\x02\xec7WD4\x15\x10\x04\x04\x03\x05\xfe\xcf\xf8+\x0e\x156GZ7W\x8ef8:i\x91\xb63G,\x14\x02\x13,I6[UU\x14\x18(3\x1c#\x1f\x1a7\x0f\xfe;\x06J\x91\"<-\x1bJ\x92\u060e\x8f\u0653J\x03\x93%JqK!Q~U,\xad\xa5\xa5\xa5\x00\x00\x00\x02\x00f\xfe\x14\x04=\x04s\x00\x10\x000\x008@ \n\x18\x01\n\x14\x01!\x05&F#U2\x0eG\x16V1$\x1b\"\x0f \vM\x1b\x10,\x00M\x11\x16\x00?\xe92?\xe92??\x01\x10\xf6\xe9\x10\xf6\xe92210]]%2>\x02754.\x02#\"\x06\x15\x14\x16\a\".\x0254>\x0232\x1e\x02\x1737!\x11!\x1146767#\x0e\x03\x02Z7K.\x16\x01\x13/M:`Z[\x10W\x8ef89i\x92X8ZI8\x16\b\x18\x01\x02\xfe\xcf\x05\x02\x03\x03\r\x146GZ\xdb%JqK%Q~U,\xad\xa5\xa8\xa6\xefJ\x91\u060e\x8f\u0653K\x19-;#\x8f\xf9\xb6\x01\xd5\x139\x1b !\"=,\x1a\x00\x00\x00\x01\x00\xa0\x00\x00\x03H\x04s\x00\x1a\x00@\xb3\xc0\x06\x01\x06\xb8\xff\xc0@!\t\rH\x06\x06\x1c\xff\x1c\x01F\x15\x01\x15\x11F\x12T\x1b\x13\x0f\x11\x15\x05\x16E\x16U\x16\x03\x16\v\x00\x10\x00?\xc93]??\x01\x10\xf6\xe92]]\x113/+]10\x012\x1e\x02\x17\x11.\x03#\"\x0e\x02\x15\x11!\x113\x173>\x03\x02\xe7\f\x1d\x1b\x17\x06\b\x1c\x1f\x1e\n;cG'\xfe\xcf\xe7-\x0f\x188EW\x04s\x01\x03\x03\x02\xfe\xe2\x02\x04\x03\x01\x1eCmO\xfd\xc7\x04^\xa8+F1\x1b\x00\x00\x00\x00\x01\x00b\xff\xec\x03\x89\x04s\x007\x00c@\x1c\x05\x02\x15\x02\x02\n!\x1a!\x02'\x15\b\t\fH\x15F\x00W9\xcf9\x0109\x01.\xb8\xff\xf8@\x19\t\fH.F\n\x1fV8\x15.\x05+N(\x10\n\rH($\x10\x10N\v\xb8\xff\xf0\xb5\n\rH\v\x05\x16\x00?3+\xe1?3+\xe1\x1299\x01\x10\xf62\xe9+]]\x10\xf6\xe9+310]]\x01\x14\x0e\x02#\".\x02'5\x1e\x0332>\x0254.\x02'.\x0354>\x0232\x16\x17\a.\x01#\"\x06\x15\x14\x1e\x02\x17\x1e\x03\x03\x89@v\xa8h7^TN(*]\\W%):%\x11\r.YKIkE\"<n\x9b_d\xb4_\\L\x8aE>7\x0e*L=GrR,\x01LX\x84X,\a\x10\x18\x12\xfc\x15\"\x19\x0e\x0f\x1b%\x15\x15!%/\"!APgGNuN'..\xd8$.,&\x14\x1f!'\x1c\x1f=Nh\x00\x00\x01\x00/\xff\xec\x03\x0e\x05L\x00\x19\x00\\\xb6\n\x18\t\fH\x15\x03\xb8\xff\xc0@4\n\x0fH\x02\x03\x01\x03\x03\x1b\x1f\x1bO\x1b_\x1bo\x1b\x9f\x1b\xdf\x1b\x06\x13\x17F\f\x0e\x0e\x10_\fo\f\xdf\f\xef\f\xff\f\x05\f\x16\x0eN\x12\x10\x13\x0f\x00M\a\x16\x00?\xe9?33\xe92\x01/]33/\x10\xe92]\x113/]+310+%267\x15\x0e\x01#\".\x025\x11#5?\x013\x15!\x15!\x11\x14\x16\x02f-Q*+\u007fKI~\\5\x92\xa8X\xc3\x01\x10\xfe\xf0@\xdf\x14\x0f\xe3\x16\x1d\"U\x8fl\x02\x1b\x81f\xec\xee\xe5\xfd\xe5A>\x00\x00\x00\x00\x01\x00\x9a\xff\xec\x04d\x04^\x00\x1a\x00;@#J\x04\x01\n\n\x01\x01\x18F\x19U\x1c\x00\x1c0\x1c\x80\x1c\x03\x0eF\rT\x1b\x00\n\x01\x01\x01\x12\a\x16\x18\r\x0f\x00?3?\xc92]/\x01\x10\xf6\xe9]\x10\xf6\xe9210]\x00]!'#\x0e\x03#\".\x025\x11!\x11\x14\x1632>\x025\x11!\x11\x03{)\x10\x19ER\\0R\x86`4\x011IP<P/\x14\x011\x8f+=(\x13/d\x9al\x02\xd9\xfdsyy0^\x8aY\x02\x0e\xfb\xa2\x00\x00\x00\x01\x00\x00\x00\x00\x04P\x04^\x00\r\x00\x96@\x1f\x06\r\x16\r6\rf\rv\r\xb6\r\xc6\r\xe6\r\xf6\r\t\xd9\v\x01\v\x10\t\fH\xd6\x02\x01\x02\xb8\xff\xf0@\"\t\fH\t\x00\x19\x009\x00i\x00y\x00\xb9\x00\xc9\x00\xe9\x00\xf9\x00\t\r\x00\x06\x06\x01\v\xa0\f\xc0\f\x02\f\xb8\xff\xc0@\x16\t\fH\f\x10\f\f\x0fp\x0f\x90\x0f\xb0\x0f\xd0\x0f\x04\x1f\x0f\x01\x02\x01\xb8\xff\xf0@\r\x01\v\x01\x0f\x16\x06\x01\x04\x06\x01\x06\x00\x15\x00?2]]?3\x01/83]]\x113/8+]3\x129\x113310]+]+]]!\x01!\x13\x1e\x01\x173>\x017\x13!\x01\x01\x8b\xfeu\x01?\xb9\x11\x19\x03\x06\x03\x19\x11\xb8\x01@\xfeu\x04^\xfd\x839{15w9\x02}\xfb\xa2\x00\x00\x01\x00\x00\x00\x00\x06s\x04^\x003\x01\x17\xb7\xd63\xe63\xf63\x033\xb8\xff\xf0@\x10\t\x0fH1\b\t\fH\xd5$\xe5$\xf5$\x03$\xb8\xff\xe8@\x10\t\x0fH\xda#\xea#\xfa#\x03#\x18\t\x0fH\x14\xb8\xff\xf8@\x17\t\fH\xd9\x12\xe9\x12\xf9\x12\x03\x12\x10\t\x0fH\xd5\x11\xe5\x11\xf5\x11\x03\x11\xb8\xff\xe8@Q\t\x0fH\xda\x00\xea\x00\xfa\x00\x03\x00\x18\t\x0fH\x98\x12\xa8\x12\x02\x12\x97\x11\xa7\x11\x02\x11\x1a\x97$\xa7$\x02$\x98#\xa8#\x02#\t\x973\xa73\x023\x98\x00\xa8\x00\x02\x00*\x06\x1a\x16\x1a&\x1a\x03\t*\x19*)*\x03*\t\x1a\x03\x1312\xa02\xc02\x022\xb8\xff\xc0@\x11\t\fH2\x1025\x805\x905\x02\x0f5\x01\x14\x13\xb8\xff\xf0@\x1a\x131#\t\t\x19\tI\t\x03\t\x13\x0f+\x06\x1b\x16\x1bF\x1b\x03\x1b\x1b\x00\x12\x15\x00?33/]3?3]33\x01/83]]\x1138+]\x113\x12\x179]]\x113]3]\x113]3]\x113]3]10+]+]+]++]+]++]!\x03.\x03'&'#\x06\a\x0e\x03\a\x03!\x01!\x13\x1e\x03\x173>\x057\x13!\x13\x1e\x03\x173>\x037\x13!\x01\x03\xf6V\x04\r\x10\x11\t\x14\x18\x06\x17\x13\b\x11\x10\r\x04Z\xfe\xb8\xfe\xd3\x01/q\t\x13\x11\x0e\x04\x06\x01\a\n\v\v\t\x03z\x01Pu\x05\x10\x11\f\x01\x06\x03\x0f\x12\x15\tu\x01+\xfe\xcf\x01\x87\x11?OY,gwwh,ZO@\x12\xfe}\x04^\xfe\x11'moc\x1d\x13=FI@1\n\x02\x18\xfd\xe8\x16\\ic\x1c\x19bqp'\x01\xef\xfb\xa2\x00\x00\x00\x01\x00\n\x00\x00\x04X\x04^\x00\v\x00\xfd@[\x05\n\x01\n\b\x01\n\x04\x01\x05\x02\x01\x18\x04\x01\x04\x05\x05\x9a\x00\xaa\x00\xba\x00\xda\x00\xea\x00\x05i\x00\x01Z\x00\x019\x00I\x00\x02\x18\x00(\x00\x02\n\x00\x01F\x06V\x06f\x06\x96\x06\xa6\x06\xb6\x06\xd6\x06\xe6\x06\b\x17\x06'\x067\x06\x03\x06\x06\x01\x06\t\x03\x00\x04\v\x18\b\x01\b\xa0\a\xc0\a\x02\a\xb8\xff\xc0@\x19\t\fH\a\x10\a\a\r\x1f\r/\r\xaf\r\x03\x17\x02\x01\x02\x01\x17\n\x01\n\v\xb8\xff\xf0@\x1b\v\t\x18\x10\x13Hi\t\x01Z\t\x019\tI\t\x02*\t\x01\x19\t\x01\n\t\x01\x03\xb8\xff\xe0@ \x10\x13Hf\x03\x01T\x03\x016\x03F\x03\x02$\x03\x01\x16\x03\x01\x04\x03\x01\t\x03\x01\b\n\x15\x04\x01\x0f\x00?3?3\x1299]]]]]]+]]]]]]+\x01/83]32]]\x113/8+]3]\x12\x179]]]]]]]]]3\x113]10]]]]\t\x01!\x1b\x01!\t\x01!\v\x01!\x01\x85\xfe\x98\x01Z\xba\xbd\x01Z\xfe\x93\x01}\xfe\xa6\xcd\xcd\xfe\xa6\x02;\x02#\xfe\xb0\x01P\xfd\xdd\xfd\xc5\x01j\xfe\x96\x00\x00\x01\x00\x00\xfe\x14\x04P\x04^\x00\x1e\x00\xaa@.\x18\x1e8\x1e\x02\n\x1e\x01\x1e\xf6\x0e\x017\x0e\x01\x16\x0e\x01\x0e\x05\x05\x00\xe9\f\x01\xda\f\x01)\f9\f\x02\x1a\f\x01\t\f\x01\f\xa0\r\xc0\r\x02\r\xb8\xff\xc0@,\t\fH\r\x10\r\r p \x90 \xb0 \xd0 \x04\x1f \x01\x15\x15\xe6\x01\x01\xd5\x01\x01\xa8\x01\x01&\x016\x01\x02\x15\x01\x01\x06\x01\x01\x01\x00\xb8\xff\xf0@\x12\x00\x0e\xe0\x05\x01\x04\x05\x01\x05\x1e\x1e\x1f\x18\x11\x1b\f\x00\x0f\x00?2?\xc9\x113\x113]]3\x01/83]]]]]]3/]]\x113/8+]3]]]]]\x129\x113]]]3]]10\x11!\x13\x1e\x01\x173>\x037\x13!\x01\x0e\x01#\"&'5\x1e\x0132>\x02?\x01\x01N\xb4\x10\x0f\x02\x06\x02\a\n\r\a\xb0\x01P\xfeF>\u05a14L\x1b\x15@#0D1#\r\x13\x04^\xfd\x8b4v/\x178:9\x17\x02u\xfb\x13\xb1\xac\v\x06\xf2\x05\b\x1a/B)8\x00\x01\x007\x00\x00\x03m\x04^\x00\t\x00|@\x17I\x03Y\x03i\x03\x03\x03\x10\x11\x18H\n\x03\x01\x03\a\a\t\x04\x04\x02\t\xb8\xff\xc0@\x1b\t\x11H\t\t\v\xa0\v\xc0\v\x02\u007f\v\x01\v@\v\x0eHF\bV\bf\b\x03\b\xb8\xff\xf0@\x1c\x11\x18H\x05\b\x01\b\xa0\x02\xc0\x02\x02\x02@\r\x12H\x02\a\x04N\x05\x0f\x02\bN\x01\x15\x00?\xe12?\xe12\x01/+]3]+]+]]\x113/+\x129/\x113\x113]+]10)\x015\x01!5!\x15\x01!\x03m\xfc\xca\x01\xc9\xfeV\x03\x04\xfeF\x01\u0374\x02\xc1\xe9\xc6\xfdQ\x00\x00\x00\x00\x01\x00\x1f\xfe\xbc\x02\xd5\x05\xb6\x00(\x00N@2\v(\t\x11H%\x18\t\x11H\x0f!\xf3\x15\x1c\xf0\b\x02\xf40'\x01'\x17\x02\xf6\xcd\x03\x01o\x03\u007f\x03\x8f\x03\x03I\x03\x01\x03\x03\x0e!\xf5\"\xf9\x0f\xf5\x0e\xf8\x00?\xe9?\xe9\x119/]]]\xe99\x01/]\xee3\xe92\xec210++\x00&#52>\x02'\x114>\x023\x15\x0e\x03\x15\x11\x06\a\x15\x1e\x01\a\x11\x14\x1e\x02\x17\x15\".\x025\x11\x01\x1f\x83}>aB!\x02&c\xaa\x83(A-\x18\x06\xe4sz\x03\x18-A(\x83\xaac&\x01oR\xef\x13+D0\x01>JiC \xe1\x01\f\x1f6+\xfe\u057b#\f\x11n^\xfe\xd5+6\x1f\f\x01\xe2 CjJ\x01;\x00\x00\x01\x01\xc7\xfe/\x02\xa2\x06\x0e\x00\x03\x00\x18@\r\x02\xaa0\x03@\x03p\x03\x03\x03\x02\x00\x00\x00?/\x01/]\xe110\x013\x11#\x01\xc7\xdb\xdb\x06\x0e\xf8!\x00\x00\x00\x01\x00\x1f\xfe\xbc\x02\xd5\x05\xb6\x00(\x00R\xb9\x00\x1c\xff\u0633\t\x11H\x02\xb8\xff\xe8@)\t\x11H\x12\v\xf0%\xf4\x18\x1f\x0f\x05\xf3(\x10%\xf6\xcd$\x01o$\u007f$\x8f$\x03I$\x01$$\x06\x18\xf5\x19\xf8\x06\xf5\x05\xf9\x00?\xe9?\xe9\x129/]]]\xe99\x01/\xed332\xee\xe9210++\x05\x14\x0e\x02#5>\x035\x11&675&'\x114.\x02'52\x1e\x02\x15\x11\x06\x1e\x023\x15\"\x06\x15\x01\xd5&c\xaa\x83(@-\x19\x03zr\xe3\x06\x19-@(\x83\xaac&\x01 Ba>}\x83-JjC \xe2\x01\f\x1f6+\x01+^n\x11\f#\xbb\x01++6\x1f\f\x01\xe1 CiJ\xfe\xc20D+\x13\xefRa\x00\x00\x00\x00\x01\x00X\x02'\x04\x10\x03}\x00$\x00\\@\x10\x1c\x1f,\x1f\x02\x1f(\x0e\x13H\x15\f%\f\x02\f\xb8\xff\xe8@\r\x0e\x13H\x1e&\n\x18\xad\n\x00 \x01 \xb8\xff\xc0\xb3\x14\x18H \xb8\xff\xc0@\x13\f\x0fH  \x1d\x05\xad?\x0e_\x0e\x02\x0e@\x15\x18H\x0e\x00/+]\xe933/++]3\xe9\x01/\x10\xce10\x00+]+]\x01.\x03#\"\x0e\x02\a5>\x0132\x1e\x02\x17\x1e\x0332>\x027\x15\x06#\".\x02\x02\x10%9/*\x17\x1d><9\x1a3\u007fN\x1e39F0&90*\x16\x1d><9\x19e\x9b\x1e39F\x02h\x10\x16\r\x05\x13!,\x19\xe767\x05\x0e\x19\x14\x10\x15\r\x05\x13 -\x19\xe7m\x05\r\x19\x00\x00\x00\x00\x02\x00u\xfe\x8f\x01\xd3\x04^\x00\x03\x00\x17\x00i@J[\x00\x01\x06\x00\x0e\x01\xb0\x19\xe0\x19\xf0\x19\x03\x1f\x19/\x19?\x19\u007f\x19\x9f\x19\x05\xd7\x02\x01\xc6\x02\x01w\x02\x01\x16\x02f\x02\x02\x03\x02\x01\x02\x00\x04\x01\x04\x96\xd8\x03\x01\xc9\x03\x01x\x03\x01i\x03\x01\x00\x03\x01\x03`\x0e\x01\x0e\x00\t\x9b\x13\x0f\x03\x00/?\xfd\xc6\x01/]3]]]]]\xed]2]]]]]]]]10_]\x133\x13!\x01\x14\x0e\x02#\".\x0254>\x0232\x1e\x02\xa8\xf43\xfe\xa6\x01^\x1b0@%#?0\x1c\x1c0?#%@0\x1b\x02^\xfc1\x05%/A(\x12\x12(A/-A)\x13\x13)A\x00\x00\x00\x00\x01\x00\x8f\xff\xec\x03\xe1\x05\xcb\x00)\x00c\xb1\x0e)\xb8\x01\x02@\x18\v\x00\x00\x06\x13\xaf%\xbf%\xcf%\x03%+\xa0+\xb0+\xc0+\x03\x1en\x06\xb8\xff\xc0@ \t\fH\x06*\x1f*?*\x02!u\x01\x00(\x19v\u007f\f\x8f\f\x9f\f\x03\f\v\x80\x0e\x90\x0e\x02\x0e\x00/]3\xcd]\xe1/\xcd3\xe1\x01]\x10\xd6+\xe1]\x10\xc6]2\x119/3\xe1210\x055.\x0354>\x02753\x15\x1e\x03\x17\a.\x03#\"\x0e\x02\x15\x14\x163267\x15\x0e\x01\a\x15\x02\x1f\\\x94h88i\x94[\xb2&LG?\x18V\x15587\x18B\\;\x1ar\x81L\x8d23|E\x14\xce\rK\x85\u01c9\x8d\u02c8K\r\xac\xa4\x01\v\x10\x14\v\xe2\n\x13\x0f\t(S\u007fW\xab\x9f%\x18\xef\x1d\x1f\x02\xc8\x00\x00\x00\x01\x00R\x00\x00\x04B\x05\xcb\x00&\x00\x9a@j\n$\x1a$*$\x03\v\xe7\x0f\x01\xd6\x0f\x01\xc5\x0f\x01'\x0fW\x0f\x97\x0f\x03\x15\x0f\x01\x0fn!\xb9\x1d\xf9\x1d\x02k\x1d{\x1d\x02:\x1d\x01\x04\r\x01\x1d\r\x1d\r\x15\x1f@\x17`\x17\x02\x17\x03c\x15\x83\x15\x02 \x15@\x15\x02\x04\x15\x01\x15\x0e\x1fw\v\x92 \x01  \x00\x18G\x14\xc7\x14\xd7\x14\x03\x14s\x16\x18\xe9\a\x01\xc8\a\x01\at\x04\x00\a\x00?2\xe1]]?\xe1]2\x119/]3\xe12\x01/]]]3/]3\x1299//]]]]3\xe1]]]]]210]\x012\x16\x17\a.\x01#\"\x06\x1d\x01!\x15!\x15\x14\x0e\x02\a!\x11!5>\x03=\x01#5354>\x02\x02\xa8n\xb3P]Gu?CK\x01N\xfe\xb2\x1b,5\x1b\x02\xa6\xfc\x10*C/\x18\xb2\xb2?o\x99\x05\xcb0\"\xe6\x1d#M_\xc1\u06cf7Q:(\x0e\xfe\xfc\xf8\x12*:R:\x91\xdb\xc3q\x9fd.\x00\x00\x02\x00\\\x00\xfe\x04\f\x04\xaa\x00\"\x006\x00\x96@_<!L!\x023\x15C\x15\x023\x0fC\x0f\x02<\x03L\x03\x02<\x1eL\x1e\x02<\x18L\x18\x023\fC\f\x023\x06C\x06\x02\x16\x0e!\x03\x1e\x06\x18\f\x15\x0f\x0f\f\x06\x03\x04\x00-\xaa\x12 \x04#\xaa\xa0\x00\xb0\x00\xd0\x00\x03\x00\x1f\x17\f\x06\x0f\x03\x15!\x18\x1e\x1e!\x03\x06\x04\t(\xae\x1b\r\x052\xae\t\x00/\xe1\xc62\xdc\xe1\x12\x179\x113\x113\x113\x113\xc62\x01/]\xe1\xc62\xdc\xe1\x12\x179\x113\x113\x113\x113\xc6210\x00]]]]\x01]]]]\x13467'7\x17>\x0132\x16\x177\x17\a\x1e\x01\x15\x14\x06\a\x17\a'\x0e\x01#\"&'\a'7&7\x14\x1e\x0232>\x0254.\x02#\"\x0e\x02\xa8\x1c\x19\x81\x94\u007f+f36`/\u007f\x95\x81\x19\x1d\x1c\x1a}\x91\u007f,c68c+}\x92\u007f5\xcf\x1e3D'(F5\x1e\x1e5F('D3\x1e\x02\xd36c,\u007f\x93\u007f\x19\x1c\x1b\x1c\x81\x8f\x81*g68b-}\x91}\x17\x1c\x19\x1a{\x91}[j'E3\x1d\x1d3E'(E3\x1e\x1e3E\x00\x00\x00\x01\x00\b\x00\x00\x04b\x05\xb6\x00\x16\x00\xaf@\x12\x0f\x13\x13\f\x06\x16\x01\x16\x0f\x15O\x15\x9f\x15\xaf\x15\x04\x15\xb8\xff\xf0@<\x15\x15\f\b\x04\x04\t\x01\x01\x01@\x02\xa0\x02\x02\x02\x10\x02\x02\x00\a\x05\x03\x15\x03\x02\x03\vn\n\x14\x01\x14\x10\x00\f@\f\x80\f\x90\f\xa0\f\xd0\f\x06\f\n\x0e\xfa\x0f\a\x0f\x06\x12\xfa\x13\x03\x00\xb8\xff\xd8@\x1c\f\x0fH\a\x00\x01\x00\x13\xdf\x0f\x01\x0f\x13\x1f\x13\x9f\x13\x03\x0f\x13\x0f\x13\x01\v\x12\x16\x01\x03\x00?3?\x1299//]]\x113]+3\x10\xe12\x113\x10\xe12\x01/]33]\xe12]292/8]3]9\x113\x113/8]3]\x129\x11310\x01\x13!\x013\x15#\x153\x15#\x15!5#535#53\x01!\x025\xf4\x019\xfe\x96\xc2\xf5\xf5\xf5\xfe\xe1\xf8\xf8\xf8\xbf\xfe\x9b\x01<\x03\\\x02Z\xfd\x15\xb2\x8a\xb2\xdd\u0772\x8a\xb2\x02\xeb\x00\x00\x00\x00\x02\x01\xc7\xfe/\x02\xa2\x06\x0e\x00\x03\x00\a\x00$@\x13\x02\x06\xaa\x030\a@\ap\a\x03\a\x04\x03\x04\x03\x06\x00\x00\x00?/99//\x01/]3\xe1210\x013\x11#\x113\x11#\x01\xc7\xdb\xdb\xdb\xdb\x06\x0e\xfc\xd1\xfe\u007f\xfc\xd1\x00\x00\x00\x02\x00j\xff\xec\x03\u007f\x06)\x00C\x00V\x00\xc5@\x1f51E1\x02\x161&1\x0220B0\x02\x140$0\x02:\x11J\x11\x02\x19\x11)\x11\x02)\xb8\xff\xe8@\t\t\rH\n\x18\t\x0eH$\xb8\xff\xe0@V\t\rH$H'D\x05 \t\rHR\x05\b\bM\x18M(M\x03M\x9a!!:\x99\x10'XoX\u007fX\x8fX\x03X@\n\rH\x17\x99\b\b\aD\x17D'D\x03D\x9a\x0000\x00\x00\x90\x00\x02\x00?$H\x1c\x05RHRHR\r05\x9d,\x16\x11\x14\x9d\r\x01\x00?\xe12?\xe12\x1199//\x1133\x1133\x01/]3/\x10\xe1]3/\xe1+]\x10\xde2\xe13/\xe1]\x1199+\x11\x1299+10++\x00]]]]]]\x134>\x027.\x0154>\x0232\x16\x17\a.\x01#\"\x06\x15\x14\x1e\x02\x17\x1e\x03\x15\x14\x06\a\x1e\x01\x15\x14\x0e\x02#\"&'5\x1e\x0332>\x0254.\x02'.\x037\x14\x16\x1f\x01>\x0354.\x02'\x0e\x03y\x15%0\x1b?F:k\x95[f\xb0URD\x8dNQJ\x184Q8GuS.E8>?>r\xa3en\xa9F'Z\\Y'8J-\x13\x0f-QBLxR+\xdfqv\x0f\x0f\x1c\x16\r\x154[F\x12 \x19\x0f\x03%,K?2\x12(vKAkL)/%\xbe 3.0\x19*''\x17\x1cDSe>d{%(iJJwT.)&\xcf\x14#\x1b\x10\x12 *\x19\x19'&*\x1c @Qf[?a3\x06\v\x1d$,\x1a 631\x19\a\x1b$,\x00\x00\x02\x00\xf8\x04\xf8\x03\xa6\x06\x04\x00\x13\x00%\x00%@\x14\x1e\x82\x14\x14\n\x82\x00\x19\x05\x8c#\xef\x0f\x01\x80\x0f\xd0\x0f\x02\x0f\x00/]]3\xed2\x01/\xed2/\xed10\x134>\x0232\x1e\x02\x15\x14\x0e\x02#\".\x02%4>\x0232\x1e\x02\x15\x14\x0e\x02#\"&\xf8\x16%3\x1d\x1d3&\x17\x17&3\x1d\x1d3%\x16\x01\x93\x16&4\x1e\x1c3'\x17\x17'3\x1c<R\x05}#3!\x10\x10!3#\"2!\x10\x10!2\"#3!\x10\x10!3#\"2!\x10B\x00\x03\x00d\xff\xec\x06D\x05\xcb\x00\x1c\x008\x00L\x00y@O\x1a\x14\x01\x1a\x10\x01\x03\xc4\x1a\n?\n\x01\x0f\x12\x01\x12\n\x12\n\x1d\x18C\x01C\xc3+N\x179\x019\xc3\x1d\x06\xc9\r\x00\xc9\x17\u007f\r\x8f\r\x9f\r\x03\x00\x17\x10\x17 \x17p\x17\x80\x17\x90\x17\x06\r\x17\r\x17$\x17>\x01>\xc82\x13\x18H\x01H\xc8$\x04\x00?\xe9]?\xe9]\x1199//]]\x10\xe9\x10\xe9\x01/\xe9]\x10\xde\xe9]\x1199//]]\x113\xe910]]\x01\"\x06\x15\x14\x163267\x15\x0e\x01#\".\x0254>\x0232\x16\x17\a&\x014>\x0432\x1e\x04\x15\x14\x0e\x04#\".\x047\x14\x1e\x0232>\x0254.\x02#\"\x0e\x02\x03\u007faj`k9\x8499vMk\xa0k64i\x9eiS\x9aDJq\xfc}6a\x8a\xa7\xc0hh\xc0\xa7\x8aa66a\x8a\xa7\xc0hh\xc0\xa7\x8aa6\x8e`\xa5\xde\u007f\u007f\u07a5``\xa5\xde\u007f\u007f\u07a5`\x03\U000940c7\x91\x1e\x1d\xbf\x1b\x1eD|\xadjg\xab{D,\"\xa8:\xfe\xe9h\xc0\xa7\x8aa66a\x8a\xa7\xc0hh\xc0\xa7\x89b55b\x89\xa7\xc0h\u007f\u07a5``\xa5\xde\u007f\u007f\u07a5``\xa5\xde\x00\x00\x00\x02\x00/\x02\xf0\x02\x8f\x05\xc7\x00\x1f\x00.\x00\x81\xb9\x00\x1c\xff\xe8@\x0e\t\rH\v\x18\t\rH\a\x18\t\rH\x02\xb8\xff\xe8@D\t\rH\n\x06\x1a\x06\x02\x05\x0f\x15\x0f\x02.\x01\x0f\xe2\x1e0\x0f0\x8f0\xaf0\xbf0\xdf0\xef0\x060@\v\x0fH%\xe2\x16O\t_\t\x02\t@\x11\x15H\t.\xe8\x0f\x0f(\x15\x12\xe6\x19\xde\x01(\xe7\x04\xfc\x00\xfb\x00??\xe92?\xe93\x129/\xe9\x01/+]3\xe9+]\x10\xde\xe922\x00]10]\x01++++\x01'\x0e\x01#\".\x0254>\x02?\x014&#\"\x06\a'>\x0132\x1e\x02\x15\x11\x01\x0e\x03\x15\x14\x1632>\x02=\x01\x02\b\x1f(qD2Q: +QwKZ;6(b4B>\x94[DeB!\xfe\xe6&/\x1b\t&\x1b 3$\x13\x02\xfcn:@\x1b7T9<S5\x1b\x04\x04?6\"\x1b\x87 2'Ge>\xfeF\x01=\x03\x14\x1d\"\x12&$\x16'7 $\x00\x02\x00R\x00^\x04\\\x04\x04\x00\x06\x00\r\x00[@2\x03\xeb\x06\xec\x01\x02\x02\x05\x12\x04\x01\x04\x04\n\xeb\r\xec\f\v\v\b/\t_\t\x02\x19\t\x01\t\x0f\r\n\n\x03\v\f\f\x04\x05\xed\t\b\b\x02\x01\xed\x06\x03\xef\x00?3\xed22\x113\xed22\x113\x113\x113\x01\x10\xde]]22\x113\xfd\xe93/]33\x113\xfd\xe910\x13\x01\x17\x03\x13\a\x01%\x01\x17\x03\x13\a\x01R\x015\xdb\xd9\xd9\xdb\xfe\xcb\x01\xfa\x015\xdb\xd9\xd9\xdb\xfe\xcb\x02=\x01\xc7w\xfe\xa4\xfe\xa4w\x01\xc5\x1a\x01\xc7w\xfe\xa4\xfe\xa4w\x01\xc5\x00\x00\x01\x00X\x00\xf8\x04\x10\x03?\x00\x05\x00\x16@\t\x01\xaa\x00\a\x03\x00\x03\xad\x04\x00/\xe93\x01/\x10\xde\xe910%#\x11!5!\x04\x10\xdb\xfd#\x03\xb8\xf8\x01l\xdb\x00\x00\x00\xff\xff\x00=\x01\xa8\x02V\x02\xa2\x12\x06\x00\x10\x00\x00\x00\x04\x00d\xff\xec\x06D\x05\xcb\x00\r\x00\x18\x004\x00H\x00\x8a@W\x06\x03\x00\x0e\b\xc4\t\x12\xc4\x00\x04\x00?\x00\x8f\x00\x02@\t`\t\x80\t\x03\t\x00\t\x00\x19\x18?\x01?\xc3'J\x175\x015\xc3\x19\x05\t\x03\a\xc9\x0e\x18\xc9\n\u007f\t\x8f\t\x02\x00\n\x10\np\n\x80\n\x04\t\x0e\n\n\x0e\t\x03 \x17:\x01:\xc8.\x13\x18D\x01D\xc8 \x04\x00?\xe9]?\xe9]\x11\x179///]]\x10\xe9\x10\xe19\x113\x01/\xe9]\x10\xde\xe9]\x1199//]]\x113\x10\xe9\x10\xe92\x119910\x01\x14\x06\a\x13#\x03#\x11#\x11!2\x16\x0132654.\x02+\x01\x014>\x0432\x1e\x04\x15\x14\x0e\x04#\".\x047\x14\x1e\x0232>\x0254.\x02#\"\x0e\x02\x04\x85MB\xed\xfe\xb2/\xe5\x01\b\xb6\xa8\xfe\u007f\x1fB9\x0f\x1f/ \x1d\xfd`6a\x8a\xa7\xc0hh\xc0\xa7\x8aa66a\x8a\xa7\xc0hh\xc0\xa7\x8aa6\x8e`\xa5\xde\u007f\u007f\u07a5``\xa5\xde\u007f\u007f\u07a5`\x03\x89^n\x1d\xfep\x01R\xfe\xae\x03\x94\x8c\xfe\xf29B#.\x1b\v\xfe\xdfh\xc0\xa7\x8aa66a\x8a\xa7\xc0hh\xc0\xa7\x89b55b\x89\xa7\xc0h\u007f\u07a5``\xa5\xde\u007f\u007f\u07a5``\xa5\xde\x00\x00\x01\xff\xfa\x06\x14\x04\x06\x06\xdd\x00\x03\x00\x11\xb6\x00\x05\x01\x01\xbc\x02\xbd\x00?\xe9\x01/\x10\xc610\x01!5!\x04\x06\xfb\xf4\x04\f\x06\x14\xc9\x00\x02\x00\\\x03\x19\x03\x10\x05\xcb\x00\x13\x00'\x00\x1d@\x0e\x14\xaa\x00\x1e\xaa\n)\x19\xae\x0f#\xae\x05\a\x00?\xe9\xd4\xe9\x01\x10\xde\xe9\xd4\xe910\x134>\x0232\x1e\x02\x15\x14\x0e\x02#\".\x027\x14\x1e\x0232>\x0254.\x02#\"\x0e\x02\\6^~HH\u007f]66]\u007fHH~^6\xbf\x18*9  9*\x19\x19*9  9*\x18\x04qG~^77^~GH~]55]~H\x1f8*\x19\x19*8\x1f 9+\x19\x19+9\x00\x02\x00X\x00\x00\x04\x10\x04\xee\x00\v\x00\x0f\x00D@(\a\x04\x01\x0e\a\r\x02\a\x06\t\xaa\x02\x03\x00\r\xad\f\v\t\x00\xad\x04\x06\u007f\x03\x8f\x03\xaf\x03\xcf\x03\xff\x03\x05\x03@\t\x0eH\x03\x00/+]33\xe922/\xe9\x01/33\xe922\x113\x11310\x00]\x01!5!\x113\x11!\x15!\x11#\x015!\x15\x01\xc7\xfe\x91\x01o\xdb\x01n\xfe\x92\xdb\xfe\x91\x03\xb8\x02\xa2\xdb\x01q\xfe\x8f\xdb\xfe\x93\xfe\xcb\xdb\xdb\x00\x00\x00\x01\x00/\x02J\x02\xbe\x05\xcb\x00\x1e\x00R\xb9\x00\x15\xff\xe8@3\t\rH\x0e\x10\v\x0eH\b\xe0\x00\x17 \x0f \x1f / _ \xdf \xef \xff \a\x05\x1dE\x1de\x1d\x03\x1d\x0f\xa0\x01\x01\x01\x0e\v\xe4\x12\xde\x02\x1d\xe4\x01\xdd\x00?\xe92?\xe93\x01/]33]]\x10\xde2\xe9\x00+10\x01+\x01!57>\x0354&#\"\x06\a'>\x0132\x1e\x02\x15\x14\x0e\x02\x0f\x01!\x02\xbe\xfdy\xe0.=%\x0f0((W5{A\xa2mBmM+\x196T<i\x01`\x02J\xa8\xdb-B6/\x1b&()/\x989H!?]=.QRY6_\x00\x00\x00\x01\x00;\x029\x02\xb6\x05\xc9\x001\x00\x94\xb9\x00\n\xff\xe8\xb3\t\rH0\xb8\xff\xe8\xb3\t\x0eH\x03\xb8\xff\xf0@V\t\rH\x03\x00\x1d\x1d\x0f#\xe1\x00\x00\x16\xe1\t3\x0f3\x1f3/3_3\xdf3\xef3\xff3\a*\x90\x0f\xa0\x0f\x02\x0f5\x10E\x10U\x10\x03&\x10\x01)\x10\v\x0eH\x03g\x1cw\x1c\x87\x1c\x03\x1c\xe6\xcf\x1d\x01h\x1dx\x1d\x88\x1d\x03\x1d\x1d\x13)&\xe5-\xde\x13\xe5\x10\f\xdf\x00?3\xe9?\xe93\x129/]]\xe9]9+]]\x01/]3]\x10\xde\xe93/\xe9\x129/\x129+10++\x01\x14\x06\a\x15\x1e\x03\x15\x14\x06#\"&'5\x1e\x0132654.\x02+\x01532>\x0254&#\"\x06\a'>\x0132\x1e\x02\x02\x9aQY3J1\x18\xb0\xbaL\x84AB\x84IJE\x10&@0p\\4@$\f23/T9e>\x97g>jM,\x04\xe1Ed\x1d\r\n*7B$y\x8b##\xbe(265\x15&\x1d\x12\xa0\x12\x1f'\x15&2&(\x8d/>!<V\x00\x00\x01\x01L\x04\xd9\x03P\x06!\x00\x0f\x00(@\x18\x06\x18\t\rH\a\a\x06\x00\x0f\a_\ao\a\x03\a\a\x0f\x00_\x00\x02\x00\x00/]2/]\x01/22/+10\x015>\x037!\x15\x0e\x05\a\x01L\x150/*\x10\x01V\v*6>?:\x17\x04\xd9\x1b\x1dLQQ\"\x15\x1218;82\x13\x00\x01\x00\xa0\xfe\x14\x04j\x04^\x00\x1d\x009@\"B\x0f\x01\r\tF\nU\x1f\x00\x1f0\x1f\x80\x1f\x03\x19\x1dF\x1cT\x1e\t\x1c\x0f\x1b\x1b\x0e\x03M\x11\x16\f\x15\x00??\xe12??3\x01\x10\xf6\xe12]\x10\xf6\xe1210]\x01\x14\x1632>\x025\x11!\x11#'#\x0e\x01#\"&'\x16\x17\x1e\x01\x15\x11!\x11!\x01\xd1KQ:N0\x14\x011\xe9+\f#iK6Z\x1c\x02\x03\x02\x03\xfe\xcf\x011\x01\xd1yy0^\x8aY\x02\x0e\xfb\xa2\x96UU.,*+%T$\xfe\xc0\x06J\x00\x00\x00\x00\x01\x00q\xfe\xfc\x04\x8f\x06\x14\x00\x13\x005\xb2\x04\xfd\x05\xb8\xff\xc0@\x17\t\x13H\x05\x05\r\x01\xfd\x00\x15\x00\r\x01\r\b\b\x00\x03\x9e\x12\x00\x05\x00\x00/2?\xe9\x129/\x01/]\x10\xde\xe9\x119/+\xe910\x01#\x11#\x11#\x11\x06#\".\x0254>\x023!\x04\x8f\xa1\xa6\xa2=U_\x9bm<Aw\xa6d\x02\\\xfe\xfc\x06P\xf9\xb0\x033\x123v\xc0\x8c\x93\xc5x2\x00\x00\x01\x00u\x02)\x01\xd3\x03}\x00\x13\x00&@\x19\n\x96\x00\x00\x10\x00`\x00\x03\x00\xb0\x15\xe0\x15\xf0\x15\x03/\x15?\x15\x02\x05\x9b\x0f\x00/\xed\x01]]/]\xed10\x134>\x0232\x1e\x02\x15\x14\x0e\x02#\".\x02u\x1b0@%#?0\x1c\x1c0?#%@0\x1b\x02\xd3/A(\x12\x12(A/-A)\x13\x13)A\x00\x00\x00\x01\xff\xdb\xfe\x14\x01\xa2\x00\x00\x00\x1b\x00K@0\x03(\t\x11H\x17\x15\x14\x14\b\b\x11\x83?\x00\u007f\x00\x8f\x00\xcf\x00\xdf\x00\x05\x00?\x1d\u007f\x1d\x8f\x1d\xcf\x1d\x04\x17\x15\x0f\x14\x1f\x14\x02\x14\x14\x05\x15\x0e\x8d\x05\x00/\xe1/\x129/]\x129\x01]/]\xe13/3\x113310\x00+\x05\x14\x0e\x02#\"&'5\x1e\x0332654&'73\a\x1e\x03\x01\xa2\x1fHwW-H\x1d\x0f%'%\x0f\x1d+J\\N\xc1\x1b\x1f:-\x1c\xfa9Z>!\f\t\xa8\x04\a\x06\x04\x1b#%9\x0e\x9a=\n\"/=\x00\x01\x00\\\x02J\x02H\x05\xb6\x00\x10\x007@$\x0f\x12\x1f\x12/\x12_\x12\xdf\x12\xef\x12\xff\x12\a\x0f\x01\x0e\x0e\a\x00\xe0p\x01\x80\x01\x90\x01\x03\x01\r\a\x0f\xdc\x00\xdd\x00??3\xcd\x01/]\xe933/\x113]10\x01#\x114>\x027\x0e\x03\x0f\x01'%3\x02H\xee\x01\x03\x03\x01\x06\x13\x15\x15\bNm\x01-\xbf\x02J\x01\xbe\x14=>4\f\b\x15\x16\x14\a=\u007f\xeb\x00\x00\x00\x00\x02\x009\x02\xf0\x02\xb8\x05\xc7\x00\x13\x00\x1f\x00Y\xb9\x00\x11\xff\xe8\xb3\t\rH\r\xb8\xff\xe8@5\t\rH\a\x18\t\rH\x03\x18\t\rH\x1a\xe2\x00!\x0f!\x8f!\xaf!\xbf!\xdf!\xef!\x06!@\v\x0eH\x14\xe2O\n_\n\x8f\n\x03\n\x1d\xe6\x0f\xde\x17\xe6\x05\xfc\x00?\xe9?\xe9\x01/]\xe9+]\x10\xde\xe910\x00++++\x01\x14\x0e\x02#\".\x0254>\x0232\x1e\x02\x05\x14\x1632654&#\"\x06\x02\xb8-TvJEuU/-SwKDsV0\xfeL7><77<>7\x04\\W\x87]11]\x87WW\x87]00]\x87Wdeeddcc\x00\x00\x00\x02\x00T\x00^\x04^\x04\x04\x00\x06\x00\r\x00]@4\f\v\v\b\t\xec\n\xeb\x05\x04\x13\r\x01\x02\r\x01\x04\r\x03\x02\xec\x03\xeb/\x00_\x00\x02\x16\x00\x01\x00\x0f\r\n\n\x03\v\f\f\x04\x05\xed\t\b\b\x02\x01\xed\x00\x03\xef\x00?3\xed22\x113\xed22\x113\x113\x113\x01\x10\xde]]\xe9\xed\x172/_]\x113\xe9\xed22\x11310\t\x01'\x13\x037\x01\x05\x01'\x13\x037\x01\x04^\xfe\xcb\xdb\xd9\xd9\xdb\x015\xfe\x06\xfe\xcb\xdb\xd9\xd9\xdb\x015\x02#\xfe;w\x01\\\x01\\w\xfe9\x1a\xfe;w\x01\\\x01\\w\xfe9\x00\x00\xff\xff\x00.\x00\x00\x06\x92\x05\xb6\x10'\x00\xd1\x02\xc9\x00\x00\x10&\x00{\xd2\x00\x11\a\x00\xd2\x03\x9c\xfd\xb7\x00*@\x1a\x03\x02\x18\x18\x03\x02\x10\x18`\x18\x02\x18\x00p\x00\x01\x00\x01\x00\x04\x10\x04`\x04\x03\x04\x11]5\x11]5\x11]55\x00?55\xff\xff\x00.\x00\x00\x06\xb4\x05\xb6\x10'\x00\xd1\x02\xc9\x00\x00\x10&\x00{\xd2\x00\x11\a\x00t\x03\xf6\xfd\xb7\x000@\x1f\x02\x16\x18\x02\xaf\x16\x01\x10\x16\x01\x16\x00\x80\x00\x01p\x00\x01D\x00\x01\x00\x01\x00\x04\x10\x04`\x04\x03\x04\x11]5\x11]]]5\x11]]5\x00?5\x00\x00\xff\xff\x00Z\x00\x00\x06\xb0\x05\xc9\x10'\x00\xd1\x03\x10\x00\x00\x10'\x00\xd2\x03\xba\xfd\xb7\x11\x06\x00u\x1f\x00\x00 @\x12\x02\x01\a\x18\x02\x01P\a\x01\a\x00\x80\x00\x010\x00\x01\x00\x11]]5\x11]55\x00?55\x00\x00\x00\x02\x00B\xfey\x03\x9e\x04^\x00'\x00;\x00C@)\f\x1a\x1c\x1a\x022\x96(('\x00\x00\x12\vH\x1c\x00\x12\x10\x12 \x12@\x12P\x12`\x12\x06\x12\v\x17\x00-\x9b7\x0f\x11\x0eM\x17\x00/\xe93?\xfd\xce\x119\x01/]/\xe9\x119/\xc93/\xed10]\x01\x15\x14\x0e\x02\a\x0e\x03\x15\x14\x163267\x17\x0e\x03#\".\x0254>\x027>\x03=\x01\x01\x14\x0e\x02#\".\x0254>\x0232\x1e\x02\x02\xae\x15+D0*:$\x10NNE\xa0Tg+fmp6f\xa3r=\x1b8S7)5\x1e\v\x01)\x1b0@%#?0\x1c\x1c0?#%@0\x1b\x02^J3SKF&!438%9J;)\xdd\x1a-\"\x141]\x87U?cUP,!1,0\x1f;\x01V/A(\x12\x12(A/-A)\x13\x13)A\x00\xff\xff\x00\x00\x00\x00\x053\as\x12&\x00$\x00\x00\x11\a\x00C\xff\xf3\x01R\x00\x15\xb4\x02\x17\x05&\x02\xb8\xff\xa8\xb4\x1c#\x04\a%\x01+5\x00+5\x00\xff\xff\x00\x00\x00\x00\x053\as\x12&\x00$\x00\x00\x11\a\x00v\x00\xa2\x01R\x00\x13@\v\x02\x17\x05&\x02V\x17\x1e\x04\a%\x01+5\x00+5\x00\x00\x00\xff\xff\x00\x00\x00\x00\x053\as\x12&\x00$\x00\x00\x11\a\x00\xc3\x00N\x01R\x00\x13@\v\x02\x17\x05&\x02\x02\x1e*\x04\a%\x01+5\x00+5\x00\x00\x00\xff\xff\x00\x00\x00\x00\x053\a`\x12&\x00$\x00\x00\x11\a\x00\xc5\x00N\x01R\x00\x13@\v\x02\x1a\x05&\x02\x03\x1b)\x04\a%\x01+5\x00+5\x00\x00\x00\xff\xff\x00\x00\x00\x00\x053\aV\x12&\x00$\x00\x00\x11\a\x00j\x00L\x01R\x00\x17@\r\x03\x02&\x05&\x03\x02\x01\x175\x04\a%\x01+55\x00+55\x00\x00\x00\xff\xff\x00\x00\x00\x00\x053\a\n\x12&\x00$\x00\x00\x11\x06\x00\xc4LX\x00 @\x114.3\x03\x02\x1c\x1c4\x03\x03\x02\x01!\x17\x04\a%\x01+55\x00?3/55\x11\x129\x00\x02\x00\x00\x00\x00\x06\xe7\x05\xb6\x00\x0f\x00\x13\x00\x8c@%\x05\x04\x01F\x10\x01\x05\x10\x01F\x03\x01\x05\x03\x01\x10\x03\x13\x04\x13\n\x0eZ\x11\x06p\x01\x01\x01\x01\x14\f\b\x0fg\x15\x15\xb8\xff\xc0@.\x0f\x14H\x0f\x15\x01\x04\x14\x05\x02_\x11\x11\r_\xaf\n\x01\x88\n\x01L\n\x01;\n\x01\x19\n\x01\b\n\x01\n\n\x0f\x12\b_\a\x03\x0f_\x04\x00\x12\x00?2\xe1?\xe12\x129/]]]]]]\xe12/\xe1\x01/\x113]+\x10\xe622\x119/]33\xe123\x11\x1299]]]]10])\x01\x11!\x03!\x01!\x15!\x11!\x15!\x11!\x01!\x11#\x06\xe7\xfc\xb7\xfe3\x96\xfe\xc5\x02\x8f\x04X\xfd\xec\x01\xf0\xfe\x10\x02\x14\xfb[\x01\\a\x01\\\xfe\xa4\x05\xb6\xfe\xfe\xbf\xfe\xfe\x87\x01`\x02N\x00\x00\xff\xff\x00w\xfe\x14\x04\xd1\x05\xcb\x12&\x00&\x00\x00\x11\a\x00z\x01\xfc\x00\x00\x00\v\xb6\x01\x16,$\x18 %\x01+5\x00\x00\x00\xff\xff\x00\xb8\x00\x00\x04\x02\as\x12&\x00(\x00\x00\x11\a\x00C\xff\xb7\x01R\x00\x15\xb4\x01\f\x05&\x01\xb8\xff\xa8\xb4\x11\x18\x01\x00%\x01+5\x00+5\x00\xff\xff\x00\xb8\x00\x00\x04\x02\as\x12&\x00(\x00\x00\x11\a\x00v\x00\\\x01R\x00\x13@\v\x01\f\x05&\x01M\f\x13\x01\x00%\x01+5\x00+5\x00\x00\x00\xff\xff\x00\xb8\x00\x00\x04\v\as\x12&\x00(\x00\x00\x11\a\x00\xc3\x00\x1f\x01R\x00\x13@\v\x01\f\x05&\x01\x10\x13\x1f\x01\x00%\x01+5\x00+5\x00\x00\x00\xff\xff\x00\xb8\x00\x00\x04\x02\aV\x12&\x00(\x00\x00\x11\a\x00j\x00\x19\x01R\x00\x17@\r\x02\x01\x1b\x05&\x02\x01\v\f*\x01\x00%\x01+55\x00+55\x00\x00\x00\xff\xff\x00*\x00\x00\x02\xdb\as\x12&\x00,\x00\x00\x11\a\x00C\xfe\xde\x01R\x00\x15\xb4\x01\f\x05&\x01\xb8\xff\x9e\xb4\x11\x18\x01\x00%\x01+5\x00+5\x00\xff\xff\x00B\x00\x00\x02\xf1\as\x12&\x00,\x00\x00\x11\a\x00v\xff\xa1\x01R\x00\x13@\v\x01\f\x05&\x01`\f\x13\x01\x00%\x01+5\x00+5\x00\x00\x00\xff\xff\xff\xf0\x00\x00\x03,\as\x12&\x00,\x00\x00\x11\a\x00\xc3\xff@\x01R\x00\x13@\v\x01\f\x05&\x01\x00\x13\x1f\x01\x00%\x01+5\x00+5\x00\x00\x00\xff\xff\x006\x00\x00\x02\xe4\aV\x12&\x00,\x00\x00\x11\a\x00j\xff>\x01R\x00\x19\xb6\x02\x01\x1b\x05&\x02\x01\xb8\xff\xff\xb4\f*\x01\x00%\x01+55\x00+55\x00\x00\x02\x00/\x00\x00\x05#\x05\xb6\x00\x10\x00\x1f\x00g@B\x11Z\bg!?!\x01X\x1a\x01;\x1a\x01\x1a\x18\x1cZ'\x10\x01\x10\x01\x0ed \x1b\x0f_\x18\xaf\x01\xbf\x01\xdf\x01\x03\x88\x01\x01o\x01\x01L\x01\x01;\x01\x01\x19\x01\x01\b\x01\x01\x01\x01\x02\x1c_\x0e\x12\x17_\x02\x03\x00?\xe1?\xe1\x119/]]]]]]]3\xe12\x01\x10\xf62\xc2]\xf12\xc2]]]\x10\xf6\xe110\x133\x11!2\x04\x16\x12\x15\x14\x02\x06\x04#!\x11#%4.\x02+\x01\x113\x15#\x11326/\x89\x01\xac\xa1\x01\x03\xb8ce\xbf\xfe\xeb\xb1\xfe\u007f\x89\x03\xba1]\x87W\x8f\xed\xedr\xc4\xc5\x03R\x02d\\\xb5\xfe\xf4\xb0\xb9\xfe\xe9\xbb^\x02T\x8dz\xb1t8\xfe\x9a\xfe\xfe\xac\xf0\x00\x00\xff\xff\x00\xb8\x00\x00\x05\x8b\a`\x12&\x001\x00\x00\x11\a\x00\xc5\x00\xc5\x01R\x00\x15\xb4\x01\x1b\x05&\x01\xb8\xff\xf3\xb4\x1c*\n\x00%\x01+5\x00+5\x00\xff\xff\x00w\xff\xec\x05\x96\as\x12&\x002\x00\x00\x11\a\x00C\x00T\x01R\x00\x15\xb4\x02(\x05&\x02\xb8\xff\x9c\xb4-4\n\x00%\x01+5\x00+5\x00\xff\xff\x00w\xff\xec\x05\x96\as\x12&\x002\x00\x00\x11\a\x00v\x01\x02\x01R\x00\x13@\v\x02(\x05&\x02I(/\n\x00%\x01+5\x00+5\x00\x00\x00\xff\xff\x00w\xff\xec\x05\x96\as\x12&\x002\x00\x00\x11\a\x00\xc3\x00\xae\x01R\x00\x15\xb4\x02(\x05&\x02\xb8\xff\xf6\xb4/;\n\x00%\x01+5\x00+5\x00\xff\xff\x00w\xff\xec\x05\x96\a`\x12&\x002\x00\x00\x11\a\x00\xc5\x00\xba\x01R\x00\x13@\v\x02+\x05&\x02\x02,:\n\x00%\x01+5\x00+5\x00\x00\x00\xff\xff\x00w\xff\xec\x05\x96\aV\x12&\x002\x00\x00\x11\a\x00j\x00\xb4\x01R\x00\x19\xb6\x03\x027\x05&\x03\x02\xb8\xff\xfd\xb4(F\n\x00%\x01+55\x00+55\x00\x00\x01\x00m\x01\f\x03\xfc\x04\x9a\x00\v\x00n@D\xa7\n\x01V\x03\x96\x03\x02\x15\x03%\x035\x03\x03\x06\x03\x01Y\t\x99\t\x02\x1a\t*\t:\t\x03\t\t\x01V\x06\x96\x06\x02\x15\x06%\x065\x06\x03\x06\x06\x01Y\x00\x99\x00\x02\x1a\x00*\x00:\x00\x03\t\x00\x01\x03\xe0\x00\x01\x00\xb8\xff\xe0@\v\x0e\x14H_\x00\u007f\x00\xaf\x00\x03\x00\x00\x19/]+]\x01/10]]]]]]\x00]]]]]]]\t\x017\t\x01\x17\t\x01\a\t\x01'\x01\x98\xfe\u0557\x01-\x011\x9a\xfe\xcf\x01-\x96\xfe\xcf\xfe\u04d5\x02\xd3\x01-\x9a\xfe\xd5\x01+\x96\xfe\xcf\xfe\u0458\x01-\xfe\u0558\x00\x03\x00w\xff\xb4\x05\x96\x05\xfc\x00\x1a\x00$\x00/\x002@\x1b\x1e(\x1b%[\x00g1/1?1\x02\x1b[\rf0\x1d'+ \x12\x04+\x05\x12\x00?\xc1?\xc1\x1199\x01\x10\xf6\xe1]\x10\xf6\xe1\x119910\x01\x14\x02\x0e\x01#\"'\a'7&\x0254\x12>\x0132\x16\x177\x17\a\x16\x12\x05\x14\x17\x01&#\"\x0e\x02\x054'\x01\x1e\x0132>\x02\x05\x96O\xa2\xf7\xa8\xb3\x80H\xa8Ra]O\xa2\xf7\xa9[\x9bAF\xa6P^]\xfc /\x01\xc9EaW\x80S(\x02\xa0+\xfe9\"P0Y\u007fQ'\x02\u0769\xfe\xea\xc6l=u^\x86d\x01(\xbb\xaa\x01\x15\xc4k!\x1fo`\x81c\xfe\u0778\xb4s\x02\xea+D\x80\xb7s\xabt\xfd\x1b\x13\x14D\u007f\xb7\x00\x00\x00\xff\xff\x00\xae\xff\xec\x05\f\as\x12&\x008\x00\x00\x11\a\x00C\x00=\x01R\x00\x15\xb4\x01\x18\x05&\x01\xb8\xff\xae\xb4\x1d$\v\x00%\x01+5\x00+5\x00\xff\xff\x00\xae\xff\xec\x05\f\as\x12&\x008\x00\x00\x11\a\x00v\x00\xee\x01R\x00\x13@\v\x01\x18\x05&\x01_\x18\x1f\v\x00%\x01+5\x00+5\x00\x00\x00\xff\xff\x00\xae\xff\xec\x05\f\as\x12&\x008\x00\x00\x11\a\x00\xc3\x00\x8d\x01R\x00\x15\xb4\x01\x18\x05&\x01\xb8\xff\xfe\xb4\x1f+\v\x00%\x01+5\x00+5\x00\xff\xff\x00\xae\xff\xec\x05\f\aV\x12&\x008\x00\x00\x11\a\x00j\x00\x91\x01R\x00\x17@\r\x02\x01'\x05&\x02\x01\x03\x186\v\x00%\x01+55\x00+55\x00\x00\x00\xff\xff\x00\x00\x00\x00\x04\xac\as\x12&\x00<\x00\x00\x11\a\x00v\x00Z\x01R\x00\x13@\v\x01\t\x05&\x01R\t\x10\a\x02%\x01+5\x00+5\x00\x00\x00\x00\x02\x00\xb8\x00\x00\x04m\x05\xb6\x00\x10\x00\x19\x00H@,\x06\x0f\x01\x15Z\x9f\x00\x01\x00g\x1b\x1f\x1b?\x1b_\x1b\x8f\x1b\xaf\x1b\x05\x11\v\aZ\bd\x1a\x19`\v\x11`\x06\v\x06\v\x06\a\t\x03\a\x12\x00??\x1299//\x10\xe1\x10\xe1\x01\x10\xf6\xe122]\x10\xf6]\xe110]\x01\x14\x0e\x02+\x01\x11!\x11!\x1532\x1e\x02\x0132654&+\x01\x04m3u\xbf\x8d\x8b\xfe\xca\x016\xa1|\xb4u9\xfd\x81Tyxjsh\x03\x02^\xac\x84O\xfe\xdb\x05\xb6\xe5By\xab\xfe\xb4izlg\x00\x01\x00\xa0\xff\xec\x05+\x06\x1f\x00C\x00o\xb5<\x18\t\rH\x12\xb8\xff\xe8\xb3\t\rH\x0e\xb8\xff\xe8@7\t\rHF1\x011G\x00\x99\a\x01H\a\x01\aF*\x00*9E \x01 G\x11WE\x80E\x01\x188F9TD\a \x144M?\x019\x15\xe8\x1d\x01\x1dO\x18\x14\x16\x00?3\xe1]??\xe1\x1299\x01\x10\xf6\xf1\xc2]\x10\xf6\xe1]\x1299\x10\xe1]]\x10\xe1]10+++\x01\x14\x0e\x04\x15\x14\x1e\x02\x17\x1e\x03\x15\x14\x06#\"&'5\x1e\x0332654.\x02'.\x0354>\x0454&#\"\x06\x15\x11!\x114>\x0232\x1e\x02\x04\xa4+?K?+\x195R91L5\x1b\xea\xe3b\x91<\x18ELP\"PX\x0e)J<?U5\x16)>I>)dalk\xfe\xcfJ\x89\xc0us\xbc\x85H\x04\xd9@aL:0*\x16\x14\"(3&\x1fAM\\<\xac\xae\x1d\"\xf2\x10\x1f\x18\x0f=>\x1b**1\"$@?E(5N>45>(?Nah\xfb\x98\x04sm\xa1j4+Sz\x00\x00\x00\xff\xff\x00V\xff\xec\x03\xfe\x06!\x12&\x00D\x00\x00\x11\x06\x00C\xa3\x00\x00\x15\xb4\x02/\x11&\x02\xb8\xff\u01f44;\f\x1e%\x01+5\x00+5\x00\x00\x00\xff\xff\x00V\xff\xec\x03\xfe\x06!\x12&\x00D\x00\x00\x11\x06\x00vm\x00\x00\x13@\v\x02/\x11&\x02\x91/6\f\x1e%\x01+5\x00+5\x00\xff\xff\x00V\xff\xec\x03\xfe\x06 \x12&\x00D\x00\x00\x11\x06\x00\xc3\x00\xff\x00\x13@\v\x02/\x11&\x02$6B\f\x1e%\x01+5\x00+5\x00\xff\xff\x00V\xff\xec\x03\xfe\x06\x0e\x12&\x00D\x00\x00\x11\x06\x00\xc5\xff\x00\x00\x13@\v\x022\x11&\x02$3A\f\x1e%\x01+5\x00+5\x00\xff\xff\x00V\xff\xec\x03\xfe\x06\x04\x12&\x00D\x00\x00\x11\x06\x00j\x06\x00\x00\x17@\r\x03\x02>\x11&\x03\x02+/M\f\x1e%\x01+55\x00+55\x00\xff\xff\x00V\xff\xec\x03\xfe\x06\xb2\x12&\x00D\x00\x00\x11\x06\x00\xc4\x00\x00\x00\x17@\r\x03\x024\x11&\x03\x02%9/\f\x1e%\x01+55\x00+55\x00\x00\x03\x00V\xff\xec\x06\xac\x04u\x004\x00C\x00L\x00\x94@^\n\x0e\x01\n\v\x01\x04\x1e\x01\n\x02\x01\x03\x1eG'F\x1155\r*H\x01\tH\x01HH/%WNONoN\x02;G\x19\rVM59'I'\x02('\x01'P\x11\xd9G\xe9G\x02\xc8G\x01|G\x01GG,(D\x01DO \x10\x18(\x15\x01\x15N\x1c\x10>N\b\x16,N/\x00\x16\x00?2\xe1?\xe1?\xe1]3?\xe1]\x129/]]]3\xe9]]2\x01\x10\xf62\xe9]\x10\xf62\xe9]]\x119/3\xe929910\x00]]\x01]]\x05\"&'\x0e\x03#\".\x02546?\x0154&#\"\x06\a'>\x0132\x17632\x1e\x02\x1d\x01!\x1e\x033267\x15\x0e\x03\x01\a\x0e\x03\x15\x14\x1632>\x025\x01\"\x06\a!.\x03\x04\xf4\x83\xd6E+Tb{RD{]6\xe4\xe3\xb2PHH\x89EcT\xccp\xd6m~\xbco\xb3|C\xfdV\x02%C_=^\xafX(QZh\xfd\x9de=T3\x17D7*H5\x1e\x01\xfeRk\b\x01\x85\x01\x18/H\x14ei6M3\x18+W\x85[\xb2\xa9\t\x06TEB*#\xca/6\x83\x81C\x82\xbdz\x94@gG&+-\xec\x15\x1d\x14\t\x02\x1a\x04\x02\x1c/A(F;\x1d9S6\x01\xf0rz3V?$\x00\x00\x00\xff\xff\x00f\xfe\x14\x03\xbc\x04s\x12&\x00F\x00\x00\x11\a\x00z\x01h\x00\x00\x00\x10@\n\x01P(\x01\x15( \x05\r%\x01+]5\x00\x00\xff\xff\x00f\xff\xec\x04D\x06!\x12&\x00H\x00\x00\x11\x06\x00C\xbd\x00\x00\x15\xb4\x02*\x11&\x02\xb8\xff\xb6\xb4/6\x0e\x18%\x01+5\x00+5\x00\x00\x00\xff\xff\x00f\xff\xec\x04D\x06!\x12&\x00H\x00\x00\x11\x06\x00vs\x00\x00\x13@\v\x02*\x11&\x02l*1\x0e\x18%\x01+5\x00+5\x00\xff\xff\x00f\xff\xec\x04D\x06!\x12&\x00H\x00\x00\x11\x06\x00\xc3\x12\x00\x00\x13@\v\x02*\x11&\x02\v1=\x0e\x18%\x01+5\x00+5\x00\xff\xff\x00f\xff\xec\x04D\x06\x04\x12&\x00H\x00\x00\x11\x06\x00j\x12\x00\x00\x17@\r\x03\x029\x11&\x03\x02\f*H\x0e\x18%\x01+55\x00+55\x00\xff\xff\xff\xd4\x00\x00\x01\xd8\x06!\x12&\x00\xc2\x00\x00\x11\a\x00C\xfe\x88\x00\x00\x00\x15\xb4\x01\x04\x11&\x01\xb8\xff\x9e\xb4\t\x10\x01\x00%\x01+5\x00+5\x00\xff\xff\x00\x91\x00\x00\x02\x95\x06!\x12&\x00\xc2\x00\x00\x11\a\x00v\xffE\x00\x00\x00\x13@\v\x01\x04\x11&\x01Z\x04\v\x01\x00%\x01+5\x00+5\x00\x00\x00\xff\xff\xff\x98\x00\x00\x02\xd4\x06!\x12&\x00\xc2\x00\x00\x11\a\x00\xc3\xfe\xe8\x00\x00\x00\x15\xb4\x01\x04\x11&\x01\xb8\xff\xfe\xb4\v\x17\x01\x00%\x01+5\x00+5\x00\xff\xff\xff\xe0\x00\x00\x02\x8e\x06\x04\x12&\x00\xc2\x00\x00\x11\a\x00j\xfe\xe8\x00\x00\x00\x19\xb6\x02\x01\x13\x11&\x02\x01\xb8\xff\xff\xb4\x04\"\x01\x00%\x01+55\x00+55\x00\x00\x02\x00J\xff\xec\x04H\x06#\x00'\x007\x00v@Q\v$\x01\x05\x11\x01\n\x17\x01\n\x1b\x01(G\xcf\x0f\x01\x0fW9\xcb9\x01/9_9\u007f9\x9f9\x040G\xc4\x19\x01\x19V8\xcf8\x01!\b-\x01-N\u007f\x1e\x8f\x1e\x9f\x1e\x03\x1e\x1e\x04\a5\x015N\x14\x16\b_\x04\x01K\x04\x01/\x04\x01\x1b\x04\x01\x04\x01\x00?]]]]3?\xe9]\x119/]\xe9]2\x01]\x10\xf6]\xe9]]\x10\xf6]\xe910]]]]\x01.\x01'7\x1e\x01\x177\x17\a\x1e\x03\x15\x14\x0e\x02#\".\x0254>\x0232\x16\x177.\x01'\a'\x014.\x02#\"\x06\x15\x14\x1e\x02326\x01\xc9\"N*`I\x809\xe2d\xaeHlG$H\x86\xbevo\xba\x87LAu\xa3a`\x88 \x15\x1ceB\xe7e\x01\xfe\x171K3l]\x171L5j\\\x05\x1d\x150\x17\xaa\"E&\x8b\x9ajE\x9c\xb6\xd0y\x8e\u0718OD\x82\xbdzz\xbc\x81C?1\x02X\x9b8\x90\x9c\xfdh/VB'\x8d\x8e?hJ)\xa3\xff\xff\x00\xa0\x00\x00\x04j\x06\x0e\x12&\x00Q\x00\x00\x11\x06\x00\xc53\x00\x00\x15\xb4\x01\x1e\x11&\x01\xb8\xff\xfd\xb4\x1f-\f\x00%\x01+5\x00+5\x00\x00\x00\xff\xff\x00f\xff\xec\x04d\x06!\x12&\x00R\x00\x00\x11\x06\x00C\xc4\x00\x00\x15\xb4\x02 \x11&\x02\xb8\xff\xad\xb4%,\x16\f%\x01+5\x00+5\x00\x00\x00\xff\xff\x00f\xff\xec\x04d\x06!\x12&\x00R\x00\x00\x11\x06\x00vf\x00\x00\x13@\v\x02 \x11&\x02O '\x16\f%\x01+5\x00+5\x00\xff\xff\x00f\xff\xec\x04d\x06!\x12&\x00R\x00\x00\x11\x06\x00\xc3\x14\x00\x00\x15\xb4\x02 \x11&\x02\xb8\xff\xfd\xb4'3\x16\f%\x01+5\x00+5\x00\x00\x00\xff\xff\x00f\xff\xec\x04d\x06\x0e\x12&\x00R\x00\x00\x11\x06\x00\xc5\x12\x00\x00\x15\xb4\x02#\x11&\x02\xb8\xff\xfc\xb4$2\x16\f%\x01+5\x00+5\x00\x00\x00\xff\xff\x00f\xff\xec\x04d\x06\x04\x12&\x00R\x00\x00\x11\x06\x00j\x12\x00\x00\x19\xb6\x03\x02/\x11&\x03\x02\xb8\xff\xfc\xb4 >\x16\f%\x01+55\x00+55\x00\x00\x00\x00\x03\x00X\x00\xdd\x04\x10\x04\xc7\x00\x03\x00\x17\x00+\x00`@7\x0e\xa0\"\x01\"\x04\xc4\x18\xd4\x18\x02\x18\x18\x01=\x02M\x02}\x02\x8d\x02\x04\v\x02+\x02\x02\x02-\v\x01\x01\x01'\xad\xe0\x1d\x01\x0f\x1d?\x1d_\x1d\xaf\x1d\x04\x1d\t\xad\x90\x13\x01\x13\xb8\xff\xc0\xb6\v\x0fH\x13\x00\xad\x01\x00/\xe9/+]\xe9/]]\xe9\x01/]\x10\xce]]\x119/]3\xcd]210\x135!\x15\x054>\x0232\x1e\x02\x15\x14\x0e\x02#\".\x02\x114>\x0232\x1e\x02\x15\x14\x0e\x02#\".\x02X\x03\xb8\xfd\x98\x16&3\x1c\x1c2&\x17\x17&2\x1c\x1c3&\x16\x16&3\x1c\x1c2&\x17\x17&2\x1c\x1c3&\x16\x02d\xdb\xdb\xef*:#\x10\x10#:*(:%\x11\x11%:\x02\xe2*:$\x10\x10$:*(9%\x11\x11%9\x00\x03\x00f\xff\xb4\x04d\x04\x91\x00\x1b\x00#\x00,\x00\xaa@S\xe7'\x01\xd6'\x01w'\x97'\x02#'3'\x02\x14'\x01\xf8&\x01\xe9\x1f\x01\xb8\x1f\x01,\x1f<\x1f\x02\x1a\x1f\x01\n\x10\x01\x05\x02\x01%\x16\x01\xdf\t\x01'\x1f\x1c\b$\x18$8$H$\x04$G\x00W._.\x01\a\x1c\x17\x1c7\x1cG\x1c\x04\x1cG\x0eV-\x1e\xb8\xff\xe0@%\t\x0eH& \t\x0eH\x1e&*\b!\x18!8!H!\x04!M\x13\x10\a*\x17*7*G*\x04*M\x05\x16\x00?\xe9]?\xe9]\x1199++\x01\x10\xf6\xe9]]\x10\xf6\xe9]\x119910\x00]]\x01]]]]]]]]]]]]\x01\x14\x0e\x02#\"&'\a'7.\x0154>\x0232\x16\x177\x17\a\x1e\x01\x05\x14\x17\x01&#\"\x06\x054'\x01\x1e\x01326\x04dG\x85\xbfw9h09\xa2DEOG\x85\xbex>s31\xa0>?F\xfd:\f\x01\x1b(9i]\x01\x8f\x06\xfe\xf4\x11%\x15i^\x021\x8c\u0614M\x14\x12^ZoJ\u06cf\x8b\u0613L\x1a\x17O`bH\u0445VA\x01\xca\x19\xa5\xa7@1\xfeN\b\a\xaa\xff\xff\x00\x9a\xff\xec\x04d\x06!\x12&\x00X\x00\x00\x11\x06\x00C\xc2\x00\x00\x15\xb4\x01\x1b\x11&\x01\xb8\xff\x91\xb4 '\f\x19%\x01+5\x00+5\x00\x00\x00\xff\xff\x00\x9a\xff\xec\x04d\x06!\x12&\x00X\x00\x00\x11\a\x00v\x00\x81\x00\x00\x00\x13@\v\x01\x1b\x11&\x01P\x1b\"\f\x19%\x01+5\x00+5\x00\x00\x00\xff\xff\x00\x9a\xff\xec\x04d\x06!\x12&\x00X\x00\x00\x11\x06\x00\xc3)\x00\x00\x15\xb4\x01\x1b\x11&\x01\xb8\xff\xf8\xb4\".\f\x19%\x01+5\x00+5\x00\x00\x00\xff\xff\x00\x9a\xff\xec\x04d\x06\x04\x12&\x00X\x00\x00\x11\x06\x00j/\x00\x00\x19\xb6\x02\x01*\x11&\x02\x01\xb8\xff\xff\xb4\x1b9\f\x19%\x01+55\x00+55\x00\x00\x00\xff\xff\x00\x00\xfe\x14\x04P\x06!\x12&\x00\\\x00\x00\x11\x06\x00v=\x00\x00\x13@\v\x01\x1f\x11&\x01c\x1f&\x00\r%\x01+5\x00+5\x00\x00\x02\x00\xa0\xfe\x14\x04w\x06\x14\x00$\x005\x008@ \x05\f\x01\x05\b\x013G\nW7+\x1f\x1bF\x1cT6\x1d\x00\x1b\x1b\x140M\x0f\x16\x00%M\x05\x10\x00?\xe12?\xe12??\x01\x10\xf6\xe122\x10\xf6\xe110]]\x01>\x0332\x1e\x02\x15\x14\x0e\x02#\".\x02'#\x16\x17\x1e\x01\x15\x11!\x11!\x11\x14\x06\a\x06\a\x17\"\x0e\x02\a\x15\x14\x1e\x0232654&\x01\xd1\x147HY7V\x8ef98f\x8eW7ZG6\x15\x0e\x03\x04\x03\x04\xfe\xcf\x011\x04\x03\x04\x03\xca3G,\x14\x02\x13,I6[UU\x03\xcd#<-\x1aJ\x92\u060e\x8f\u0653J\x15&2\x1c \x1e\x1a4\x10\xfe;\b\x00\xfey\x18B\x1e#%N%JqK!Q~U,\xad\xa5\xa5\xa5\x00\x00\x00\xff\xff\x00\x00\xfe\x14\x04P\x06\x04\x12&\x00\\\x00\x00\x11\x06\x00j\xda\x00\x00\x17@\r\x02\x01.\x11&\x02\x01\x01\x1f=\x00\r%\x01+55\x00+55\x00\x00\x01\x00\xa0\x00\x00\x01\xd1\x04^\x00\x03\x00 @\x13\xbf\x05\x010\x05`\x05\x90\x05\x03\x00F\x01T\x04\x02\x0f\x01\x15\x00??\x01\x10\xf6\xe9]]10)\x01\x11!\x01\xd1\xfe\xcf\x011\x04^\x00\x00\x00\x01\x00\xb0\x04\xd9\x03\xec\x06!\x00\x14\x006@!\x00\x00\x14\xf0\x14\x02\x14\x14\x06\a\xfb\x03\x01)\x03\x01\x03\x0f\r_\ro\r\x03\r\r\a\x0f\x00_\x00\x02\x00\x00/]22/]3]]\x01/33/]310\x01.\x01'\x0e\x01\a#5>\x037!\x1e\x03\x17\x15\x03!3n46h3\xcb\x1a?A<\x16\x01d\x15<AA\x19\x04\xd9\"V88V\"\x1b\x1dLQQ\"\"QQL\x1d\x1b\x00\x00\x00\x02\x01T\x04\xd7\x03J\x06\xb2\x00\x13\x00\x1f\x00\x97\xb9\x00\x12\xff\xe8@\x0e\t\x12H\f\x18\t\x12H\b\x18\t\x12H\x02\xb8\xff\xe8@\x19\t\x12H\x14\b\x0e\x13H\x14\x84\x0f\x00\x1f\x00_\x00\xbf\x00\xcf\x00\xdf\x00\x06\x00\x1a\xb8\xff\xf8@1\x0e\x13H\x1a\x84O\no\n\x02\x00\n\x01\n\xa8\x17\x01\x99\x17\x01\x17\b\x0e\x11H\x17\x8f\x0f\x0f\x1f\x0f_\x0fo\x0f\x04\x0f@\x13\x17H\x0f\xa7\x1d\x01\x96\x1d\x01\x1d\xb8\xff\xf8@\v\x0e\x11H\x1d\x8f\x0f\x05_\x05\x02\x05\x00/]\xe1+]]\xd4+]\xe1+]]\x01/]]\xe1+\xd4]\xe1+10++++\x01\x14\x0e\x02#\".\x0254>\x0232\x1e\x02\a4&#\"\x06\x15\x14\x16326\x03J'E\\67\\A$$A\\75\\E(\x9e6**600*6\x05\xc78Y>!!=Y77X=!!=W8-33--44\x00\x00\x01\x00\xc5\x04\xd7\x03\xd9\x06\x0e\x00\x1b\x00H@0\x11\x90\x12\x01o\x12\x01\x12\x03\x00\x04p\x04\x02\x04\x12H\x00\x01\x00\x8e\x0f\t_\to\t\u007f\t\xdf\t\xef\t\x06\t\tG\x0e\x01\x0e\x8e\x04\x0f\x17_\x17\x02\x17\x00/]3\xe1]3/]\xe1]3\x01/]3/]]310\x01\"\x06\a#>\x0332\x1e\x0232673\x0e\x03#\".\x02\x01\xaa\x1f%\f\x95\x06(AX5)NMK$\x1f$\r\x95\x06)BW4(PLK\x05B56PtL% '!46OtM%!'!\x00\x00\x00\x00\x01\x00R\x01\xb4\x03\xae\x02\x9a\x00\x03\x00\x11\xb6\x02\x05\x00\x00\xba\x01\xbd\x00?\xe9\x01/\x10\xce10\x135!\x15R\x03\\\x01\xb4\xe6\xe6\x00\x00\x00\x01\x00R\x01\xb4\a\xae\x02\x9a\x00\x03\x00\x11\xb6\x02\x05\x00\x00\xba\x01\xbd\x00?\xe9\x01/\x10\xce10\x135!\x15R\a\\\x01\xb4\xe6\xe6\x00\x00\x00\x01\x00\x17\x03\xc1\x01\xa2\x05\xb6\x00\f\x00E@2\x0f\x0e\x1f\x0e/\x0e\x03)\x069\x06I\x06\xb9\x06\x04\x06\a\x97\xa4\f\xb4\f\x02v\f\x86\f\x96\f\x033\fC\f\x02%\f\x01\x06\f\x16\f\x02\f\x01\f\x9c\x06\x03\x00?\xed\x01/3]]]]]\xed2]]10\x13'>\x0373\x0e\x03\a%\x0e\x0e'.4\x19\xdb\x0f\x1d\x1b\x16\b\x03\xc1\x166z|{8=\x84\x83|5\x00\x00\x00\x01\x00\x17\x03\xc1\x01\xa2\x05\xb6\x00\f\x00C@1\x0f\x0e\x1f\x0e/\x0e\x03\xab\f\xbb\f\x02y\f\x89\f\x99\f\x03<\fL\f\x02\n\f\x1a\f*\f\x03\f\x01\x97&\x066\x06F\x06\xb6\x06\x04\x06\a\x06\x9c\f\x03\x00?\xed\x01/3]\xed2]]]]]10\x01\x17\x0e\x03\a#>\x037\x01\x93\x0f\x0e'/3\x19\xdb\x0e\x1d\x1b\x16\b\x05\xb6\x167y}z8<\x84\x84|5\x00\x00\x00\x00\x01\x00?\xfe\xf8\x01\xcb\x00\xee\x00\f\x00V@A\xa0\x0e\xb0\x0e\xe0\x0e\xf0\x0e\x04/\x0e?\x0e\x02\xab\v\xbb\v\x02y\v\x89\v\x99\v\x03<\vL\v\x02\n\v\x1a\v*\v\x03\v\x00\x97&\x056\x05F\x05\x03\x05/\x06?\x06O\x06\x03\x06\x05\x9c\v@\t\fH\v\x00/+\xed\x01/]3]\xed2]]]]]]10%\x0e\x03\a#>\x037!\x01\xcb\x0e'/3\x19\xdc\x0f\x1d\x1b\x16\b\x01\x18\xd76z|{8=\x84\x83}5\x00\x00\x02\x00\x17\x03\xc1\x03u\x05\xb6\x00\f\x00\x19\x00x@Z\x0f\x1b\x1f\x1b\x02)\x129\x12I\x12\xb9\x12\x04\x12\x13\x97\xa4\x18\xb4\x18\x023\x18C\x18\x02v\x18\x86\x18\x96\x18\x03\x05\x18\x15\x18%\x18\x03\x18\r)\x059\x05I\x05\xb9\x05\x04\x05\x06\x97\xa4\v\xb4\v\x02v\v\x86\v\x96\v\x033\vC\v\x02\x05\v\x15\v%\v\x03\v\xa0\x00\x01\x00\x18\v\x9c\x12\x05\x03\x00?3\xed2\x01/]3]]]]\xed2]/3]]]]\xed2]]10\x01>\x0373\x0e\x03\a!%>\x0373\x0e\x03\a!\x01\xe9\x0e(.4\x19\xdb\x0f\x1d\x1b\x16\b\xfe\xe8\xfe\x1f\x0e'.4\x19\xdb\x0f\x1d\x1b\x16\b\xfe\xe8\x03\xd76z|{8=\x84\x83|5\x166z|{8=\x84\x83|5\x00\x00\x02\x00\x17\x03\xc1\x03u\x05\xb6\x00\f\x00\x19\x00x@Z\x0f\x1b\x1f\x1b\x02\xab\x18\xbb\x18\x02<\x18L\x18\x02y\x18\x89\x18\x99\x18\x03\n\x18\x1a\x18*\x18\x03\x18\r\x97&\x126\x12F\x12\xb6\x12\x04\x12\xa0\x13\x01\x13\xab\v\xbb\v\x02y\v\x89\v\x99\v\x03<\vL\v\x02\n\v\x1a\v*\v\x03\v\x00\x97&\x056\x05F\x05\xb6\x05\x04\x05\x06\x12\x05\x9c\x18\v\x03\x00?3\xed2\x01/3]\xed2]]]]/]3]\xed2]]]]]10\x01\x0e\x03\a#>\x037!\x05\x0e\x03\a#>\x037!\x01\xa2\x0e'/3\x19\xdb\x0e\x1d\x1b\x16\b\x01\x18\x01\xe2\x0e'/3\x19\xdc\x0f\x1d\x1b\x16\b\x01\x18\x05\xa07y}z8<\x84\x84|5\x167y}z8<\x84\x84|5\x00\x00\x02\x00?\xfe\xf8\x03\x9e\x00\xee\x00\f\x00\x19\x00\xa7@\x83\xa0\x1b\xb0\x1b\xc0\x1b\xe0\x1b\xf0\x1b\x05_\x1bo\x1b\u007f\x1b\x03 \x1b0\x1b\x02\xab\x18\xbb\x18\x02y\x18\x89\x18\x99\x18\x03<\x18L\x18\x02\n\x18\x1a\x18*\x18\x03\x18\r\x97&\x126\x12F\x12\xb6\x12\x04\x12O\x13o\x13\u007f\x13\x8f\x13\x04\x10\x13\x01\x13\xab\v\xbb\v\x02y\v\x89\v\x99\v\x03<\vL\v\x02\n\v\x1a\v*\v\x03\v\x00\x97&\x056\x05F\x05\xb6\x05\x04\x05\xc0\x06\x01O\x06_\x06o\x06\x03\x06\x12\x05\x9c\x18\v@\t\fH\v\x00/+3\xed2\x01/]]3]\xed2]]]]/]]3]\xed2]]]]]]]10%\x0e\x03\a#>\x037!\x05\x0e\x03\a#>\x037!\x01\xcb\x0e'/3\x19\xdc\x0f\x1d\x1b\x16\b\x01\x18\x01\xe2\x0e'/3\x19\xdc\x0f\x1d\x1b\x16\b\x01\x18\xd76z|{8=\x84\x83}5\x176z|{8=\x84\x83}5\x00\x00\x00\x00\x01\x00b\x01\xae\x02\xa0\x04)\x00\x13\x00G@-`\x15p\x15\x90\x15\xe0\x15\x04\x0f\x15\x1f\x15/\x15O\x15_\x15\x05\x80\n\x01\n`\x00p\x00\x90\x00\x03\x1f\x00\x01\x000\x05\xc0\x05\xd0\x05\xe0\x05\x04\x05\xb8\xff\xc0\xb4\x0f\x13H\x05\x0f\x00/\xcd+]\x01/]]\xcd]]]10\x134>\x0232\x1e\x02\x15\x14\x0e\x02#\".\x02b,Mi=;iN--Ni;=iM,\x02\xecVxL##LxVUxM$$Mx\x00\x00\x01\x00R\x00^\x02b\x04\x04\x00\x06\x00+@\x16\x03\xeb\x06\xec\x05\x04\x04\x01\x19\x02\x01\x02\b\x04\x05\xed\x02\x01\xed\x00\x03\xef\x00?3\xed2\xed2\x01\x10\xde]22\x113\xfd\xe910\x13\x01\x17\x03\x13\a\x01R\x015\xdb\xd9\xd9\xdb\xfe\xcb\x02=\x01\xc7w\xfe\xa4\xfe\xa4w\x01\xc5\x00\x00\x00\x00\x01\x00R\x00^\x02b\x04\x04\x00\x06\x00+@\x16\x05\x04\x04\x01\x02\xec\x03\xeb\x16\x06\x01\x06\b\x04\x05\xed\x02\x01\xed\x06\x03\xef\x00?3\xed2\xed2\x01\x10\xde]\xe9\xed22\x11310\t\x01'\x13\x037\x01\x02b\xfe\xcb\xdb\xd9\xd9\xdb\x015\x02#\xfe;w\x01\\\x01\\w\xfe9\x00\x00\x00\x01\xfew\x00\x00\x02\x91\x05\xb6\x00\x03\x00\x1f\xb7\x03\x00\x10\x00\x00\x05\x01\x02\xb8\xff\xf0\xb3\x02\x01\x03\x03\x00?/\x01/83\x113/8210\t\x01#\x01\x02\x91\xfc\xd5\xef\x03+\x05\xb6\xfaJ\x05\xb6\x00\x00\x00\x02\x00\f\x02J\x02\xf6\x05\xbc\x00\n\x00\x15\x00\\@<5\x15E\x15\x02\x0f\x17\x1f\x17/\x17_\x17\xdf\x17\xef\x17\xff\x17\a\t\x006\x02F\x02\x02\x02\xe0\v\a2\x03B\x03\x02\x03\x03\x16\x17\x15\x05@\x14\x18H\x05\x01\x05\xe5\t\x06\x15\x15\x03\x0f\a\xdc\x03\xdd\x00??3\x129/33\xe92\x01/+2\x11\x129/]33\xe9]22]10]\x01#\x15#5!5\x013\x113!5467\x0e\x03\x0f\x01\x02\xf6}\xee\xfe\x81\x01\x81\xec}\xfe\x95\x03\x03\x05\x13\x16\x16\t\u007f\x02\u15d7\x9a\x02A\xfd\u0364*]1\r+-*\x0e\xbf\x00\x00\x01\x00\x00\x00\xd3\x00g\x00\x05\x00U\x00\x04\x00\x02\x00\x10\x00/\x00Z\x00\x00\x01\xcd\x01&\x00\x03\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00X\x00\x86\x01$\x01\xf2\x02\xa2\x03^\x03\x86\x03\xb6\x03\xe4\x04\x1a\x04B\x04\x86\x04\xa0\x04\xd4\x04\xf8\x05>\x05p\x05\xbc\x06:\x06\x82\x06\xf2\al\a\x96\bR\b\xca\t\x1c\t\x84\t\xca\t\xf8\n>\n\xae\vf\v\xda\f\\\f\xb6\f\xf4\r0\rr\r\xd2\x0e\x10\x0eF\x0e\x82\x0e\xda\x0e\xfe\x0fz\x0f\xe8\x10<\x10\x82\x10\xf8\x11l\x11\xe2\x12\x14\x12T\x12\xa2\x13\x88\x13\xe6\x148\x14\x8a\x14\xae\x14\xd2\x14\xf4\x15(\x15@\x15p\x15\xe6\x16J\x16\x98\x16\xfc\x17n\x17\xbc\x18\x9a\x18\xe4\x19$\x19\x82\x19\xdc\x19\xfa\x1ap\x1a\xb8\x1b\x04\x1bh\x1b\xcc\x1c\x18\x1c\x98\x1c\xf0\x1d8\x1d\xa2\x1e\x80\x1f\x1e\x1f\xa6\x1f\xfc ` z \xe0!F!F!\xa4\"\x12\"\x98#6#\xb4#\xda$\xb4$\xfe%\xa4&*&|&\x98&\xa0'L'b'\xaa'\xec(F(\xd6)\x06)T)\x90)\xc4*\x14*P*\xae+\x02+(+R+t+\xea,\x02,\x1a,2,J,d,\x80,\xee-\x02-\x1a-2-J-d-|-\x94-\xac-\xc6...F.^.v.\x8e.\xa6.\xc0/\x18/\x82/\x9a/\xb2/\xca/\xe4/\xfc0J0\xde0\xf61\f1\"181P1h2 262N2d2z2\x922\xaa2\xc22\xda2\xf43\x823\x9a3\xb23\xc83\xe03\xf84\x124\x825 585P5h5\x825\x986\x046\x1c6:6z6\xf67F7\\7r7\xae7\xea8.8\x968\xfe9~9\xc29\xee:\x1a:::\x8e\x00\x01\x00\x00\x00\x01\x00\x00W6\x82\xd7_\x0f<\xf5\x00\x1f\b\x00\x00\x00\x00\x00\xc8\x17O\xfa\x00\x00\x00\x00\xc8\\\x86Y\xfew\xfe\x14\a\xae\as\x00\x01\x00\b\x00\x02\x00\x00\x00\x00\x00\x00\b\x00\x00\x00\x00\x00\x00\x00\b\x00\x00\x00\x02\x14\x00\x00\x02J\x00u\x03\xc7\x00\x85\x05+\x00-\x04h\x00b\a\f\x00?\x05\xc7\x00R\x02!\x00\x85\x02\xb6\x00R\x02\xb6\x00=\x04\\\x00?\x04h\x00X\x02R\x00?\x02\x93\x00=\x02H\x00u\x03N\x00\x0e\x04h\x00?\x04h\x00\\\x04h\x00N\x04h\x009\x04h\x00\x04\x04h\x00V\x04h\x00L\x04h\x007\x04h\x00H\x04h\x00?\x02H\x00u\x02R\x00?\x04h\x00X\x04h\x00X\x04h\x00X\x03\xac\x00\x19\x06\xee\x00f\x053\x00\x00\x05#\x00\xb8\x05\x19\x00w\x05\x9a\x00\xb8\x04{\x00\xb8\x04d\x00\xb8\x05\xcb\x00w\x05\xcd\x00\xb8\x03\x1d\x00B\x02\xa6\xff9\x05\x12\x00\xb8\x04H\x00\xb8\aN\x00\xb8\x06D\x00\xb8\x06\f\x00w\x04\xc9\x00\xb8\x06\f\x00w\x05\n\x00\xb8\x041\x00^\x04d\x00)\x05\xba\x00\xae\x04\xe1\x00\x00\aj\x00\x00\x05\x04\x00\x00\x04\xac\x00\x00\x04P\x001\x02\xa6\x00\x8f\x03N\x00\f\x02\xa6\x003\x04B\x00\b\x03J\xff\xfc\x04\x9e\x01L\x04\x98\x00V\x04\xdd\x00\xa0\x03\xfe\x00f\x04\xdd\x00f\x04\xa6\x00f\x03\x19\x00)\x04j\x00\x14\x05\x04\x00\xa0\x02q\x00\x93\x02q\xff\xae\x04\xb8\x00\xa0\x02q\x00\xa0\a\x89\x00\xa0\x05\x04\x00\xa0\x04\xcb\x00f\x04\xdd\x00\xa0\x04\xdd\x00f\x03y\x00\xa0\x03\xd9\x00b\x03P\x00/\x05\x04\x00\x9a\x04P\x00\x00\x06s\x00\x00\x04b\x00\n\x04P\x00\x00\x03\xa8\x007\x02\xe9\x00\x1f\x04h\x01\xc7\x02\xe9\x00\x1f\x04h\x00X\x02\x14\x00\x00\x02J\x00u\x04h\x00\x8f\x04h\x00R\x04h\x00\\\x04h\x00\b\x04h\x01\xc7\x03\xe3\x00j\x04\x9e\x00\xf8\x06\xa8\x00d\x02\xe7\x00/\x04\xae\x00R\x04h\x00X\x02\x93\x00=\x06\xa8\x00d\x04\x00\xff\xfa\x03m\x00\\\x04h\x00X\x03\b\x00/\x03\b\x00;\x04\x9e\x01L\x05\n\x00\xa0\x05=\x00q\x02H\x00u\x01\xa4\xff\xdb\x03\b\x00\\\x02\xf2\x009\x04\xae\x00T\a\f\x00.\a\f\x00.\a\f\x00Z\x03\xac\x00B\x053\x00\x00\x053\x00\x00\x053\x00\x00\x053\x00\x00\x053\x00\x00\x053\x00\x00\a`\x00\x00\x05\x19\x00w\x04{\x00\xb8\x04{\x00\xb8\x04{\x00\xb8\x04{\x00\xb8\x03\x1d\x00*\x03\x1d\x00B\x03\x1d\xff\xf0\x03\x1d\x006\x05\x9a\x00/\x06D\x00\xb8\x06\f\x00w\x06\f\x00w\x06\f\x00w\x06\f\x00w\x06\f\x00w\x04h\x00m\x06\f\x00w\x05\xba\x00\xae\x05\xba\x00\xae\x05\xba\x00\xae\x05\xba\x00\xae\x04\xac\x00\x00\x04\xc9\x00\xb8\x05s\x00\xa0\x04\x98\x00V\x04\x98\x00V\x04\x98\x00V\x04\x98\x00V\x04\x98\x00V\x04\x98\x00V\a\x0e\x00V\x03\xfe\x00f\x04\xa6\x00f\x04\xa6\x00f\x04\xa6\x00f\x04\xa6\x00f\x02q\xff\xd4\x02q\x00\x91\x02q\xff\x98\x02q\xff\xe0\x04\x9e\x00J\x05\x04\x00\xa0\x04\xcb\x00f\x04\xcb\x00f\x04\xcb\x00f\x04\xcb\x00f\x04\xcb\x00f\x04h\x00X\x04\xcb\x00f\x05\x04\x00\x9a\x05\x04\x00\x9a\x05\x04\x00\x9a\x05\x04\x00\x9a\x04P\x00\x00\x04\xdd\x00\xa0\x04P\x00\x00\x02q\x00\xa0\x04\x9e\x00\xb0\x04\x9e\x01T\x04\x9e\x00\xc5\x04\x00\x00R\b\x00\x00R\x01\xb8\x00\x17\x01\xb8\x00\x17\x02R\x00?\x03\x8b\x00\x17\x03\x8b\x00\x17\x04%\x00?\x03\x02\x00b\x02\xb4\x00R\x02\xb4\x00R\x01\n\xfew\x03\b\x00\f\x00\x01\x00\x00\as\xfe\x14\x00\x00\b\x00\xfew\xfey\a\xae\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd3\x00\x03\x04c\x02\xbc\x00\x05\x00\b\x05\x9a\x053\x00\x00\x01\x1e\x05\x9a\x053\x00\x00\x03\xd0\x00f\x01\xfc\x00\x00\x02\v\b\x06\x03\b\x04\x02\x02\x04\xe0\x00\x02\xef@\x00 [\x00\x00\x00(\x00\x00\x00\x001ASC\x00 \x00  D\x06\x1f\xfe\x14\x00\x84\as\x01\xec \x00\x01\x9f\x00\x00\x00\x00\x04^\x05\xb6\x00\x00\x00 \x00\x02\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x14\x00\x03\x00\x01\x00\x00\x00\x14\x00\x04\x00x\x00\x00\x00\x1a\x00\x10\x00\x03\x00\n\x00~\x00\xff\x011\x02\xc6\x02\xda\x02\xdc \x14 \x1a \x1e \" : D\xff\xff\x00\x00\x00 \x00\xa0\x011\x02\xc6\x02\xda\x02\xdc \x13 \x18 \x1c \" 9 D\xff\xff\xff\xe3\xff\xc2\xff\x91\xfd\xfd\xfd\xea\xfd\xe9\xe0\xb3\xe0\xb0\xe0\xaf\xe0\xac\xe0\x96\xe0\x8d\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@EYXUTSRQPONMLKJIHGFEDCBA@?>=<;:9876510/.-,('&%$#\"!\x1f\x18\x14\x11\x10\x0f\x0e\r\v\n\t\b\a\x06\x05\x04\x03\x02\x01\x00,E#F` \xb0&`\xb0\x04&#HH-,E#F#a \xb0&a\xb0\x04&#HH-,E#F`\xb0 a \xb0F`\xb0\x04&#HH-,E#F#a\xb0 ` \xb0&a\xb0 a\xb0\x04&#HH-,E#F`\xb0@a \xb0f`\xb0\x04&#HH-,E#F#a\xb0@` \xb0&a\xb0@a\xb0\x04&#HH-,\x01\x10 <\x00<-, E# \xb0\xcdD# \xb8\x01ZQX# \xb0\x8dD#Y \xb0\xedQX# \xb0MD#Y \xb0\x04&QX# \xb0\rD#Y!!-,  E\x18hD \xb0\x01` E\xb0Fvh\x8aE`D-,\x01\xb1\v\nC#Ce\n-,\x00\xb1\n\vC#C\v-,\x00\xb0(#p\xb1\x01(>\x01\xb0(#p\xb1\x02(E:\xb1\x02\x00\b\r-, E\xb0\x03%Ead\xb0PQXED\x1b!!Y-,I\xb0\x0e#D-, E\xb0\x00C`D-,\x01\xb0\x06C\xb0\aCe\n-, i\xb0@a\xb0\x00\x8b \xb1,\xc0\x8a\x8c\xb8\x10\x00b`+\fd#da\\X\xb0\x03aY-,\x8a\x03E\x8a\x8a\x87\xb0\x11+\xb0)#D\xb0)z\xe4\x18-,Ee\xb0,#DE\xb0+#D-,KRXED\x1b!!Y-,KQXED\x1b!!Y-,\x01\xb0\x05%\x10# \x8a\xf5\x00\xb0\x01`#\xed\xec-,\x01\xb0\x05%\x10# \x8a\xf5\x00\xb0\x01a#\xed\xec-,\x01\xb0\x06%\x10\xf5\x00\xed\xec-,F#F`\x8a\x8aF# F\x8a`\x8aa\xb8\xff\x80b# \x10#\x8a\xb1\f\f\x8apE` \xb0\x00PX\xb0\x01a\xb8\xff\xba\x8b\x1b\xb0F\x8cY\xb0\x10`h\x01:-, E\xb0\x03%FRK\xb0\x13Q[X\xb0\x02%F ha\xb0\x03%\xb0\x03%?#!8\x1b!\x11Y-, E\xb0\x03%FPX\xb0\x02%F ha\xb0\x03%\xb0\x03%?#!8\x1b!\x11Y-,\x00\xb0\aC\xb0\x06C\v-,!!\fd#d\x8b\xb8@\x00b-,!\xb0\x80QX\fd#d\x8b\xb8 \x00b\x1b\xb2\x00@/+Y\xb0\x02`-,!\xb0\xc0QX\fd#d\x8b\xb8\x15Ub\x1b\xb2\x00\x80/+Y\xb0\x02`-,\fd#d\x8b\xb8@\x00b`#!-,KSX\x8a\xb0\x04%Id#Ei\xb0@\x8ba\xb0\x80b\xb0 aj\xb0\x0e#D#\x10\xb0\x0e\xf6\x1b!#\x8a\x12\x11 9/Y-,KSX \xb0\x03%Idi \xb0\x05&\xb0\x06%Id#a\xb0\x80b\xb0 aj\xb0\x0e#D\xb0\x04&\x10\xb0\x0e\xf6\x8a\x10\xb0\x0e#D\xb0\x0e\xf6\xb0\x0e#D\xb0\x0e\xed\x1b\x8a\xb0\x04&\x11\x12 9# 9//Y-,E#E`#E`#E`#vh\x18\xb0\x80b -,\xb0H+-, E\xb0\x00TX\xb0@D E\xb0@aD\x1b!!Y-,E\xb10/E#Ea`\xb0\x01`iD-,KQX\xb0/#p\xb0\x14#B\x1b!!Y-,KQX \xb0\x03%EiSXD\x1b!!Y\x1b!!Y-,E\xb0\x14C\xb0\x00`c\xb0\x01`iD-,\xb0/ED-,E# E\x8a`D-,E#E`D-,K#QX\xb9\x003\xff\xe0\xb14 \x1b\xb33\x004\x00YDD-,\xb0\x16CX\xb0\x03&E\x8aXdf\xb0\x1f`\x1bd\xb0 `f X\x1b!\xb0@Y\xb0\x01aY#XeY\xb0)#D#\x10\xb0)\xe0\x1b!!!!!Y-,\xb0\x02CTXKS#KQZX8\x1b!!Y\x1b!!!!Y-,\xb0\x16CX\xb0\x04%Ed\xb0 `f X\x1b!\xb0@Y\xb0\x01a#X\x1beY\xb0)#D\xb0\x05%\xb0\b%\b X\x02\x1b\x03Y\xb0\x04%\x10\xb0\x05% F\xb0\x04%#B<\xb0\x04%\xb0\a%\b\xb0\a%\x10\xb0\x06% F\xb0\x04%\xb0\x01`#B< X\x01\x1b\x00Y\xb0\x04%\x10\xb0\x05%\xb0)\xe0\xb0) EeD\xb0\a%\x10\xb0\x06%\xb0)\xe0\xb0\x05%\xb0\b%\b X\x02\x1b\x03Y\xb0\x05%\xb0\x03%CH\xb0\x04%\xb0\a%\b\xb0\x06%\xb0\x03%\xb0\x01`CH\x1b!Y!!!!!!!-,\x02\xb0\x04%  F\xb0\x04%#B\xb0\x05%\b\xb0\x03%EH!!!!-,\x02\xb0\x03% \xb0\x04%\b\xb0\x02%CH!!!-,E# E\x18 \xb0\x00P X#e#Y#h \xb0@PX!\xb0@Y#XeY\x8a`D-,KS#KQZX E\x8a`D\x1b!!Y-,KTX E\x8a`D\x1b!!Y-,KS#KQZX8\x1b!!Y-,\xb0\x00!KTX8\x1b!!Y-,\xb0\x02CTX\xb0F+\x1b!!!!Y-,\xb0\x02CTX\xb0G+\x1b!!!Y-,\xb0\x02CTX\xb0H+\x1b!!!!Y-,\xb0\x02CTX\xb0I+\x1b!!!Y-, \x8a\b#KS\x8aKQZX#8\x1b!!Y-,\x00\xb0\x02%I\xb0\x00SX \xb0@8\x11\x1b!Y-,\x01F#F`#Fa# \x10 F\x8aa\xb8\xff\x80b\x8a\xb1@@\x8apE`h:-, \x8a#Id\x8a#SX<\x1b!Y-,KRX}\x1bzY-,\xb0\x12\x00K\x01KTB-,\xb1\x02\x00B\xb1#\x01\x88Q\xb1@\x01\x88SZX\xb9\x10\x00\x00 \x88TX\xb2\x02\x01\x02C`BY\xb1$\x01\x88QX\xb9 \x00\x00@\x88TX\xb2\x02\x02\x02C`B\xb1$\x01\x88TX\xb2\x02 \x02C`B\x00K\x01KRX\xb2\x02\b\x02C`BY\x1b\xb9@\x00\x00\x80\x88TX\xb2\x02\x04\x02C`BY\xb9@\x00\x00\x80c\xb8\x01\x00\x88TX\xb2\x02\b\x02C`BY\xb9@\x00\x01\x00c\xb8\x02\x00\x88TX\xb2\x02\x10\x02C`BY\xb9@\x00\x02\x00c\xb8\x04\x00\x88TX\xb2\x02@\x02C`BYYYYY-,E\x18h#KQX# E d\xb0@PX|Yh\x8a`YD-,\xb0\x00\x16\xb0\x02%\xb0\x02%\x01\xb0\x01#>\x00\xb0\x02#>\xb1\x01\x02\x06\f\xb0\n#eB\xb0\v#B\x01\xb0\x01#?\x00\xb0\x02#?\xb1\x01\x02\x06\f\xb0\x06#eB\xb0\a#B\xb0\x01\x16\x01-,z\x8a\x10E#\xf5\x18-\x00\x00\x00@3\t\xf8\x03\xff\x1fP\xf4\x01\x9f\xf3\x010\xf1\x017\xf0G\xf0W\xf0\x03/\xef\x9f\xef\x02@\xedP\xed\xd0\xed\x030\xec\x01%\xeb5\xebU\xebe\xeb\x04W\xe4\x01f\xe1\x01\xb8\xff\xf0\xb3\xe0\x13\x16F\xb8\xff\xf0@?\xe0\v\x0eF\xfc\xfb3\x1f\xdf3\xddU\xde3\xdcU0\xfb@\xfb`\xfb\x03_\xdd\xcf\xdd\x02 \xdd0\xdd\x02\xdc\x03\x19\x1f\xc9\xc8\x19\x1f\xc6\xc53\x1f\xfe\xc2\x19\x1f0\xc0\x01\xbb\xba\x19\x1f@\xb7`\xb7\x80\xb7\x03\xb8\xff\xc0\xb3\xb7\x11\x14F\xb8\xff\u8db4\t\rF\xc0\xb1\x01\xb8\xff\xe8@\xa1\xaf\n\x0eF/\x9c?\x9c\xff\x9c\x03\x8f\x9b\xef\x9b\x02\x9a\x99\x19\x1f\xc0\x97\u0417\x02\x90\x8d\x19\x1f\x1f\x8c/\x8c?\x8c\x03O\x8c\xbf\x8c\u03cc\x03\xbb\x82\x01g\xfa\xa7\xfa\x02Ft\x01&n6n\x02\x1a\x01\x18U\x19\x13\xff\x1f\a\x04\xff\x1f\x06\x03\xff\x1f\xbfg\x01 f\x80f\x90f\x03\x8fe\x9fe\x02 d\xb0d\x02'^7^\x02&]\x01\\Z\x14\x1f[Z\x14\x1f&Z6Z\x02\x133\x12U\x05\x01\x03U\x043\x03U\x0f\x03\x01/\x03\x9f\x03\x02\vW\x1bW+W\xebW\x04\a\x12V\"V2V\xa2V\x04\xafU\x01\xc4T\x01\xb8\xff\xe0@!T\a\fF S\xf0S\x02FO\x017O\x01FN\x017N\x01[\xffk\xff{\xff\x03 \xff\x13\x18F\xb8\xff\xf0\xb7H\t\fFGF\x19\x1f\xb8\xff\xf0@1F\t\fF\x163\x15U\x11\x01\x0fU\x103\x0fU\x02\x01\x00U\x01G\x00U\xaf\x0f\xcf\x0f\x020\x0f\x01o\x00\u007f\x00\xaf\x00\xef\x00\x04\x10\x00\x01\x80\x16\x01\x05\x01\xb8\x01\x90\xb1TS++K\xb8\a\xffRK\xb0\tP[\xb0\x01\x88\xb0%S\xb0\x01\x88\xb0@QZ\xb0\x06\x88\xb0\x00UZ[X\xb1\x01\x01\x8eY\x85\x8d\x8d\x00B\x1dK\xb02SX\xb0`\x1dYK\xb0dSX\xb0@\x1dYK\xb0\x80SX\xb0\x10\x1d\xb1\x16\x00BYssss+++++\x01++++s\x00sssss\x01+sss^s\x00st+++\x01s++ssssss\x00++++\x01s\x00ss\x01s\x00st+\x01s+\x00ss+\x01s+\x00+s+\x01s\x00+\x01+\x00++sss+++\x01++s\x00s\x01ss\x00ss\x01ssss\x00+\x18^\x00\x00\x06\x14\x00\v\x00N\x05\xb6\x00\x17\x00u\x05\xb6\x05\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04^\x00\x15\x00{\x00\x00\xff\xec\x00\x00\x00\x00\xff\xec\x00\x00\x00\x00\xff\xec\x00\x00\xfe\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\x00\x00\x00\x00\x00\x011\x018\x01\x1f\x01\a\x01L\x00\x00\x00\x00\x00\xf5\x00\xe2\x00\xd9\x00\xcb\x00\xb2\x00\xbf\x01+\x00\xa0\x00\xa0\x00f\x00f\x00\x00\x00\x00\x016\x01?\x01/\x01!\x01\x14\x01\x02\x00\xf6\x00\x8e\x00\x00\x00\x00\x00\xb8\x00\xb8\x00w\x00w\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x016\x01?\x00\x89\x00\x00\x00\x00\x01\x02\x00\xfa\x00\xf0\x00\xe3\x00\xd9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x1a\x00\xf0\x00\x9b\x00\xd3\x01\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\f\x00\xa8\x00\xd3\x00\x8d\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01^\x01}\x01\x17\x00\xf5\x00\xe1\x01T\x01\xf6\x00\xbe\x00\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb\x01\b\x00\x00\x00\xdb\x00\xce\x01\x00\x00\x00\x01\x14\x00\x00\x00\x00\x00\xfc\x02\xb6\x00\xcf\x03\x96\x00\x00\x00\x8c\x00\xe6\x00\xfa\x00\xc8\x02\x9e\x00\xa8\x00\xb5\x01L\x00\x00\x01y\x00\x8e\x00\xe6\x00\xa8\x00\xa3\x00\x00\x00\x8e\x00\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\xb6\x02J\x00\x14\xff\xef\x00\xee\x00\xda\x00\xca\x00\x00\x00\xc4\x00\xaa\x00\xa0\x00\x96\x00x\x00\x00\x00\x00\x017\x02\x10\x01\xd3\x00\x00\x021\x01\b\x02%\x01\xe4\x01\xb6\x01\x00\x00\xe2\x00\xef\x00\xd3\x05\xb6\xfe\xbc\x00\xb2\x02\xfc\xff\xf4\x00\xa2\x01\xa1\x00\xe8\x00U\x00\x9a\x00\xb2\x00\x00\x00\x00\x00\a\x00Z\x00\x03\x00\x01\x04\t\x00\x01\x00\x14\x00\x00\x00\x03\x00\x01\x04\t\x00\x02\x00\b\x00\x14\x00\x03\x00\x01\x04\t\x00\x03\x004\x00\x1c\x00\x03\x00\x01\x04\t\x00\x04\x00\x1e\x00P\x00\x03\x00\x01\x04\t\x00\x05\x00,\x00n\x00\x03\x00\x01\x04\t\x00\x06\x00\x1c\x00\x9a\x00\x03\x00\x01\x04\t\x00\x0e\x00T\x00\xb6\x00D\x00r\x00o\x00i\x00d\x00 \x00S\x00a\x00n\x00s\x00B\x00o\x00l\x00d\x00A\x00s\x00c\x00e\x00n\x00d\x00e\x00r\x00 \x00-\x00 \x00D\x00r\x00o\x00i\x00d\x00 \x00S\x00a\x00n\x00s\x00 \x00B\x00o\x00l\x00d\x00D\x00r\x00o\x00i\x00d\x00 \x00S\x00a\x00n\x00s\x00 \x00B\x00o\x00l\x00d\x00V\x00e\x00r\x00s\x00i\x00o\x00n\x00 \x001\x00.\x000\x000\x00 \x00b\x00u\x00i\x00l\x00d\x00 \x001\x001\x002\x00D\x00r\x00o\x00i\x00d\x00S\x00a\x00n\x00s\x00-\x00B\x00o\x00l\x00d\x00h\x00t\x00t\x00p\x00:\x00/\x00/\x00w\x00w\x00w\x00.\x00a\x00p\x00a\x00c\x00h\x00e\x00.\x00o\x00r\x00g\x00/\x00l\x00i\x00c\x00e\x00n\x00s\x00e\x00s\x00/\x00L\x00I\x00C\x00E\x00N\x00S\x00E\x00-\x002\x00.\x000\x00\x02\x00\x00\x00\x00\x00\x00\xfff\x00f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd3\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\a\x00\b\x00\t\x00\n\x00\v\x00\f\x00\r\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00 \x00!\x00\"\x00#\x00$\x00%\x00&\x00'\x00(\x00)\x00*\x00+\x00,\x00-\x00.\x00/\x000\x001\x002\x003\x004\x005\x006\x007\x008\x009\x00:\x00;\x00<\x00=\x00>\x00?\x00@\x00A\x00B\x00C\x00D\x00E\x00F\x00G\x00H\x00I\x00J\x00K\x00L\x00M\x00N\x00O\x00P\x00Q\x00R\x00S\x00T\x00U\x00V\x00W\x00X\x00Y\x00Z\x00[\x00\\\x00]\x00^\x00_\x00`\x00a\x00\xac\x00\xa3\x00\x84\x00\x85\x00\xbd\x00\x96\x00\xe8\x00\x86\x00\x8e\x00\x8b\x00\x9d\x00\xa9\x00\xa4\x01\x02\x00\x8a\x01\x03\x00\x83\x00\x93\x00\xf2\x00\xf3\x00\x8d\x00\x97\x00\x88\x00\xc3\x00\xde\x00\xf1\x00\x9e\x00\xaa\x00\xf5\x00\xf4\x00\xf6\x00\xa2\x00\xad\x00\xc9\x00\xc7\x00\xae\x00b\x00c\x00\x90\x00d\x00\xcb\x00e\x00\xc8\x00\xca\x00\xcf\x00\xcc\x00\xcd\x00\xce\x00\xe9\x00f\x00\xd3\x00\xd0\x00\xd1\x00\xaf\x00g\x00\xf0\x00\x91\x00\xd6\x00\xd4\x00\xd5\x00h\x00\xeb\x00\xed\x00\x89\x00j\x00i\x00k\x00m\x00l\x00n\x00\xa0\x00o\x00q\x00p\x00r\x00s\x00u\x00t\x00v\x00w\x00\xea\x00x\x00z\x00y\x00{\x00}\x00|\x00\xb8\x00\xa1\x00\u007f\x00~\x00\x80\x00\x81\x00\xec\x00\xee\x00\xba\x00\xd7\x00\xd8\x00\xdd\x00\xd9\x00\xb2\x00\xb3\x00\xb6\x00\xb7\x00\xc4\x00\xb4\x00\xb5\x00\xc5\x00\x87\x00\xbe\x00\xbf\x00\xbc\x01\x04\auni00AD\toverscore\ffoursuperior\x00\x00\x00\x00\x02\x00\b\x00\x02\xff\xff\x00\x03\x00\x01\x00\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x02\x00\x01\x00\x00\x00\xd1\x00\x01\x00\x00\x00\x01\x00\x00\x00\n\x00\x1e\x00,\x00\x01latn\x00\b\x00\x04\x00\x00\x00\x00\xff\xff\x00\x01\x00\x00\x00\x01kern\x00\b\x00\x00\x00\x01\x00\x00\x00\x01\x00\x04\x00\x02\x00\b\x00\x01\x00\b\x00\x01\x00\xd6\x00\x04\x00\x00\x00f\x01p\x01p\n\xea\x02\"\x11\xdc\x02\"\x02x\x02\xde\rX\x02\xf8\x03R\x0e.\x03\xac\x03\xea\x0e\xf8\x04P\x04\x92\x04\xec\x04\xf2\x06\x1c\x06F\a@\b:\b\xbc\x0e.\n\xea\x10\xea\x10\xea\x10\xf0\x10\xea\t\xce\t\xf4\n\n\n\x10\x10\xea\x10\xea\x110\n\"\x10\xf0\nT\nj\nj\n\x80\n\xb2\n\xc8\n\xea\v\x86\n\xf0\n\xf0\v\x86\f$\f\xba\rX\r\xe4\r\xa2\r\xe4\r\xe4\x0e.\x0e.\x0e.\x0e.\x0el\x0e\x8a\x0e\x8a\x0e\x8a\x0e\x8a\x0e\x8a\x0e\xf8\x0fR\x0fR\x0fR\x0fR\x0f\xa0\x10\xea\x10\xea\x10\xea\x10\xea\x10\xea\x10\xea\x110\x10\xf0\x11\x02\x11\x02\x11\x02\x11\x02\x11\f\x11\x1a\x11\x1a\x11\x1a\x11\x1a\x11\x1a\x110\x11:\x11:\x11:\x11:\x11D\x11\xbe\x11\xdc\x11\xdc\x11\xe2\x11\xe2\x00\x02\x00\x19\x00\x05\x00\x05\x00\x00\x00\n\x00\v\x00\x01\x00\x0f\x00\x11\x00\x03\x00$\x00'\x00\x06\x00)\x00)\x00\n\x00,\x00,\x00\v\x00.\x00/\x00\f\x002\x005\x00\x0e\x007\x00>\x00\x12\x00D\x00F\x00\x1a\x00H\x00K\x00\x1d\x00N\x00N\x00!\x00P\x00R\x00\"\x00U\x00W\x00%\x00Y\x00^\x00(\x00\x82\x00\x87\x00.\x00\x89\x00\x92\x004\x00\x94\x00\x98\x00>\x00\x9a\x00\x9f\x00C\x00\xa2\x00\xad\x00I\x00\xb3\x00\xb8\x00U\x00\xba\x00\xbf\x00[\x00\xc1\x00\xc1\x00a\x00\xc6\x00\xc8\x00b\x00\xcb\x00\xcb\x00e\x00,\x00$\xff\xae\x00,\x00)\x007\x00R\x009\x00R\x00:\x00f\x00;\x00)\x00<\x00R\x00=\x00)\x00F\xff\xc3\x00G\xff\xc3\x00H\xff\xc3\x00J\xff\xd7\x00R\xff\xc3\x00T\xff\xc3\x00W\x00)\x00Y\x00)\x00Z\x00\x14\x00\\\x00)\x00\x82\xff\xae\x00\x83\xff\xae\x00\x84\xff\xae\x00\x85\xff\xae\x00\x86\xff\xae\x00\x87\xff\xae\x00\x88\xff\\\x00\x8e\x00)\x00\x8f\x00)\x00\x90\x00)\x00\x91\x00)\x00\x9f\x00R\x00\xa8\xff\xc3\x00\xa9\xff\xc3\x00\xaa\xff\xc3\x00\xab\xff\xc3\x00\xac\xff\xc3\x00\xad\xff\xc3\x00\xb4\xff\xc3\x00\xb5\xff\xc3\x00\xb6\xff\xc3\x00\xb7\xff\xc3\x00\xb8\xff\xc3\x00\xba\xff\xc3\x00\xbf\x00)\x00\xc1\x00)\x00\x15\x00&\xff\xc3\x00*\xff\xc3\x002\xff\xc3\x004\xff\xc3\x007\xff\x9a\x008\xff\xd7\x009\xff\x9a\x00:\xff\xae\x00<\xff\x9a\x00\x89\xff\xc3\x00\x94\xff\xc3\x00\x95\xff\xc3\x00\x96\xff\xc3\x00\x97\xff\xc3\x00\x98\xff\xc3\x00\x9a\xff\xc3\x00\x9b\xff\xd7\x00\x9c\xff\xd7\x00\x9d\xff\xd7\x00\x9e\xff\xd7\x00\x9f\xff\x9a\x00\x19\x00\x05\xff\xae\x00\n\xff\xae\x00&\xff\xec\x00*\xff\xec\x002\xff\xec\x004\xff\xec\x007\xff\x85\x008\xff\xec\x009\xff\xc3\x00:\xff\xd7\x00<\xff\x9a\x00\x89\xff\xec\x00\x94\xff\xec\x00\x95\xff\xec\x00\x96\xff\xec\x00\x97\xff\xec\x00\x98\xff\xec\x00\x9a\xff\xec\x00\x9b\xff\xec\x00\x9c\xff\xec\x00\x9d\xff\xec\x00\x9e\xff\xec\x00\x9f\xff\x9a\x00\xc9\xff\xae\x00\xcc\xff\xae\x00\x06\x00,\xff\xec\x007\xff\xec\x009\xff\xec\x00;\xff\xec\x00<\xff\xec\x00\x9f\xff\xec\x00\x16\x00\x0f\xff\xc3\x00\x11\xff\xc3\x00$\xff\xec\x00,\xff\xec\x007\xff\xc3\x009\xff\xec\x00:\xff\xec\x00;\xff\xec\x00<\xff\xd7\x00=\xff\xec\x00\x82\xff\xec\x00\x83\xff\xec\x00\x84\xff\xec\x00\x85\xff\xec\x00\x86\xff\xec\x00\x87\xff\xec\x00\x88\xff\xc3\x00\x8e\xff\xec\x00\x8f\xff\xec\x00\x90\xff\xec\x00\x91\xff\xec\x00\x9f\xff\xd7\x00\x16\x00\x05\x00=\x00\n\x00=\x00\f\x00)\x00\x0f\xff\x9a\x00\x11\xff\x9a\x00\"\x00)\x00$\xff\xd7\x009\x00\x14\x00:\x00\x14\x00<\x00\x14\x00@\x00)\x00`\x00)\x00\x82\xff\xd7\x00\x83\xff\xd7\x00\x84\xff\xd7\x00\x85\xff\xd7\x00\x86\xff\xd7\x00\x87\xff\xd7\x00\x88\xff\xc3\x00\x9f\x00\x14\x00\xc9\x00=\x00\xcc\x00=\x00\x0f\x00\x05\x00)\x00\n\x00)\x00&\xff\xd7\x00*\xff\xd7\x002\xff\xd7\x004\xff\xd7\x00\x89\xff\xd7\x00\x94\xff\xd7\x00\x95\xff\xd7\x00\x96\xff\xd7\x00\x97\xff\xd7\x00\x98\xff\xd7\x00\x9a\xff\xd7\x00\xc9\x00)\x00\xcc\x00)\x00\x19\x00\x05\xff\x9a\x00\n\xff\x9a\x00&\xff\xec\x00*\xff\xec\x002\xff\xec\x004\xff\xec\x007\xff\x85\x008\xff\xec\x009\xff\xae\x00:\xff\xc3\x00<\xff\x9a\x00\x89\xff\xec\x00\x94\xff\xec\x00\x95\xff\xec\x00\x96\xff\xec\x00\x97\xff\xec\x00\x98\xff\xec\x00\x9a\xff\xec\x00\x9b\xff\xec\x00\x9c\xff\xec\x00\x9d\xff\xec\x00\x9e\xff\xec\x00\x9f\xff\x9a\x00\xc9\xff\x9a\x00\xcc\xff\x9a\x00\x10\x00\x0f\xff3\x00\x11\xff3\x00$\xff\xae\x00&\xff\xec\x00;\xff\xec\x00<\xff\xec\x00=\xff\xd7\x00\x82\xff\xae\x00\x83\xff\xae\x00\x84\xff\xae\x00\x85\xff\xae\x00\x86\xff\xae\x00\x87\xff\xae\x00\x88\xffq\x00\x89\xff\xec\x00\x9f\xff\xec\x00\x16\x00\x0f\xff\xc3\x00\x11\xff\xc3\x00$\xff\xec\x00,\xff\xec\x007\xff\xc3\x009\xff\xd7\x00:\xff\xec\x00;\xff\xd7\x00<\xff\xd7\x00=\xff\xec\x00\x82\xff\xec\x00\x83\xff\xec\x00\x84\xff\xec\x00\x85\xff\xec\x00\x86\xff\xec\x00\x87\xff\xec\x00\x88\xff\xc3\x00\x8e\xff\xec\x00\x8f\xff\xec\x00\x90\xff\xec\x00\x91\xff\xec\x00\x9f\xff\xd7\x00\x01\x007\xff\xec\x00J\x00\x05\x00R\x00\n\x00R\x00\x0f\xff\x9a\x00\x10\xff\x9a\x00\x11\xff\x9a\x00\"\x00)\x00$\xff\x85\x00&\xff\xc3\x00*\xff\xc3\x002\xff\xc3\x004\xff\xc3\x006\xff\xec\x007\x00\x14\x00D\xff\x85\x00F\xff\x85\x00G\xff\x85\x00H\xff\x85\x00J\xff\x9a\x00P\xff\xae\x00Q\xff\xae\x00R\xff\x85\x00S\xff\xae\x00T\xff\x85\x00U\xff\xae\x00V\xff\x85\x00X\xff\xae\x00Y\xff\xc3\x00Z\xff\xc3\x00[\xff\xc3\x00\\\xff\xc3\x00]\xff\xc3\x00\x82\xff\x85\x00\x83\xff\x85\x00\x84\xff\x85\x00\x85\xff\x85\x00\x86\xff\x85\x00\x87\xff\x85\x00\x88\xffq\x00\x89\xff\xc3\x00\x94\xff\xc3\x00\x95\xff\xc3\x00\x96\xff\xc3\x00\x97\xff\xc3\x00\x98\xff\xc3\x00\x9a\xff\xc3\x00\xa2\xff\x85\x00\xa3\xff\x85\x00\xa4\xff\x85\x00\xa5\xff\x85\x00\xa6\xff\x85\x00\xa7\xff\x85\x00\xa8\xff\x85\x00\xa9\xff\x85\x00\xaa\xff\x85\x00\xab\xff\x85\x00\xac\xff\x85\x00\xad\xff\x85\x00\xb3\xff\xae\x00\xb4\xff\x85\x00\xb5\xff\x85\x00\xb6\xff\x85\x00\xb7\xff\x85\x00\xb8\xff\x85\x00\xba\xff\x85\x00\xbb\xff\xae\x00\xbc\xff\xae\x00\xbd\xff\xae\x00\xbe\xff\xae\x00\xbf\xff\xc3\x00\xc1\xff\xc3\x00\xc6\xff\xae\x00\xc7\xff\x9a\x00\xc9\x00R\x00\xcc\x00R\x00\n\x00\x0f\xff\xd7\x00\x11\xff\xd7\x00$\xff\xec\x00\x82\xff\xec\x00\x83\xff\xec\x00\x84\xff\xec\x00\x85\xff\xec\x00\x86\xff\xec\x00\x87\xff\xec\x00\x88\xff\xd7\x00>\x00\x05\x00R\x00\n\x00R\x00\x0f\xff\x9a\x00\x11\xff\x9a\x00\"\x00)\x00$\xff\xc3\x00&\xff\xd7\x00*\xff\xd7\x002\xff\xd7\x004\xff\xd7\x00D\xff\xc3\x00F\xff\xc3\x00G\xff\xc3\x00H\xff\xc3\x00J\xff\xc3\x00P\xff\xd7\x00Q\xff\xd7\x00R\xff\xc3\x00S\xff\xd7\x00T\xff\xc3\x00U\xff\xd7\x00V\xff\xd7\x00X\xff\xd7\x00\x82\xff\xc3\x00\x83\xff\xc3\x00\x84\xff\xc3\x00\x85\xff\xc3\x00\x86\xff\xc3\x00\x87\xff\xc3\x00\x88\xff\x85\x00\x89\xff\xd7\x00\x94\xff\xd7\x00\x95\xff\xd7\x00\x96\xff\xd7\x00\x97\xff\xd7\x00\x98\xff\xd7\x00\x9a\xff\xd7\x00\xa2\xff\xc3\x00\xa3\xff\xc3\x00\xa4\xff\xc3\x00\xa5\xff\xc3\x00\xa6\xff\xc3\x00\xa7\xff\xc3\x00\xa8\xff\xc3\x00\xa9\xff\xc3\x00\xaa\xff\xc3\x00\xab\xff\xc3\x00\xac\xff\xc3\x00\xad\xff\xc3\x00\xb3\xff\xd7\x00\xb4\xff\xc3\x00\xb5\xff\xc3\x00\xb6\xff\xc3\x00\xb7\xff\xc3\x00\xb8\xff\xc3\x00\xba\xff\xc3\x00\xbb\xff\xd7\x00\xbc\xff\xd7\x00\xbd\xff\xd7\x00\xbe\xff\xd7\x00\xc9\x00R\x00\xcc\x00R\x00>\x00\x05\x00f\x00\n\x00f\x00\x0f\xff\xae\x00\x11\xff\xae\x00$\xff\xd7\x00&\xff\xec\x00*\xff\xec\x002\xff\xec\x004\xff\xec\x00D\xff\xd7\x00F\xff\xd7\x00G\xff\xd7\x00H\xff\xd7\x00J\xff\xec\x00P\xff\xec\x00Q\xff\xec\x00R\xff\xd7\x00S\xff\xec\x00T\xff\xd7\x00U\xff\xec\x00V\xff\xd7\x00X\xff\xec\x00]\xff\xec\x00\x82\xff\xd7\x00\x83\xff\xd7\x00\x84\xff\xd7\x00\x85\xff\xd7\x00\x86\xff\xd7\x00\x87\xff\xd7\x00\x88\xff\xae\x00\x89\xff\xec\x00\x94\xff\xec\x00\x95\xff\xec\x00\x96\xff\xec\x00\x97\xff\xec\x00\x98\xff\xec\x00\x9a\xff\xec\x00\xa2\xff\xd7\x00\xa3\xff\xd7\x00\xa4\xff\xd7\x00\xa5\xff\xd7\x00\xa6\xff\xd7\x00\xa7\xff\xd7\x00\xa8\xff\xd7\x00\xa9\xff\xd7\x00\xaa\xff\xd7\x00\xab\xff\xd7\x00\xac\xff\xd7\x00\xad\xff\xd7\x00\xb3\xff\xec\x00\xb4\xff\xd7\x00\xb5\xff\xd7\x00\xb6\xff\xd7\x00\xb7\xff\xd7\x00\xb8\xff\xd7\x00\xba\xff\xd7\x00\xbb\xff\xec\x00\xbc\xff\xec\x00\xbd\xff\xec\x00\xbe\xff\xec\x00\xc9\x00f\x00\xcc\x00f\x00 \x00\x05\x00)\x00\n\x00)\x00&\xff\xd7\x00*\xff\xd7\x002\xff\xd7\x004\xff\xd7\x00F\xff\xec\x00G\xff\xec\x00H\xff\xec\x00R\xff\xec\x00T\xff\xec\x00\x89\xff\xd7\x00\x94\xff\xd7\x00\x95\xff\xd7\x00\x96\xff\xd7\x00\x97\xff\xd7\x00\x98\xff\xd7\x00\x9a\xff\xd7\x00\xa8\xff\xec\x00\xa9\xff\xec\x00\xaa\xff\xec\x00\xab\xff\xec\x00\xac\xff\xec\x00\xad\xff\xec\x00\xb4\xff\xec\x00\xb5\xff\xec\x00\xb6\xff\xec\x00\xb7\xff\xec\x00\xb8\xff\xec\x00\xba\xff\xec\x00\xc9\x00)\x00\xcc\x00)\x00D\x00\x05\x00R\x00\n\x00R\x00\x0f\xff\x9a\x00\x11\xff\x9a\x00\"\x00)\x00$\xff\x9a\x00&\xff\xd7\x00*\xff\xd7\x002\xff\xd7\x004\xff\xd7\x006\xff\xec\x00D\xff\x9a\x00F\xff\x9a\x00G\xff\x9a\x00H\xff\x9a\x00J\xff\x9a\x00P\xff\xc3\x00Q\xff\xc3\x00R\xff\x9a\x00S\xff\xc3\x00T\xff\x9a\x00U\xff\xc3\x00V\xff\xae\x00X\xff\xc3\x00[\xff\xd7\x00\\\xff\xec\x00]\xff\xc3\x00\x82\xff\x9a\x00\x83\xff\x9a\x00\x84\xff\x9a\x00\x85\xff\x9a\x00\x86\xff\x9a\x00\x87\xff\x9a\x00\x88\xffq\x00\x89\xff\xd7\x00\x94\xff\xd7\x00\x95\xff\xd7\x00\x96\xff\xd7\x00\x97\xff\xd7\x00\x98\xff\xd7\x00\x9a\xff\xd7\x00\xa2\xff\x9a\x00\xa3\xff\x9a\x00\xa4\xff\x9a\x00\xa5\xff\x9a\x00\xa6\xff\x9a\x00\xa7\xff\x9a\x00\xa8\xff\x9a\x00\xa9\xff\x9a\x00\xaa\xff\x9a\x00\xab\xff\x9a\x00\xac\xff\x9a\x00\xad\xff\x9a\x00\xb3\xff\xc3\x00\xb4\xff\x9a\x00\xb5\xff\x9a\x00\xb6\xff\x9a\x00\xb7\xff\x9a\x00\xb8\xff\x9a\x00\xba\xff\x9a\x00\xbb\xff\xc3\x00\xbc\xff\xc3\x00\xbd\xff\xc3\x00\xbe\xff\xc3\x00\xbf\xff\xec\x00\xc1\xff\xec\x00\xc9\x00R\x00\xcc\x00R\x00\t\x00\x05\x00f\x00\n\x00f\x00Y\x00\x14\x00Z\x00\x14\x00\\\x00\x14\x00\xbf\x00\x14\x00\xc1\x00\x14\x00\xc9\x00f\x00\xcc\x00f\x00\x05\x00\x05\x00)\x00\n\x00)\x00J\x00\x14\x00\xc9\x00)\x00\xcc\x00)\x00\x01\x00\n\xff\xc3\x00\x04\x00\x05\x00)\x00\n\x00)\x00\xc9\x00)\x00\xcc\x00)\x00\f\x00\x05\x00f\x00\n\x00f\x00D\xff\xec\x00J\xff\xec\x00\xa2\xff\xec\x00\xa3\xff\xec\x00\xa4\xff\xec\x00\xa5\xff\xec\x00\xa6\xff\xec\x00\xa7\xff\xec\x00\xc9\x00f\x00\xcc\x00f\x00\x05\x00\x05\x00R\x00\n\x00R\x00W\x00\x14\x00\xc9\x00R\x00\xcc\x00R\x00\x05\x00\x05\x00R\x00\n\x00R\x00I\x00\x14\x00\xc9\x00R\x00\xcc\x00R\x00\f\x00\x05\x00)\x00\n\x00)\x00R\xff\xd7\x00\xa8\xff\xd7\x00\xb4\xff\xd7\x00\xb5\xff\xd7\x00\xb6\xff\xd7\x00\xb7\xff\xd7\x00\xb8\xff\xd7\x00\xba\xff\xd7\x00\xc9\x00)\x00\xcc\x00)\x00\x05\x00\x05\x00=\x00\n\x00=\x00I\x00\x14\x00\xc9\x00=\x00\xcc\x00=\x00\b\x00R\xff\xec\x00\xa8\xff\xec\x00\xb4\xff\xec\x00\xb5\xff\xec\x00\xb6\xff\xec\x00\xb7\xff\xec\x00\xb8\xff\xec\x00\xba\xff\xec\x00\x01\x00-\x00{\x00%\x00\x05\xff\xae\x00\n\xff\xae\x00\r\xff\x85\x00\x0f\x00D\x00\x1e\x00D\x00\"\xff\xc3\x00&\xff\xec\x00*\xff\xec\x002\xff\xec\x004\xff\xec\x007\xff\x85\x008\xff\xec\x009\xff\xc3\x00:\xff\xd7\x00<\xff\x9a\x00=\x00;\x00I\xff\xec\x00W\xff\xec\x00Y\xff\xd7\x00Z\xff\xec\x00\\\xff\xd7\x00\x89\xff\xec\x00\x94\xff\xec\x00\x95\xff\xec\x00\x96\xff\xec\x00\x97\xff\xec\x00\x98\xff\xec\x00\x9a\xff\xec\x00\x9b\xff\xec\x00\x9c\xff\xec\x00\x9d\xff\xec\x00\x9e\xff\xec\x00\x9f\xff\x9a\x00\xbf\xff\xd7\x00\xc1\xff\xd7\x00\xc9\xff\xae\x00\xcc\xff\xae\x00'\x00\x05\xff\xae\x00\n\xff\xae\x00\r\xff\x85\x00\x0f\x00D\x00\x1e\x00D\x00\"\xff\xc3\x00&\xff\xec\x00*\xff\xec\x00-\x00^\x002\xff\xec\x004\xff\xec\x007\xff\x85\x008\xff\xec\x009\xff\xc3\x00:\xff\xd7\x00<\xff\x9a\x00=\x00;\x00I\xff\xec\x00W\xff\xec\x00Y\xff\xd7\x00Z\xff\xec\x00\\\xff\xd7\x00\x82\xff\xd7\x00\x89\xff\xec\x00\x94\xff\xec\x00\x95\xff\xec\x00\x96\xff\xec\x00\x97\xff\xec\x00\x98\xff\xec\x00\x9a\xff\xec\x00\x9b\xff\xec\x00\x9c\xff\xec\x00\x9d\xff\xec\x00\x9e\xff\xec\x00\x9f\xff\x9a\x00\xbf\xff\xd7\x00\xc1\xff\xd7\x00\xc9\xff\xae\x00\xcc\xff\xae\x00%\x00\x05\xff\xae\x00\n\xff\xae\x00\r\xff\u007f\x00\x0f\x00D\x00\x1e\x00D\x00\"\xff\xd7\x00&\xff\xec\x00*\xff\xec\x00-\x00^\x002\xff\xec\x004\xff\xec\x007\xff\x85\x008\xff\xec\x009\xff\xc3\x00:\xff\xd7\x00<\xff\x9a\x00=\x00;\x00W\xff\xe5\x00Y\xff\xd5\x00Z\xff\xe5\x00\\\xff\xdb\x00\x89\xff\xec\x00\x94\xff\xec\x00\x95\xff\xec\x00\x96\xff\xec\x00\x97\xff\xec\x00\x98\xff\xec\x00\x9a\xff\xec\x00\x9b\xff\xec\x00\x9c\xff\xec\x00\x9d\xff\xec\x00\x9e\xff\xec\x00\x9f\xff\x9a\x00\xbf\xff\xdb\x00\xc1\xff\xdb\x00\xc9\xff\xae\x00\xcc\xff\xae\x00'\x00\x05\xfff\x00\n\xfff\x00\r\xff\u007f\x00\x0f\x00D\x00\x1e\x00D\x00\"\xff\xd7\x00&\xff\xec\x00*\xff\xec\x00-\x00^\x002\xff\xec\x004\xff\xec\x007\xff\x85\x008\xff\xec\x009\xff\xc3\x00:\xff\xd7\x00<\xff\x9a\x00=\x00;\x00W\xff\xe5\x00Y\xff\xd5\x00Z\xff\xe5\x00\\\xff\xdb\x00\x89\xff\xec\x00\x94\xff\xec\x00\x95\xff\xec\x00\x96\xff\xec\x00\x97\xff\xec\x00\x98\xff\xec\x00\x9a\xff\xec\x00\x9b\xff\xec\x00\x9c\xff\xec\x00\x9d\xff\xec\x00\x9e\xff\xec\x00\x9f\xff\x9a\x00\xbf\xff\xdb\x00\xc1\xff\xdb\x00\xc8\xfff\x00\xc9\xff\xae\x00\xcb\xfff\x00\xcc\xff\xae\x00\x12\x00\x05\x00)\x00\n\x00)\x00\f\x00)\x00&\xff\xd7\x00*\xff\xd7\x002\xff\xd7\x004\xff\xd7\x00@\x00)\x00`\x00)\x00\x89\xff\xd7\x00\x94\xff\xd7\x00\x95\xff\xd7\x00\x96\xff\xd7\x00\x97\xff\xd7\x00\x98\xff\xd7\x00\x9a\xff\xd7\x00\xc9\x00)\x00\xcc\x00)\x00\x10\x00\x05\x00)\x00\n\x00)\x00\x10\xff\xd7\x00&\xff\xec\x002\xff\xec\x004\xff\xec\x00\x89\xff\xec\x00\x8b\xff\xec\x00\x94\xff\xec\x00\x95\xff\xec\x00\x96\xff\xec\x00\x97\xff\xec\x00\x98\xff\xec\x00\x9a\xff\xec\x00\xc9\x00)\x00\xcc\x00)\x00\x12\x00\x05\x00)\x00\n\x00)\x00\x10\xff\xd7\x00&\xff\xec\x002\xff\xec\x004\xff\xec\x00\x84\xff\xec\x00\x89\xff\xec\x00\x8a\xff\xec\x00\x8f\xff\xec\x00\x94\xff\xec\x00\x95\xff\xec\x00\x96\xff\xec\x00\x97\xff\xec\x00\x98\xff\xec\x00\x9a\xff\xec\x00\xc9\x00)\x00\xcc\x00)\x00\x0f\x00\x05\x00)\x00\n\x00)\x00&\xff\xec\x00*\xff\xec\x002\xff\xec\x004\xff\xec\x00\x89\xff\xec\x00\x94\xff\xec\x00\x95\xff\xec\x00\x96\xff\xec\x00\x97\xff\xec\x00\x98\xff\xec\x00\x9a\xff\xec\x00\xc9\x00)\x00\xcc\x00)\x00\a\x00$\xff\xec\x00\x82\xff\xec\x00\x83\xff\xec\x00\x84\xff\xec\x00\x85\xff\xec\x00\x86\xff\xec\x00\x87\xff\xec\x00\x1b\x00\f\xff\xd7\x00\x0f\xff\xc3\x00\x11\xff\xc3\x00$\xff\xec\x00,\xff\xec\x00-\xff\xf6\x006\xff\xec\x007\xff\xc3\x009\xff\xd7\x00:\xff\xec\x00;\xff\xd7\x00<\xff\xd7\x00=\xff\xec\x00@\xff\xd7\x00`\xff\xd7\x00\x82\xff\xec\x00\x83\xff\xec\x00\x84\xff\xec\x00\x85\xff\xec\x00\x86\xff\xec\x00\x87\xff\xec\x00\x88\xff\xd7\x00\x8e\xff\xec\x00\x8f\xff\xec\x00\x90\xff\xec\x00\x91\xff\xec\x00\x9f\xff\xd7\x00\x16\x00\x0f\xff\xc3\x00\x11\xff\xc3\x00$\xff\xec\x00,\xff\xec\x007\xff\xc3\x009\xff\xd7\x00:\xff\xec\x00;\xff\xd7\x00<\xff\xd7\x00=\xff\xec\x00\x82\xff\xec\x00\x83\xff\xec\x00\x84\xff\xec\x00\x85\xff\xec\x00\x86\xff\xec\x00\x87\xff\xec\x00\x88\xff\xd7\x00\x8e\xff\xec\x00\x8f\xff\xec\x00\x90\xff\xec\x00\x91\xff\xec\x00\x9f\xff\xd7\x00\x13\x00\x0f\xff\xd7\x00\x11\xff\xd7\x00$\xff\xec\x000\xff\xec\x00=\xff\xec\x00D\xff\xec\x00\x82\xff\xec\x00\x83\xff\xec\x00\x84\xff\xec\x00\x85\xff\xec\x00\x86\xff\xec\x00\x87\xff\xec\x00\x88\xff\xd7\x00\xa2\xff\xec\x00\xa3\xff\xec\x00\xa4\xff\xec\x00\xa5\xff\xec\x00\xa6\xff\xec\x00\xa7\xff\xec\x00R\x00\x05\x00R\x00\t\xff\xc3\x00\n\x00R\x00\f\x00=\x00\r\x00)\x00\x0f\xff\x9a\x00\x10\xff\x9a\x00\x11\xff\x9a\x00\"\x00)\x00$\xff\x9a\x00&\xff\xd7\x00*\xff\xd7\x00-\xff\xbe\x000\xff\xc3\x002\xff\xd7\x004\xff\xd7\x006\xff\xec\x007\x00'\x009\x00)\x00:\x00\x14\x00@\x00=\x00D\xff\x9a\x00F\xff\x9a\x00G\xff\x9a\x00H\xff\x9a\x00I\xff\xe5\x00J\xff\x9a\x00P\xff\xc3\x00Q\xff\xc3\x00R\xff\x9a\x00S\xff\xc3\x00T\xff\x9a\x00U\xff\xc3\x00V\xff\xae\x00X\xff\xc3\x00Y\xff\xd7\x00Z\xff\xec\x00[\xff\xd7\x00\\\xff\xec\x00]\xff\xc3\x00`\x00=\x00\x82\xff\x9a\x00\x83\xff\x9a\x00\x84\xff\x9a\x00\x85\xff\x9a\x00\x86\xff\x9a\x00\x87\xff\x9a\x00\x88\xffq\x00\x89\xff\xd7\x00\x94\xff\xd7\x00\x95\xff\xd7\x00\x96\xff\xd7\x00\x97\xff\xd7\x00\x98\xff\xd7\x00\x9a\xff\xd7\x00\xa2\xff\x9a\x00\xa3\xff\x9a\x00\xa4\xff\x9a\x00\xa5\xff\x9a\x00\xa6\xff\x9a\x00\xa7\xff\x9a\x00\xa8\xff\x9a\x00\xa9\xff\x9a\x00\xaa\xff\x9a\x00\xab\xff\x9a\x00\xac\xff\x9a\x00\xad\xff\x9a\x00\xb3\xff\xc3\x00\xb4\xff\x9a\x00\xb5\xff\x9a\x00\xb6\xff\x9a\x00\xb7\xff\x9a\x00\xb8\xff\x9a\x00\xba\xff\x9a\x00\xbb\xff\xc3\x00\xbc\xff\xc3\x00\xbd\xff\xc3\x00\xbe\xff\xc3\x00\xbf\xff\xec\x00\xc1\xff\xec\x00\xc9\x00R\x00\xcc\x00R\x00\x01\x00\n\xff\xd7\x00\x04\x00\x05\x00=\x00\n\x00=\x00\xc9\x00=\x00\xcc\x00=\x00\x02\x00\x05\xff\x98\x00\n\xff\xd7\x00\x03\x00\x05\xff\x98\x00\n\xff\xd7\x00\xcc\xff\xd7\x00\x05\x00\x05\xffo\x00\n\xffo\x00I\xff\xdb\x00[\xff\xd7\x00]\xff\xec\x00\x02\x00[\xff\xd7\x00]\xff\xec\x00\x02\x00\x05\xff\xbe\x00\n\xff\xbe\x00\x1e\x00\x05\x00=\x00\n\x00=\x00\x0f\xff\xbe\x00\x11\xff\xbe\x00\"\xff\xb4\x00F\xff\xf6\x00G\xff\xf6\x00H\xff\xf6\x00I\x00\x14\x00J\xff\xf6\x00R\xff\xf6\x00T\xff\xf6\x00W\x00\x06\x00\xa8\xff\xf6\x00\xa9\xff\xf6\x00\xaa\xff\xf6\x00\xab\xff\xf6\x00\xac\xff\xf6\x00\xad\xff\xf6\x00\xb4\xff\xf6\x00\xb5\xff\xf6\x00\xb6\xff\xf6\x00\xb7\xff\xf6\x00\xb8\xff\xf6\x00\xba\xff\xf6\x00\xc9\x00=\x00\xca\xff\x8d\x00\xcc\x00=\x00\xcd\xff\x8d\x00\xd0\x00\f\x00\a\x00\x05\x00=\x00\n\x00=\x00\x0f\xff\xbe\x00\x11\xff\xbe\x00I\x00\x14\x00\xc9\x00=\x00\xcc\x00=\x00\x01\x007\xff\x9a\x00)\x00$\xff\xae\x00,\x00)\x007\x00R\x009\x00R\x00:\x00f\x00;\x00)\x00<\x00R\x00=\x00)\x00F\xff\xc3\x00G\xff\xc3\x00H\xff\xc3\x00J\xff\xd7\x00R\xff\xc3\x00T\xff\xc3\x00W\x00)\x00Y\x00)\x00Z\x00\x14\x00\x82\xff\xae\x00\x83\xff\xae\x00\x84\xff\xae\x00\x85\xff\xae\x00\x86\xff\xae\x00\x87\xff\xae\x00\x88\xff\\\x00\x8e\x00)\x00\x8f\x00)\x00\x90\x00)\x00\x91\x00)\x00\x9f\x00R\x00\xa8\xff\xc3\x00\xa9\xff\xc3\x00\xaa\xff\xc3\x00\xab\xff\xc3\x00\xac\xff\xc3\x00\xad\xff\xc3\x00\xb4\xff\xc3\x00\xb5\xff\xc3\x00\xb6\xff\xc3\x00\xb7\xff\xc3\x00\xb8\xff\xc3\x00\xba\xff\xc3\x00\x01\x00\x00\x00\n\x00\n\x00\n\x00\x00")
+
+func third_partySwaggerUiFontsDroidSansV6Latin700TtfBytes() ([]byte, error) {
+	return _third_partySwaggerUiFontsDroidSansV6Latin700Ttf, nil
+}
+
+func third_partySwaggerUiFontsDroidSansV6Latin700Ttf() (*asset, error) {
+	bytes, err := third_partySwaggerUiFontsDroidSansV6Latin700TtfBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/fonts/droid-sans-v6-latin-700.ttf", size: 40516, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiFontsDroidSansV6Latin700Woff = []byte("wOFF\x00\x01\x00\x00\x00\x00e\x88\x00\x11\x00\x00\x00\x00\x9eD\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00GDEF\x00\x00\x01\x80\x00\x00\x00\x16\x00\x00\x00\x16\x00\x10\x00\xd2GPOS\x00\x00\x01\x98\x00\x00\x06$\x00\x00\x12\xc0\xf2ZM^GSUB\x00\x00\a\xbc\x00\x00\x00\f\x00\x00\x00\f\x00\x15\x00\nOS/2\x00\x00\a\xc8\x00\x00\x00`\x00\x00\x00`\xa2\t\xb7\x96cmap\x00\x00\b(\x00\x00\x00j\x00\x00\x00\x8cmag\xdacvt \x00\x00\b\x94\x00\x00\x01\x01\x00\x00\x02\x06K\xe2RQfpgm\x00\x00\t\x98\x00\x00\x04'\x00\x00\a\x05s\xd3#\xb0gasp\x00\x00\r\xc0\x00\x00\x00\f\x00\x00\x00\f\x00\a\x00\aglyf\x00\x00\r\xcc\x00\x00O~\x00\x00u\x1c}]p\bhead\x00\x00]L\x00\x00\x003\x00\x00\x006\xf5\xcd \xd7hhea\x00\x00]\x80\x00\x00\x00\x1f\x00\x00\x00$\r\x9b\x05ahmtx\x00\x00]\xa0\x00\x00\x01\xed\x00\x00\x03L\x9f\xc7I\xb4loca\x00\x00_\x90\x00\x00\x01\xa8\x00\x00\x01\xa8da\x83\"maxp\x00\x00a8\x00\x00\x00 \x00\x00\x00 \x03\x17\x02\x14name\x00\x00aX\x00\x00\x00\xb8\x00\x00\x01d\x19w4\x0fpost\x00\x00b\x10\x00\x00\x01Y\x00\x00\x01\xe7\xa2\xc2\x0f;prep\x00\x00cl\x00\x00\x02\x1c\x00\x00\x02beq\u058a\x00\x01\x00\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x02\x00\x01\x00\x00\x00\xd1\x00\x01\x00\x00x\x01<\xcc\x03\xac\x1cQ\x14\x80\xe1\u007f\xb0\x1a\xed\xdcF\xb5m\u06f6m\xdb\x0ek\x86\xb5\x19\xa7\xb6m\xc6\rj\x04\u0573\xc2}g\x99\xef\xf2\b\r\xb0\xa8LC\xb4\x85\xd3V.&\x8c\t\x10\x8b\xa1\x01\u0682Y\xcb%\x06\xc9\x1f&\xba\xfc\xb4\xc4\xfe ?\x98\xad-\u0556Z\u007f\xf4\xea\xea\x93^]_\xab\u007fq\xc7\xea%\xc6p\xaf\xb1q\xd6\xf8\u3558C\xcd\xdd\xe6?3/X1\xd8;\xd45\xdc>|\xd7kl\xfd\xf1\xe3r\xfc?\x91\xf7\x91\x02\u02f2\xfc\xf8_5\xb5\xaa\xfb9\xd6Hk\xbeXo]\xb6^Z\u007f\xec\xadV\x8e\x95couj:\xb7\u0771\xee/\xf7\xb4\xec_^\u3505\xde\u038c\x92\xe8\xf0\x94\x932-C5\xf5s\x94\x9e\xe2\xa8\xf2\x19MU\xfb\x94\x9e\xea\xbe\xfa$~\xa8\x1f\xe8\x94# \xc0\xc2F#\x8a\u00a0&u\bROX4\x146\x8di\x82CsZ\xe1\u0446\u0394\xa1'\xbd)O_\x06P\x89\xc1\xa2\x1aC\x19NuF1\x86Z\x8cc2u\xd9\xc86\x1a\xb3\x83\u0774d/\a\xe9\xccaN\u0403\u04dc\xa3\x1fW\xb8)\u0577y\xc0\x04\x1e\x89i<\xe7%\xd3y#f\u0450\x9a\xb1\xf3r\u05a3\r\xc3i'\xbb=\xb3\xe9 \xff\x8e\f\xa7\xb4\x1a\xbb\x86\x8e\xe3Z\x03\x00<f{\x8f|\x04\x8f\x99\x99_\xd0\x18\x12Wb2\xf6E\xa0\rGhff\xb60(F3\x86\xc9T\xbbK\x9dv\xf3e}v\f{v\xcdT|\xe7\u07f94\xff\u07393s\xa5\x19bn\xf4p\x90G>\x85\xd13A\x89XF\xa5\xbajj\x82\x1f\x06\xb3\xc5Z\xe3\xd4QO\x03\x8d4\xb1 :;X\xa6~9+X\xc9vc7\x1b\xa3\x85V\xdah\xa7\x83N\xba\u8987^\xfa\x19\xd1\xef ?\n\xfe\xec\xe8\xef\xfc\x9fGy\"\xba)xRfS\u0129\xce8]\\\xa8|\rkY\xc7z6\xb0\x89\xcd\xdana+\xdb\u062e\xbd\xfb\xa3g\x84?G\xbf\t\xfe\xce\xffy\x94'\xa2\r\xc1\x93\xe2\x14=\xa7j\x1d\x1b\xdd\xf1\x1a\u05b2\x8e\xf5l`\x13\x9b\xd9\xc2V\xb6a\xf4\xe0\xa4q?d|\xf0\xcf\u0608Fc\x1a\xd3\xd9\u038f\x83t\xe3g\xf2GG\xb1V~O\x11\xa7\x86-\xcf\x043\xc4Z\uaa27\x81F\x9aX\xa0\xfd2q9+X\x19\x1b\xf9\x8c\x91\u01f9\x8f\x11\xd2\xcc^\xbal2\xf9\xbd\xdf\u007fT;\xc5\u075b\xcat\x9eV6\x9fZ\xe5u\xd4\xd3@#M8C\xb0]\xbb\x93\xc6\xfa\x90t#[\xbb\xfcY\xed\xdf\xf9?\x8f\xb2\x905\xace\x1d\xeb\xd9\xc0&Nj\xff!f\\\x1e\x11\x92\xcf\xf8\u06ee\xfe\xf0\xad\xcd8\x1f\x92\xe1\x8a\x1f\t2\xb1\u039d)\x9cusy&\u015a}\xc9\x19S\u07d93\x97\xee\x8cx\xabwfTl%\x14\x9a\u0152 B\xfa\xf7\xf9^u\u007f\x1a\x12\xd6\xfa\xe3z<\xe1\x1ed\xab\xcb%\x8f|\n\xf5)\x92y1%\x8eK\xc52\xb1\\\xac\x10\xab\xc4j\xfdk\x98\xc5l\xe6P\xab\xae\x8ez\x1ah\xa4\t3\x90\xf2\x19\u06a5\xcdn\xf6\xb0\x97}\uc9d9\x16Zi\xa3\x9d\x0e>p\xfeN\xb1\x8bnz\u895f\x01u\x83\f1\u0308\xf1\x0fr\xcc\xef\xe3\xae\ub939\xf9\x90H\x90n\xd62\xf9c\xaa\xd9V?3\x9c\u04eb\xd7\xfb\u1115\x9a\xad\xec\xaa7\x1cE\u028b)\xf1\xbbT,\x13\xcb\xc5\n\xaa\xa8u\\G=\r4\xd2\xc4\x02\u05d2j\xe5\xef\xd2f7{\xd8\xcb>\xf6\x93\xecM\xf8\x81>\xc9\u0786\x03\xea\x06\x19b\x98\xf8\x1c\xb9r\xef\xef\b\xe9f/\x13Oy\xc2\x13\x96\xad,\x97<\xf2)TVD1%\x8eK\xc52\xb1\\\x8c]\xb58\x87\xe4o\x86\xb7S>\xa1\xbb\xb4\xd9\xcd\x1e\xf6\xb2\x8f\xfd4\xd3B+m\xb4\xd3\xc1\a\xfat\x8a]t\xd3C/\xfd\f\xa8\x1bd\x88aN\xba\xd6\x0f\xf9m\u04b7Q\xaeVy\xe4SB\x19\xa9\xeeS\xb3\xfa\x16Zi\xa3\x9d\x0e:\u989b\x1ez\xe9'\xfeF\xcbN\xb2\xea6%d\xf4\xb8^\xd9\xcas\xc9#\x9fB\x8a\xdc\xd9bJ\xfc.\x15\xcb\xc4r\xb1\xc2\xfcV\x89\xb3\xf4\x9d\xado\xec\xc9UWG=\r4\u0484'7\xf5*\xd4f7{\xd8\xcb>\xf6\xd3L\v\xad\xb4\xd1N\a\x1f8W\xa7\xd8E7=\xf4\xd2\u03c0\xbaA\x86\x18fDn\a\x89\xaf\xc6I\xe1j\xac\xf6\u03aaa6#\x1c$~\xe7\u0185w\xaePi|6G\x05\x11#\x8e\x8d\u05c5\xe5i\xe1\x98\xd9\xceT\xc8.v\xb3\x87\xbd\xecc?\xe1\xf8\xe1}\xa94~<\xb7\u02e5\x05W\x94\xa6\x85\xe7+\xb9\xb4>\x93\xad\xc30\x9fq\xe1\xf7\xb5\xe0\x8ao\xe3\xc4\xd8JkN\xbej\\\u07ff\x82W\x82?\x85\xfb\x8e\xc9\xde\x1e\xe9\xd6\u042f\xf9\xbd+\xbf\x91}\xc8\f;\xb5\x02e\x95T+\xab\x11g\x8b7\xfb\xb5\x1c\xd1\xe7 \xf1}\xca_\xae\x97\x95\xdc\xe7\xdeRf\xb5w \xbb+\xe7\xec\x8d+\xb2;s3\xd9\xc9\xec\xa2\u033e\x92\xd9E\x99]\xb8\xf9\xac\xf49\u0215sf]\xf2 duB\x1e2\vN\x8b\x1f\x8aY\xe1\xbaNK|C\x86;\xbf\x1b\u0677e\x84#e\\\xba\xb6\xf0\x9a\x16\xb28y\xbe\xe1\bYIG\xa8g!\x8bX~\x03#\x85;\u0404\xa7e\xe1\r\xf4\x9e\x90r\x1f\xf1\x8b -z&a\xef\xf7\xaf\xe8\xb7\xc1\xe3)\xf6\x80O\x8b\xf3I\xb1;I\xb2K\xbf\xf5]f\xea\x91\u007fp\u056e\xe9\xbf\xcc ;\xf5HI\u07e9\u079bL\x92[DL\xb3f'\x9b\xc9p\xe7\x9a\xf8\xcd3c\xc3\xcez\xf8\xaao\xdf\x13\x9e\x96)\xdaM\x8d\xfd\xd51#\xe1[X`\xf5\xdf\xc0\xf70|\xb3\\\xf9]\x9co\xbc\x87\xe1\xdb\xe8\xfb\xe6\x8cc\xe3_\x8f\xf0\xcb1\xda{dC\xacnL\xf8\xebC\xc69z!\x88P\xe0\xf9v\u0141\x1d\x99\xd6\xe1/\xf5\xc3A\x84_\x87c\xa6;\xca\xe4\xf7\xd1\xce \xd7\xca\xcd#\x1f_\xaa\xa0P,\xa1\x8cJ\u007f\x996\x8b-\xb4\xd2F;\x1dt\xd2E7=\xf4\u048f|\x83S\u0465\xb1\x9c?\x12?\xb5\x1a&$\x9c9\xfc&\xe2\xef\x1d\xf3\xf2\xb7;\xf1\x1f\x87\xbb\xfd\u07c6\xef\x00\xe8\x11\x93\xb0\x00\x01\x00\x00\x00\n\x00\n\x00\n\x00\x00\x00\x03\x04c\x02\xbc\x00\x05\x00\b\x05\x9a\x053\x00\x00\x01\x1e\x05\x9a\x053\x00\x00\x03\xd0\x00f\x01\xfc\x00\x00\x02\v\b\x06\x03\b\x04\x02\x02\x04\xe0\x00\x02\xef@\x00 [\x00\x00\x00(\x00\x00\x00\x001ASC\x00 \x00  D\x06\x1f\xfe\x14\x00\x84\as\x01\xec \x00\x01\x9f\x00\x00\x00\x00\x04^\x05\xb6\x00\x00\x00 \x00\x02x\x01c```\x02bf \x16\x01\x92\x8c`\x9a\x85\xa1\x02HK1\b\x00E\xb8\x18\xea\x18\xfe3\x1a2\x1dc\xba\xc5tGADAJANAI\xc1J\xc1\xe5\xff\u007f\xa0\x1a\x05\x86\x05p9a\x05\t\x05\x19\xa0\x9c%H\xee\xff\xe3\xff\x87\xfeO\xfc\xfb\xf7\ufaff/\x1fl~\xb0\xe1\xc1\xfa\ak\x1eL{\xd0\v\xb4\x01'\x00\x00;\x03#\xf4\x00\x00x\x01\xad\x8a#`.P\x18@\xcfw\x9fm[\xe5iF[\x1e\xd3V\xff\xb8\x1ef\xf4\xb9\xcd6\xdal\xdb*C\x99m[m\xf69\xf7~\xbe\xfd\x92\aX\xdd\xca\xe2\r\xf6\xb7\xb2n5\xb2\x1fnjx\x85+lO\xc0\xfe\xb8\xf5\x92k\xe5.\x00\xa2#\xc6\xf2E\xee\x88\x05\x00\x8b\xf4\xd1I=i\x14\xcb\x1f\xa2v\xb5\xdd\x15\x10C1\x11-\xf9&/E\xb1\x84\x1f\x009\xbb:\uee8f\xbd;<\x01D\xb1\xc6\f\xfdtr\f\xf2\x9e\x19Bi\x97\x17\xfbf\x0fI\xa2\x1d_\xb2\xf7\xcd4\xe2.oX\xa4W\xace\x89\"j8\x9en\xb9\xbb\x17i\x12@^\x02\xb0\xa1\xb2h\xbe\x11\x00\xf80\xc4\x1a5*\x82$2\xc5\x02\xc4\x19?\x86H\"\x16\xf0#\x89sp+K\x99\xf1r{\x9a)\xba\xa8\x03*H!\x8a\x00\x9c\x00\xc4H=\x95vP:rW\xfd\x92\x01\xc9\x12\xe8c\x9a\xf6[Y[\x05\xa4\xa9\x8d\xed\x05b$\x9a\x11l\b!m\a\x1aUO\x85\x00\x00\x00x\x01uSG\x93\xdbF\x13\x1d\x80Q\x19Td\x15\xbe\xcf\x1e\xb8\xc5U\"\x95s\x84I\fDZ\x91AU\x039\x01\x9b\x8a\xeb\xd3^\x9c\u04de\x1cf\xe5\xff\u0490/\\\x9f\xf4\a\xfc\x1b\x1c\x8f\xde\xe3\xfa*\xf7\f\x01e1\xf6{\xdd\xfdf\xe6\xf5\xc0\x17\x91\xbc7\x1a\x0e\xfaw\xef\u073eu\xf3\xc6;\xbd\xee\xf5P\x04\x9d\xf6\xdb\xfe\xb5\xabW._\xbax\xe1\xfc\xb9\xb3gN\x1c?v\xb4\xd5<x`\xa6\xb1\x1f\xde\xf2\u07ac\xef\xae9;\xb6o\u06f2yS\xb5R.\x15\v\xb6\u015a\x02\u0098\xe3L\x8c\xc5\x19\xe8v[\x1aCBD\xf2\f\x11#'*|\xbe\x06yl\xca\xf8\xf3\x95>U.\xbeP\xe9\x9bJJ\xe5\xb4\xe5\xf0\xcb\xecr\xab\xc9\x05p\xfc5\x00>\xb1\xee\xf7%\xc5?\x05\x10q\\7\xf1-\x1dS\x87\x01\xdb\bx\x1eupQ\x1f\a\x1c\xad\x98\v\f?\x19+\x11\a\xa4\x97n\xd9\u0701\xce\xc2\xe6V\x93\xa5\x9b\xb7P\xb8\x85\"<\b\u02e9u\xf0\xaae\x02\xfb\xa0\xb8\x98\u06ac\xbaM/\x8b\x85\x86H\xe6\xf1n_\x8a\xc0\xf5\xbc\xa8\xd5\xec\xe1v\bL\x8au\x8c$\x96;X1\x92|Io\x9d\xad\xf2\xb4\xf9H=\x988l6>\xb2u\x1e\xe6\x93\xf7$\x16\x12\xeaU\x05\xa1\xd4\xf7X;\x82\x87 \xc0C_\xfc]\xa7\x93/`\x13\x02\x81G\xb4\xea\x8d\xc1\x93un<]\xd2\xc2R\xc3\x01\xae6\x18\x1d\a\xd6\xffy\x9eI2\xa6\xdcp6\x98\x0eC\xb2W\xa9\x10x\xa8b\x95L\x1e\xaf\xcc\x02w@\xa5[\xb7\xaaeA\x0e\xb3\xbb\x12-\xe2\u007fYu1|\x10\xa1\x13\x8f\xad\x8b\xd9a\xc3\xc1\r\xdc\xd5\u007fW\xa2\xdd\b\xf98!\x86>\xd7\xc0;\xefz\xb5(\xaf\xb9\xfb\xba4##\xb0\xac=\xf5<}\xf0\u0549\xcff\t\xe0J_N1g\xb3\xeeC\xe6\x1f;\x12\xa1\x1d\xeb\u0323<\xb3\xe7\x9e\u03ac\xe4\x99'\xed1xd\xc6P*,6z\xf3 \xc8\xe3\xd5\x04Wf\x91'\x1f\xe9Q\x80\x83\xdb\xffu=P;k\xfc\u00b1\xc8\xd4r,P\xed\x12\xc7\xd2\f\x96u\u05f3\rtSt\x8br4\xa0`\xfa\xb7\xee*J\xd4v\xf2\v@2ZG\x80\x88\xb3\xcf'\xe3:\t\xf0V\x13\xbbG\xa6\xa3\x1fI\xf4\x03\n\xfc$\x9b\x91H\x8f\x1f\xa3\x8e$\xa6\x11-\x05f|x\f\x96q7\xb4\xf3y\x9am\x89\xa5\xa14-Y\x1b\xee\xee \x8b\xe7\xb2.<&\x02\"\x81\v\x15\x9b@\xc4Z\v\xfar\x8d\x9dz\xfc{z\x9a\xbb?\x9fb\xa7Y\x14\xe8\xe2\xbd\x1d\x89\x85\x19\xa1\xe4\xfc\"\xbe\x19\xbb\xf3\xc8\xe3E.]\x0f\xfd\x88\x06\x1c\x81\\\x88\xf0\x90q\xe8\xd0\ufd1cgVD\xbb3\x927\x86p\xa3\u007f_\x9e7\x1b\xc9\x13$G\x1e\x8b\x17d@\xbaS\x19\xbarXmT\xb9\xb4\xddBD\x85\x0e\x11<\xa4\x00\u0697\xe9\x17+\x8d*}\x1d,OY:\x11%\xb8\xb4\\\x96W\xd36\xf0\x10\x17\vAVG\xf8yQ\x02\x85F\xa7\x9b\xab\x955$\x9dN\xd7\xf5\"o\xfaj5mJ\xf3la\xea\xa8jS\xbbY\x8ab\x8eE\xe2l\x92\u0454\xf1\xb2\xae\xef<\x97\xb0\x00\x11\x8c9\xfaw%\x9d\xcd\xd8c\\\xce\xcc0\x9eg\xb3\x1a=\x87r\xb3\fB\xe6QZ\x83\xdcL\f\x8f\x10z\x06_'\xfc\f\ucf90\xee\xe5i\xae\xaapc\xa8\xb48d\x82\x8cv\xdeC\xa6\xaf\xb0\u007f\xbe\xe6j\xca\xd2\xcf3\x84\tp\x87\x87\xd3\xe7Y\xa5\xbe\xaf\x9f\xe5\xf1E-\x02\xbdy\x05Cy\xd9T\xdf\x18\u022f\xdd/(\xc0\x9d\xec\x86uc\xd4n5S\x9b\xb5S\xb0~\u89fe\xf5\xc3\xf0\xbe\\s\x18\xe3?\x8c\xe4C\u06f2;q;J\xf7SN\xaeq\xc6|\xc3\u069a%\xd2\x00\xae\x81V\x1a\x10\xa8\x9azw\xcdgl\xc5d\x8b\x860xnb1\xc3Us\xcebs\x13{\xca99g\x13W\x9cr\xbe\xe1\xf4\x8b\xa6T\x1f\x93\xc7\x12\xb8\xe0\xf3z>_Ec\x15G\x81v{/9B\x1f\v-\xb8J\xee\xc0\xd5\u0532\xcb[q3,\xb4q\v\xb45\u007fM\xf3\u05e6|Y\xf3\x15h\xa3\xb5\xd7j5\xbfP\x8e\x80\x8dz\xeb?v\xf0\xf3\xb7\x00\x00\x00\x00\x02\x00\b\x00\x02\xff\xff\x00\x03x\x01\x8c|\t|\x13\u05f5\xf7=\xf7\u03a2}_-k\xb3,\u0276lK\x96l\u02f2\xb1%\xc0\x1b\xc66`\xc0\x80A\xb6\x03f\xdf\xf7\x10\x02&%)%ib\xb2\xbc\xecih^K\b\xd9H\x9aR\u06a4M\u04ac4_B\xf3\xe5\xa5)\x8f\x97\x12\xd2f\xe1e\xa3yiK\x88=|\xf7\x8elL\xc8\ubbdfd\u034cF\xd6\xe8\xec\xe7\u007f\u03f9w\x10F\x9b/|\x00o\xf1G\x10Av\x94\xcdL:\xec|\xcfy\xd6I\xbc\u03a83\xed\x1ct\xde\xef\xe4\xdf!\xf02\x81\xad\x04ld\t\xc1\x84\x00\xd1\xdd\xfeG\f\xc70\\\x89a9\x06\xec\xe3\x00q\xfd\x1c\xe6@y\x8f\x19\x13\x94\x8e\x8e\xbc\x01\xd1\xec\xfaD\x96>>\x8bgs\x8f\x8a\x18\x04\x88\x1f*\x1bp\"\xee\xc1V\x8b\x0e\a\n\xca1\xec\xff*\x01=\xd2\x03\xaeX&\x18H\xc7\xf2\xf3c\xe9@0\x13s\xc1\a\xe4\xcd\xf3'\xa2\x13\x8bL\xa6\xa2\x89\u0472L\x89\xd9\\\x92A\bat\x1d9@&\xc9\xf4\x8a(\x9a\xc9\xe3\xee\x14Ee\x9f\x12\u041d\x88\x18\bV\x10\x01\x01}\x88\x84\u0491HD\xb3\t\x88\xf6fOgM\xa9\xe8iJ\x01\xa1$\xd0\x17\xdc[\xfcR1\xfe5\xdd\xf0GF\xceb\x03{\xb1k\x97!\xc4I\xfcS\u0205\xbc\xe8\xf5\xcc.B\xf2\xf2\x1c6\x8f[\xe4\x04\xbb]p\"\xe08\xfe\x89\xaf\x1c0\xdd\x01\x0e\x87\xdf\xea\xcdWpJ\x8b\u0164\u05e99\xf3\x13\xaa~\x03\x18\f\x1a\x8d\xf2\x1b\x15\xf4\xab\u05a9\xb0*\x1fZ\xb5\xa0}L\xa3\xe04^\xf4\x11\xfd\xf41\xa3\xd3j\xfcJ\x03\x1fh\xe0\x16\r\xcc\xd2@L\x93\xd1\xe0O\x8c\xdf\x18\xf1}F\x98o\x84\xb4q\x9a\x11k\x8c\x1a#o7\v*\x1eE\x13\xe9\x84)\x95\x8aF\xb3c\x0fc\"a8\x93\x8d\xc7\xc7\xf6@?\xa2lRF\r\x9f\xdaSq\xa3\u025e2\xd27Y\xf6&1\xfa.\x11\xa5\x9c\x8b~+\xe5\xdc\x1c`\xaf*\u007f\x92\xbe\xcc\t\x92`/+\x9fH\x06\xc8GQ\xc0\xd2;\x1d\xff\xd5\xf9\xdb\xf6w\xda>\akt\x18\xfc\x1d';^\xee|\xa7\xf3\xec\x88\xfb\xc5\u82e4\xfd\xe37\xa4\x15p;{\xbd\xf1\xf1\x9bp\x87\xb4\x9c\xbd\xde\xfc\xf8cD\x1f\x04-\xbc\xb0\x97\v\n\x16\x94@\x13\xd0d\xf4F\xa69T\x9e\td\xbe\xc9@:\x03\x99Z\xc1\xfc\x95\b\x1f\x8a\x80D\x83\x18\x13\x89(z\u0515\xae\xcaH\xe5\xf6\xca\x1b*\xf9\xcab=\x9a\x860j\xe2\xea-\xf5\x85\xf5\x9b\uabed\xe7\xebu\xfb<\xfb=\xd8s\xf4\xc2s\x99\xb4Z\xdf\xea)+\x9981\x94\xb2X\xca3G2\xb0\x97^\xd3\x1c\nft\x96\xd6`0\xe0\veB\xd3C\xbbB\x87C\xbc>\x04\xa1Z\x9d\u066c\x98.\xf6\x8bX\x14\xf9\x8c\x02\x14(\xcadDegd;v\x1c1\x9aR\xb20\x8d\xf2\x93\x1aI$\x9b8\x965\xfc)\x1b?\x965\xa6\xe8?\u0477\xf1\x04\xfb\x17\u00f18\x15\x1f5W\xd1\x1a\xa8*'a\xa3\x87\u060d\xa1p9\x84\xcbI\x15\xb5\xe6dU\xc2\xea\x01\xbbHO\x18\xed\x1e\xc2W\x96\u3c35\x01\xc0b\xb3W\xe9\x80\vV-\xbfw\xc9\xdeI\xeb\x16\u038b\x94,Z\xb1\xbaR\xa1T\x18\x84\xf9?\x98_\x96Zqg\xdf\xde9G\x06\x16O\xbc\xb1!\xdcwSo\xb9\xf4\x966?\u2b6b\x91\xee\xa8LU'\xe1\xd8\xd4]\xfd\r\xaa\u05cfa\x8d\xcdk\x06\x855\xe4\xb5\x11h \x1c\x11p\xa0\xbdwC\xeb\xd4\xed\xf3S\xca\xfb\xee\xe0\x8b\"\xff\x9dW\xccK'u\x81\xb6\x05\x1b\xba\x1c\x85\x1e\xa7nX9\x01\xdf\x14M[\xcf\b1\xa6\x1b\x1e\xa5/|.\xbc\u03bf\x86T\u0203\n\xa8\x95OD\xf7\xfd\xbc\u00a1\u0536\xa6\x8f^\xf88\xa3\xa3\a\xb5\xec]\x15\xdb\xe4\xb3S\x85\xf4\xc0\xc1\u0799\x8b\xe8F\u01ce\x02O\xd5\xfc\xbc|^\x01\x14x\xbb}\xe0\xf3{\r\xfe\xa3\x17\xcef\x02^\xbf\xd7o-~\xaa|\xb2\xf0\x94\xfa\xe7\xe8)k\xe4H\xfd/BG\x12\xce\x02\xc1O\x8e\x18~\xa18\x92'\xa2\xf4\x99\xe13\xd14\xdbB\x94n\f\u007f:#\x1buM\x8d1\x91\xa5\u007f\x86\xe13\x151\x14\x81H\x04E\xe8\x96m,\xb6D\xbc\xba\xaa2P \U00023062j4p(!\x00\xe6\u007f\xfe1\u0515\xc5+\xa2\xfd\xf12x\xba\xb8\xfb\xda\xf9\xb3\xaf\x99SZ4\xfb{=\u077b\xe7\x96\xe1{\x86\xdf\xfe\x82D\xd6}\xfb\x1fv\xd1\u007f\x98\x95\xfb\a\x0e\r\xee\xb8z\xd7\xf9\xed;V=\xb2%\x9d\xde\xf2\u022aU\x87674l>\x04\xad\xe7\xdb\xf8#\xc3x\xec\u04c7\u0667\x0f\x8f}\xcal\xbf\xeb\u00a7\xfc\vT\xbee(\x85\xa6\xa0\xfb3\x13\xc3-E\u0175{kqm\xab\xa7%PH\xaf\x1cj\xfc~#nl\xb5\xe0\ua91e\xb3\xc0W\x1e\xf8\xbd\xe7=\x0f\xae\xf3L\xf5`\xceb\xb1\xe0\"\x8f\xc5\xe2)\"*5\xb8\x00\x03bf_\xa0\u0534\"4\xb5\xbcE%\u007f+\rig8\x9c(+\f\xb4p\xe0\xe4\x12\xbc\r\xac(\x9dN\xa4\xa9\x97\xd3\xf0f\x94\u075d\n\xd8H\xcd;\x91\xa5\xc7\xd1\\\xdc`\xa7i\xac0\xca[\x03\x15u1\x84u0&\xb4$\xb3\xe2\xf1\x98,B\x03$\xfd:\"\x06-\x1ez\x92\u06a1\x0e\x80\x9at\xa0@\x87\xad\u0524\x1b\x80\u007fA\xdas\xc5\xf4\xe77]\xf9\xc2\r\xed\xc1\xc6+&\x84\xaa|\xba\xfa\xd5w\xf4t\u07fc|BY\xfb\xd2:\xe0\x02Uf\xa8\xd7\x17W7G\x86?\xf1\xa5:\xca&,\x89H\xaf%j\xa0\xd5\xe2/\xb6\xda\u0282\xf6\xf2\xa2\x8ei\x03\u0249\x13V\u07d5\xed\u0636pza\xf9\xec\x993\xcb:\xb7\xcf)/\x99\xb1\xb5\xbdi\xe3\u00ae\x80\xf4\u0564[\xdaR;\aw\xa6\xae+m\x8e\xe5y\U000e1b64\x1f\xef\xf0F\xf2\xb5\x1aW\x99\xbfrAy\xe9\\\x04,\x17\xc0\xbdr.\x88e<z\x1e.\xf0\xf0{\xfe=\x1e\xf7\xf1\xe3\xf9@N\ar6\x88fs\xb9 \x9b]\x9fK\x05p\xef\xc5\f\x80\xe8\x03P\x97\xf4\f\xdeF\xafgF\xf9\x19\xbdN\xf8\xab\xf2l\x14\xa5\x11F\xba\xaf\xf9sT\xd44\u061e\xf9\x94F\x033\x93[B\xc0V*#{\xa0\x9ct\x15\xb6\xad\xef<\u007f\xe3\xbe\xc2\xd6\x15M\xe7:\u05f7\x15\xe2\x8a\x1d\xff\xf3\xc1[\xd9\xe7\xa5\xf8W[?}\xff?z{\xde8}\x96]\xbf\x9e^\u007f@\xbe\xbe#\xa3\x16t\u007fU\x9fEV\xdd9\xfekvm\xea\x15\x9f\x8eE\x9a@\x03U\n\x0e'<\x04\x0f\xb0k\x9fkZ\xd1Z\xb8\xef\xc6\xf3\xb9k_}\xf6\xf4\x1b=\xbd\xff\xf1\xfe\xa7[\xbf\x827\x9e\u03fe\xf5\xc1\xff\xb0k\xa7q7\xe7\xa6\xf1W\x87\x02\x19K\x06A\x05\x02t\xad\xee6\x1d\xd6y\x05\x10\x04\x84P:\xce$\x90}]\xce\xc5$h\xe7\u0362\x1a\xc2\xe6`\x92'\xf8p1l\xf6K\x8f\x9c\xfa\xf3\xbd{?}Wz,\f\xab\x8b\x05\x8b\xb4o\u0670Czg\x1b\xa4\xa4c[\xa18\xef\xfc2X'\xcbi.:\xc7\x19\xb8\xc3H\x8d|\x19\x9d((\x0f\x11\x8c\xd4J\xf4\xa8\xc0\x11\x14M$\u03b0\xbc\x14\x8f\xd3\x1d\xfd!\u007f\x95\x9f\x9a&\xcd>\xc6\x00\xbc\"\xdd\fkO\xc2\x1a\u9593x\xe0$\xac\x97\x86NJ\xb71\u06a5s\xf0\x1a\xfa\x1ciPwf\xe2~\xdda\xdd{\xba\xb3:.\xaaK\xeb\xf0\xc3\xea\xa7\xd5x\x82\xba]\x8d\xb7\xa9\xf7\xaa\xefRS\x0f\xc9S\x97\xa8\x89\x1a\xdd\x11\xe2\xab\xf9f\x9e\xf0Q!-L\x13\x88\xc0\u07eb\xceP\x97Q\xa3h\xe43\xcagb\x14{0v\x83:\u0084\x9a\xf4\xc3k\xbap4\xe1\xfc/\xbd\xdbeS\x80\xe3\x9d\uaaee\xde^S\u007f\xed\xee\x1dU\xb2~\xe0 \xee\xc6\x0f \x82\xf22Z\xcc{y\u0605\x00\xa1\xa7\xe1\xd74\x86\xb1Tkx\x83j\xbf\xcao\xad\xc7N8x\xfe<B\x90\xc3O\x90\xa2:\re\x9c\x87\xad\xefY\xcfZI\u051a\xb6b\xd5\xed\b\x19P?\"\x88\xbfG\x8f\xa2\x8c\xa4\xcf\x18-\xc9\xcb \xd0\xe6\u02f1\xcf\xd0wa\x0f\x02\xaaWD\x1ae[/\xca\xe8\x04\x00%\x01B\xaf\x8fx\xc04\x10\xff\f\x03b\xc8\v\xa25\t\x1a\x00j\xa8\xe4\xb3Y%\xf8\x814\x8e\x9c\x92>\xc1~\xfe\b\vb\b\xd3\\\xf0)W\u033fN\xe9\xf5#OF\x9f\xb7\x06\x05,kT\xeeMz\u047e\x89wR>\x19\xa7,F3[\xc4r\xa0\x00\x1a)L\r@\x89\x06\x13?\x1a{C,\"p\xc5\xc9m\xcf\xee\x19|\xe6\xea\xfa\u457f\u0673\xf3\x99\x9d\r#m\xdd+\x96\u035f\xbf\xacjJ\xb9\x05\x9f|B\xfa\xef\xdf.Y\xf2[\xb0=\xf1\x048~\xbbt\xc9o\xa5\x8f\x9f<?|~\xf8\x9b\x91\xcc\xce_#@\v\x10\"\x15\x94*\x03\nf,z\xd0\xe9D\xb4\xe6n\x00\x1f\xf4\x03\x06\xbd\x80\x1c9\xa7\u02deI$h|c\x91\xcb\xc8\\OG\xf4\x10\x86\x04\xa9\x90^\x03B\x80wx|\xfa\x83\xb7\xc3;\x12\xe9\u031b2m\xba_p\xb8=\x9a=\xbf\x82\xadLn\x9d\bqa\x1a\x9b\xfd\x14-:\xfd\x8a5\u0380W\x9f\xc1\xd3q?&X\xe1\u04e9-\"\xf6\x01\xfd\xa1c\xf1\xf41\n\xb6\x80a\x05\u02bd\xfckU\xd0@dV\x051\xdc@\u0194\xa6\a\xab\x9f\v\x0fG`\xee\xc4\x15\xed%\xf3\xa6N\xbbe\xfa\xc1\xb2\x85[n\x9a\xbb\xfc\xc1-\xe9\t\xcb\xf6v\x1e\u01b3\u0781\x8d\xcd[\xd6m\x9a\xdc\xd6\xd5\xd9\xfaJ\xf1\xd4\xda@\xed\xca;\xfb\xba\xef\xbb\xe3\xdf:\x9e\xd0\xe5\xf4\x99\xa2zpR\xba\xea\u041cL\x82W\x03_\v<*(0*\x8b\xd7 \x94\xbfFY\x1f\x1f4\x0e\x19\xb1\x91/\u063a*\x00\xb5\x81\xb6\x00\x0e\x04\xec\x15\xa5\x9b\x92\xa2}\xb3IG5\x95\xa0\xaa\xa2\x143\xf90\xb2e\xaai\xf8\xa7gL)\xa6\xfe\x1ch\xf1@\xce\xd0B\f\xb9$\xe2\rT\x97\xe58\x02U\xecpT\x8dc\u0311\xcf+fo\x9c\xfc\u0111\xa6\xa1\x13\xb7n\xf9}O\xd9\xc0\xc0\x15\x91\xee\r\x8d\xee\xe0\xcc\xef/\\\xb6d\xc1US<W,\x8f\xcdl\xa9s\xdc[\xb2h\xd3\xf7\xdbW=\xb1\xb3\x89[\u06fem~\xbdA\xb0=|s\xff\xbf_99\\\x04\xa2\xa3\u0429\xf1\xd5\u0388\x95MI\xe4\x9f\xf0\xa7\xda#\x9ds\xcd\xee\x80\xf1\roe\xd8\x16\x9dw\r\xc3\xd9\x1cB\\=\u057b\x8aj\xb8&\xe3V\"\xbcF-\xdeM\x00\x11 $\xcf\xc1\x03\xbfY\xe9p`\xa3(`f\x02\x8c\xc9\xc4i\x16Sdn\xe5\x00\u00c6\x13F\xbf\xd1_\x054\xbc\xf8i\n\xe3\x92\x01\x1d\x88\x84\xab?,\xbd5\xf2\x13\xbc\x1a\xf2\x0fK\x01\xc0\x84\x10P\x9a\xca\xdc_ATz\x13\xa2\xef\x90\xc3\xc3\xcb\xcfi+\x1a&M(S\x95\xf4F\xa5\x9b\x98.\xba\xa9.L\x94\x9e\"\xb40\x13\b\x86\xf8\x905\x84C\x05\x85\xbc\xdfgr\xb4\xee\xf5\xc3v?d\xfd\xab\xfd\xd8\xef\xd7;\xd6\xf0%z\x96\x9d\xed\x1a}\xab\u07b5\x89C\x16\x84\x11R\x057\x16\b\xd6M\x06\u0568^\x18\xa1\u050f\"\f\xeb\xc8p2bJ%\x18\u06a1t_\xe2\xfb9\x9dT_\u0503\x99rD\x1a\x00w\xf7>pec\u06fe\xb7\xafO\xaeZ4\xaf0\xb0`\xd1@\xd9\xf7\u007f\xb8w(\xaf.Ui\u079e$\x9c\xa4p\xf8f\x93\x03\xb5\xeb\x1e\\\xb5\xf5\u05fb\x9bUf\x8f\x05\u0516\x80S\xbfv\u06ea\xf5\x82J-L\xc2g\xa4\xf3\xd2i\x91\x19\x1bF\ud53f\b\xff\n*\xa6\xd6\u0591\x89\xf2\x05\xa0*\x02\x15\x01\xbf\x16\xb4\xdadt\x8d\xaf\u079a\\3\x9d\xc6*\x8c\u26ed\xd8era\x97K,\xd9\x14t\x1a6\x8b\f\xbf\xe5\x18J\xb0\x18x&>\xca\x133\xb1\xac\x99\n\x9e\x99\x8e\xddZ\x0e2\v\x89q?a\f\xf2\xe3V\u01b2e\xbb\xbdn\xf1='n\xb6\xc6\x131shvd\xcfcK\"\xbc\u0192j\xef\xab\xeb\xbbsy\xcd\xe4\xab\x0f\xafY\xf5\xcc\r\xd3`\xb8xr\x85k\xde\xfc\xf2\xf6j\xb731\x15\xaf^\xfe\xfbg\u007f\xb2\xad\t\x13\x81\xfb\x87R=\xf9\u0283K\n\xd3ey\r[\x1eY\xbb\xf5\x99\xddM\x1d?\xfa\xeb\a\xdet\xff\xa4\x95\xdb\vk[\x83\x89\xc53\xe2\xb2\u007f%e\xbf\u007f\n\t\xa8,\x93\xa7\x06\x00N1\x88\x87\xf0\xfd\x98`N\x00\x01\xf1x#\xc9E\x18\xe6=\x89l\x94\x06\xf78e*\x01T\aV8\x8e\x15#\xfd\xe4\xec\xc8'\xdca\xe0~\xfb\r\x93#A\xadT\x8e~\xfe\x18\n\xa3Z\x1aW\xee\u036c\xe0\x8d\xa0\xb2\x03O@\x15\x04\x85\aD\x15\xa8<\x01E\x1b\xb4\xad\x19\xe6\xe1\f\x0f/\xf3\u007f\xe01\xcf+b\x10[\xa3\x9f.f \xb3\xe6\xfd\xc0\x97\x01|,p\x82\xb9\xb3X\x04Ek\xa6;\xfb\x9d\xd8\xe9Q\xa9\xaa\xa1\xfa\x93\xa6o\x9apeSc\xd3@\x13\x11\x9b\xa0\xa9\t\x95m\xb18\ubda0\x9c\x12r#\x93c\xd9T\x8a)\"\x9b`\xaeO\a-\xf2\x11;\xa4\xb0:\x9b\xd3K\x16\xc6\x00\x9d\x87\xb0\xddep\x8f\xe4\xd0\x1d\v\x05Q\xd0\x11\xf3\xa8z\xec\r\x84\x9d\xc2U\xf3\x1f\xb8\xaa\xb5\xa8\xb9\xbf\xa6vmwe\xeb\xf7~\xbez\xcb\u045d\x13K\u06d7\xd4Vt\xa7\x83S\xae~`K^\xa2=\xbe|Y \xd9\x1c\xb0\x95\xb6&\xf2_\xf7\xa7\x8a\x1d\xceH\xca\u7b49\xe49Jj\xf9c\xa5s\xaf\x9d7i\xe5\x9c\xc6|o{\u07d6)\xf3o[VS=p\xcb\xfc\xa9W\xf6\xb7\xe5{\xa7\xcc[5q\xce\xeey\xa5\xdf<S49\xe6Z4\xa3dr*f\xd3\xd9\x12\xf5\xad\xa4\xc6\x12\xaa\t\x94\xd4G\x83&C\xa8\xa2\xa1(P\x13\xb2\xa0\u045c\xe5\x1d\xb5\u07d6L\x89\xaa\x00\xf8\"&\xf50\xb3_\x1f\xb5]TO\x8d8\xbe\xd9\xed\x02\xc1\x059\xd3\x15\xa9\xe9:\u01e56\x9a\xd4\xe2\xc6Q\xcbe\u0451\x93]\xb0\xca\x03,\x16\xd2\xf0A.\x1dI\x04s\x88w,br^\xd9toa\xa6k\n\xce.\x95MWk\xa9i\xef\x1f5\xdd'\xa8\xe9^?]\xe2\x8a\x1b+\\=c\xa6K\x9a\x97\xbf\xf9\x9b\x9f^IM\x97\xe7\u03a9\u0513\xb7\x1d\\\\\xd8P>f\xba\xcd\x1d?\xfa\xf2\x03O\xfa\x8aI+\xae\xbe\xc4t\xc7j2\xdcFdFa\x8al\xbd\x87\x8b\xdf+>[L\xa2\xc5\xe9b\xecQ\xddn\x19\xc3\x15\x81{\x9c\x86\x1c\xb6H\u02c0\x87\xe1\x9d\xef\xe2\v\xe3\xbf\xc2\x1b\xff\n\u007f\x90\xa5\x17OL,6\x9b\x8b'2\x1ae\xcc\xc6h\xd4 \x1fZ\x99\x99\xfe\xb0\xe6i\r\x9e\xa0i\xd7\xe0m\x9a\xbd\x9a\xbb4D\xa5\xc9\u04d4h\x88\x06\xf6\x17\x1c.x\xaf\xe0l\x01\x17-H\x17`\xfb\xedHk\xd0\xf6k\x89\x16\xee\b\t\xd5B\xb3@\x84\xa8\x98\x16\xa7\x89D\u033f\xc7d\x10\xee\xd50\x10\xa7a .=\n\xe3d\xe0dL\x8cB9\xfb(\x96#\x97\xf1\x05\xcf\xe8/\xc1v\xd1\u02f9\xfa\xdc>\x8e\xf5\xf0\xc9\xcb9b\x98\xf65\xce\xc0#$\xa0\xfe\xcc\xc4J\xbe\x91\x1f\xe07\xf1\x9c\xc0\xdbxL\x90\x020\xf0<\xa9\x12\x9a\x04l\x13B\x02\x16\xa2r\u0162\x96k\u3c13+\xe6XN#\xe0#1\x92!\x87\tG\x10\xab\u007fQ\x8a\xa3Y\xaa\x13S\xaa\x9e\xa2bpDi\x84a\xb6\x17\x84*\xb0*\x813\f\xb7\x92\xa3#;\xf0\xee\xd7\xe0\xc8\x10\x9c=+\xbd }$\xcbv.<@\xf15\x92k\\\xf1\x8cG\xc4J\x0eM\xe1\x80{t\x1fO\u0258\x82\x00=\xea\x83\f\xec\x82\xf7\x80\x03$\x87\x02\xb6\x81h\x82\xfd\x82\x8cP\x81\xbe\u64a3\xec\x17H\xf8\xc4\ti\xfb\u0253\b\xa1\xcb\xf9\xac\x83\xa9\xb0\x12\xb6\x03\xa7\x04'`^A\x04\x9e\x03 U\xa8\ta\x1b\n!\x8c\xa2\x14Zc\xa1\x16\xb7a\xec\xc4\xc5\x18\v\xf8\x9f\xf0\x99\x18\u74d1\xc1\xf84+\x19\xa30\x17\xef\x1e\xd9\xc1H\x81_\x81\x13\xea\xcfJ\x86!\xa9M\xe6\xd3y\xe1\x03\xb2\x99b\xa00\xaa\xa38\xc0C\xf2\xccy8~{QQ\x18!\x93\xba5\xbf\u07a4\xb6\xa3\xb2{\x926\xa3\xae\xc3\xce!\x8av\xd2#o\x18i\uc8ceL\xfd\xf8X\"\xfa\x19\xfd\x19\x90\xe3\xda\xff\x06\xd4D\x1dq\xc3w*\x8e\nk\xa41VR[h\xe8\x98\xd6t\xff\xec%\x91\u016b\xd7U/\xf9\u0246\xfa\xfc\xe4\xccdI\x95G-\xbd\xe3\x8aM\x1c7\x9d\x89\xac\x18\u0656\x989\xb5%\xe4\xafL\xd4\x04Sm\xb5%\xef:\xcb\x02\x96\x8a\xde\xefw\xa7\x17\u035eV\xea\xaf(\x8d\xfa&H\x87.\x87\xed\x18-\xb9\xb0D\xd8K\xf3\xc5l\xb4\x04\xcd\u0394v\xf7Y\xc1jm+\x9b4\xa9\f\xf5\xa92\x01\b\x04\x92hY\xb2\xadh\x1e\x9f6L3`\x83\xa1)>ca^\xde\fnB\x13\x8a\x1eKS\x16\r\xc7(\xa3\xac\x16\x05\xd1\xe7\ro\xe4\x8e\r'\x9e\x8b\x1aY\x06~\x9eA\xf4Q qY\xf4\xb2\x13\xc1\xc2\"\xfaX\xf8\x1aK\xc0r\xa4\xb32T_\x18\xc2Ur\xf2\xe6l&\xc8\u01794\u44b8\xb0\xb7l\xc1\r\xbd\xa1\xc95\xc5j\xbd9\xde0\xb5t\xe65s\xcb\x1b6\x1dXZ\xd6?\xaf3\u07ca\xb5V\x97>PY`j\xdf\xf3\xab\xd5w\x9d\xb9oF\xf3\xf5\xbf\xbb\xb6f\xcb\xe6\xf5\x89\xde\x0f\xbe\xf7s\xe9\xcf/.\xab^r\xeb3\xef_\xf3#P=\xbfj\xb8\xa1=]R\x1f\xb6\x12\x8d\xa5:\xbf\xae+a\xc7g\xfb~u\xeb|s \x9a\xef\x8c\x16ZS\xcbo\x9d\xb7\xf4\x91\x1dM*\x83E%em%BI\xb5WS\xbd`{\u04eeW\xafo]\xf2\x8b\xf3\xffv\xfd\xdb7O\xd59\n,\u03d5T,\xfd-8\x9f\xbc\xfa\xcf/\u073f\xbe~\xf1\xaf\xa5/\xa5\xff\\\xb7(\u0732\xa8\xfe]^\x88w-\x97\xed\x89>\xf8\x04\xff\f\x12\x91\r\u0758\xd1\bB.\xc2l\x11x\x81\x15\xab\xd2VG\xab\x92/\xe6S\xfc\x14~\x1b\xcf\xf3\x06\xfa\x1e\u06c8\x02\x90\xc0\xebt\x9c\x129\xd95h\xe1p\x9d\xb8O\xe4D\x83(:\x06\x1d`p\x80@l\x04\x13\x8e]C\xc7\xe1>\x9b\u0365\x03\x1dO8dB\xe9x:\x91MEiz\xa9a\x01\x8a\x8d\xbd\xa8+\x98h\u0755Un\xe9_E,\x92\x8dd\xfd\x84>\xc1\xaf\x04BK\x88:^$\xe4\xfc\x80\xa4X,\xbd\x02'\xa9\xfb\xbd+\xb9z\x05\x87\xcb\xc1sZ\xa3\u0260%YX \xfd\x84\u007f\xe6|#\ue1cc\xa9k\xd1@\xc06ar\xe3\x84r\xb5\xf4\x9c\x8cC\x8e\"\xc4\x1d\xa1x\u054e\nP\x14m\u0274\vf\bq\xc0s\x10R\x83\xba\xd0\xe9\x01O\x8f 8K\xa0\xa4\u01f8\xb4\xc2[\x01\x8e\xc2\x1e\xfb@L\x1d\xe8\u007f\xda\x01\x0f9\xe0\a\x0eX\xea\x80v\a\xd49\xc0\xe9\x00\x05\xabg\xa3\xc2>\x9b\xa9\xa0\x0f\x91\x8bpo\xf4A\xe1\x91\xe1\xefg\xe2Y\xba\xa1a\x86\x81\x8cQ\xe8\xe7\x1fs3\xeb(\xc6\xf0\xc3\xe8\xa0\"\x02N\xb8hyG\xe1\x91\xeb\u007f\xff\xc3\x16O\xed\xcc\xead_Kq\xf3\ue9f7\x8c\fC\xf5\x8fk;c\xd6\xe5\x1bn=R?3a\xb3Uug\xf8#\xe197.mX\u0555T\xaa4e\u04ee\xec\x1e\xb8ou-\xd9h-I\x97\u031a2\xf2\x92\xb4;\xbf\xb2\xad\xacxr,/\x17\u01f6RL\xf0&\x8d\x1d\x014)\x13Y\xac\x05\x95?\xcf\xdf\xe3_\xe1\xff\x95\x9f\xf7\xe9\x96\x06\x0f\a\xe1\xfe \xf4\a\xc1\x1b\x04~\xbecI!\xeass\xaa>\xb3Yf\x8fq\xc4x3|H\xc3%\xa2`\xe0\xa2{T'\x8d:26\xe6\xad.L\xc4m\xac\xb4K\x82\xf3\xf6fc\x91y7\xf4\xcf\xfb\xd9\xf2X\xef\u00a5u\x0f\x9d{\xa0\xb3\xe71@\aV\x9f\x1c\x18\xe8:\xc0\x1dk\xba\xe6\x97\x1b7\x1f\xd91\xb1((\r[\xf2M\xcaU/\x82\xe5\xa1\x03`}um26\x1c\xaee\xf6\xc9\xf4\xc6\a\xa8\xde4Ts\xa1\x8cU\u06c3\x96\xd2.\vXz\x84\x01\x87\xb9O$\x96>\xde4N\x1f}\xc9cp\x81\vPH\xca\xfc\x94\x97\x87nFJ%\x1fX\xfc\xac\xf4\xc9\x13\xd2 <\xf2c G\x17I/Wd\xf7\xcc\x19\xda\xf0\xe2K\xf8\xcc/\xa53O\xf7\xf2G\x16\xfc\\\xfa\xea\xe8UOl\xaa\x19n=\x8b@\xb6\x19L\u007f[\x8d\x9a3%\n\x0e-\xd5\n\xaa\x1e\x18\xd0(\xfb\x1e\x17\xe0\a\x02\xb4\vP'\x80S\x00\x05+\x17\xa9\xf8>LT}\xc8\xf4mk\x90\t\x8bS\xa9\xc5\xd9\xf0\x98Uur/\x0e\x0f\x1f!m#\x9f\xc2\x17\x92\x11[\xf8#\x92\xf4\xac$\xedA(\xf7\xbbD\xa2\xbf\xab\xa4\xe3\xdcZ\xc5\xfd\x04\xc8R\xb5W=\xa4~\\M\x04\xb4\x00\x06T\u02be\xfb\x85\u01c5g\x85S\x02G\xc9X{9%\x88Q\xc2\xe8\x18#c\x9c\x0e\xaa\xbe\xec\xb7\b\x813\xd2q\xd2<\xf2\t\xd0\x1c\u00c8\xd83r\xd1V\xf8\xb0\x9cg\x1a3E\xe1\xb0&\xb8\xc0\xb2\x0f\x00\x8a\xfb\x8b\xd7\x15co1\xb8\xe7k\x96\x14\x85\xfb\"\b\x10*p\xf4\x19\xb9\x82>\xd1|\x91\xf3\x9c6\xe4\xe6\x00{\xcfjZ\xff\x9b\x8d\x04.\xb5!?\xfe3n\xac\xdd2xC\xe7OF\x1e\xed\x19x\x01\xdcG7\xbf\x97]\xda\xf8p\xef\x92\u007f\xdf\xd4\x10Yp\xf3\xe2I\xf3\x8b\xa4OH\u0548\xca\xec\xb5j\xaex\x16\x9cG\x1f\x01\xdb\v\xcb\xe3E\xe7\n\xca[\xbewt\xfd\xaa\x9f}\xafU\xa3\x80\x8aQ\x19\xf2\x16Yw-\x99\x88\x12z\xd0b\xed\x90\x16\x90\x16\x14\\\x0f?\xa0!}?P@\xbb\x02\xea\x14\xe0T\x80\x82\xfd\xa9\x04\u008fF\xa7T\xf4R\x911\xab\x1a\x95\xd9\u0613\xb7H\xafIz\xe9wP\r\u007f\x85*\xbcud/\xad\x89\xbe\x80\xebs\xb2\x9b\x84\x10>)\xffv]&p\xbf\xf6\x82\x16k3ZCk\x8c\xfe\xb8Z\xad\xea\xe11~\x8e\x00Qr}\x02Q\x91\x9c\xc1\xc4\xe9\x1fCn\xc6\x04\xc5\xdb\t\x1a\xfd\xe4ZJ\xd2\x18\xa6\x98D4\xda\xf1\u0251\xa5O>\x89\xefz\xf2\xc9\xc3]\xe4\u026e\u00c7\xbb\x86;\xbb\xd8o]HI]\xf0\xb9\\\x1f\xad\xcc\x04\x04\xa3\u03489N\u04e3_l\xf5Z\xd7Z\a\xadC\xd6\u01ed\xbc\x96\x88\xa2]\f\x8bD\xecC\x88\x86\xa34P\x96N\u01e9Z\xb2D.r\xe4\"\x0fe\x8c\x86$<qaApF\xac|Z\x9d\x1f\xaa\xa7\xec>\"ui\x95\x80\x15\x1aKEW\x03\u007f\xc3\xf9\xc1\x9dG\xb6\u058c\xca\xd7$\xfb\xe5\x86Lg\no\xc3\xd8M@\xa9r\xaa\xa6\xa8\xe6\xa9dl\x94\x82)0\x0f\xb6\x81\xa0R\xaba\x80\xd9\t\xb0\xe2\x9bn9\x06^c\xd54ifk8z]\xc2\xf4\xa1-T\xd0\xdf\x00\xa6\x02\xa0\xe2\xc8\xf5\xf0\xb2L\xfc\xf6\xf8h\x86\u0232\xce\x13\x8b\xa24\xf6\x14\x03\x88\xb2\"\x92\xe0\a\xde$\xed\x97\x0eob\u02b8\n:a\xaeT\x86\xfb\xbbG\xfeN\x15\x929\x0e\u007f\x1dY\x8d\x10\xba\u0117yT\x9cqF\xb947\xc4=\xceq\x9c\xe8\x15\x81\xf4\xa0\x01\x01\b\x19u\xdd\\ y\x83\x8dk\xe5\xdf8\n\xd5\xcc?\xbfi\xbb0z\x1d\xe1vz\x1d7\xba\xf1\xe7\x06\xd6\xe4\xd1\x1e\xbd\xf0^f\x1e=hqC\xb5\x1bD\xb7\xdd\x1dv\x93)\b\xea\x10\xb0\xf4X\x8c\x88\xcb\xf0\x03\xf3A\xf3931\x1bT\xb4?\x94u#\x9dNmZ\uc74b\x8fb\x8c\xb5\u056af\x15\x16UvUXET\xbd\xea\x01O>\xc6\x06\rQ\xeb\u0332\x13\xdb\xe3\xac+\x9b\xc8yT\x9c%\x15#K\x95g\"\xf4\r\x93\a{D\"~\b\xd8\xec4\xa90\x92A\x1e\x90\xcbu\xbf\xead\x00\b'=\xab\x148L\bH\x9f\xc0\x01\x98 \xc0t8 \x9d\x02L\x80#\n\xe9\x00\xb7}Aw\xb0\xb3\xbd9\u007fd.\xe5\xf3\x01\xae\xf7|\x1b~*oR[{\xe1\xac\xf9\xdf\xec\xb9(?\xfe\x069\u007f^\x97)\x05\x9f\xce\xd1\xca\xf4\x8bY\xef%\x02D\aSl`S\xd0Q\x88\xad\u05fe\u0609\x9c\x06\xa7\xcfy\x98v\xc5y'-\xfc\xfc\x8c\x1a\xbf\x86\x89\xc9J\xbfV\xadi\xd6`Nc\xd1\x14j\b\xd14+Ay\xf4\u00b9\x8c\x81~U\u066b\x1ap\u0630\x9a\xe8T\xb2\x1f2\xbe\x19\u05ccQ\xc6bv\xfc\x98y\x87\xcc0\x8c2\x1cb\xadE\xea\x977H[G\x9e\xa7\xccr<eu\x0fn\x10\b\a\x04\x03\u0638\xae\x8e\xf6\x89C\xa9\x91\xe9\x94\xc3_\xb6\xb7\xf9&Onp\xe2\xa7\x18oX\x8eu\xb7\xcb\xf5\xdd0*\xca\xd8=\xf3\xd1\xd2by\xe4h\x99\xafZR\x14\xe8\xd3s\xce>\xde\xfc\xdd,\xf3\xddJ\xefe\xf0\x91\xbf}\xda\x03\xff8x\xf0\x1f?\x9eF\xf7\x0f\x1d\xfc\xfb\x8f\xa7\r\xfb\x8af\xee\x9c3opF8<c\xe7\xdc9\xbbf\x16\xe1w\x1f\x92\xfe\xfb\xe5U\xab^\x06\xfb\xa1C`}q\xe5\u0297\xa4O\x1e\xde\xf8\x8b\xc1\xc6\xc6\xc1_l\xdc\xf8\x8b]\x8d\x8d\xbb~\x81\xc6r!\xb7\x9a\xea@A\xb5P\x9f\t\t6\xe0z\x94N/\u0347}\xce!\xe7\xe3N\x1e\x19z\x8c\x03\x0e\u0507\xf4\xa0\xd7\x1b\x14}&b`Y\x80!\xff\x8b\xf1\x9fU\xa9\xb3\x90\xab\xa0E\x805\x03#r`c\x9d\xc0\xcf\xebw_\xb7up\x1a\x1e\xac\xbd\xee\xc4\xfe\x16\xeaQ\xb7\xdf\xf8\xfau\x19\",\u06fcz\xd9\xef\xfa\x0f\u007f\u007f\xfa\xc89\xfeHz\xf3CLf\x14m=Oe\xe6BQ\x9a\xa5jl<k-\x10\x8e\a^a\nQ\x01VD+\xd2\x158\u007f\xbeiI\xacN\x9c*\xce\x17I\xb1\bj\x11D\xc1 \xf0\xdaH\x9f\x9d\xf3\xf7i\xcd\"\x8a\xe6R\xc6(\x16\x1c\x95\xeehQF\xae\u0182\x1f\nD\xa1\xe0_J:<m\xeb\fX.m\x90\xbe\x12\x05^\xcd\xfd+\xa1o}\xf3\x91\xef\x97J\xab\xa1\r\xe0_\x88>\x87AT\xb2\xdc=hgf\xba\xd2\x03J7\xf0z\xf0X\xf38\xaa\x02\xce\xdah\xc5V=\x9b\xcb\xe0F\xf9\x90o\xc8\xcf\xf7y}\x80T=\xea\x01\x9a\xa8\x9eF\xf0\x10\x82\x1f X\x8a\xa0]\x0e\v\n\x04\xa8_\xa9T)\xfa4\u012d\x92\xe3\x1dS\u0459l\xeea\u02a1\xc7Q`LU\x97\xa2\x03\xd5\\\xec\x1bW\x9c\x93\xb9\xb8\x8f\x93\xc1$\xf5\x03\xec\x05?\xc0\u7ceeYw\xe5\xceiTq\xfb\xc0\t\x9a\xa2\xc9sbk\xe7\x86ZjLF\xe9\xa0\xf4\x02)[:\xb0l\xee\u0236\x91\xe3\xfc\x91\x13\xefN\xbd\xaa\xaf\xc5\xf1\xe4\x0f'l\xe8q\xe5\xe3\n\xd9\xc7{/|JN\U0002fc4el\xa6LE\xf2\b\xe6}V\x1f\xb6)!l^\x80\x96\xd6y\xeb\xd2u\xf7\u05d1\xd8\x02\xa5{Im\xcc\u0317\xf5\x15\x15p\xba>%o\x96+\xb8\t\xa67Jz\x9c\xeaP:\x93@2\xe6\x85\xefV\xd2\xc3\xe3\xfdS\n\x02(*\x10\xe4B\x9a\x87\x90\x13\x93\xafyz\u06ca\x97f\xc5\x16.^\x1cOL)\xb3\x06\xd2\xf3\x92\xe5\x1b\x167N\xbc\xf2\xe1\x15U\x8b\x17\rT\r\x94u\xb6\xb5\x14v\xcet&\xe74L\xdd9?\x0e\xb7/\xbco\xed\x84R\x1a\x91\xec\x91\x02\x8b\xbd8UP\x9cNV\xba\x1d\x8d\x8b\x87\x06\x16\u07b3\xb2F\x97\x17r\xfe\xd5\uace9g6\x05S\xf1J\u007f\xd1\xcc\u017bd^\x8b\x11\xe2\xea\xa8NE\u0510\t?\xa7\xfc\xbd\x12\xafUBL\x99Qb\xbd\x12\xae\x95QT\x0f\x10\x92\xa1\x92\xc4 \x92>.\a\xa8N\xcbY:j8\x13\xcfA\x84qX\x80_\xa7\x90\xe0f\xce$\xdd\xc2=\x05X\x92\x10\xa0\xc7h\\\xd1\xc813\x96\xc9W*@\u0241\xad\a\x16;\a\xa9\xb7b]\x8f\x9a!X\xc1\xacA\x84\x81\x8e\xd3\u3845\xa1k\xe3X\x05\x92^{\xb4\xf2h\xe45M7\xfe\xc7\u041e\xe37\xb4B\x95/\u075b\u07bd\x99\xf6\xd8;7\xbc\xb8\xaf\xab\xe3\xa6W\xae\"\x8f\r/\x9f\xb1qJ\xc1\x9dw\x91\u007f\x93c6\xdbp\xa7\xe5^\xd1\\\x8a\x81\b\b\x18\bV\xab\xc7Fm\xd0\x0f\xeb({\x1c\x18\x00Lz\xd3Z\x13\x96K7\xbc<hSq\x165\xa8\xb1\x89\xcbQ\x97\xc82\x0f\xfd\xf6`MV\xaf\x9f=\xcd\x1ebg\u5943\x90\x92j\xa4\u01e4\x14\xa4\xce\xf1F\xb3\x89\xe7M\x163\x9f\xeb\xa3\r\xef3N\xef\xef\xf7\xfb\xfb\xfb\xa6\x9br\xb4\x89+(m\xd5\x10\u02acVV\x15W\xa5\xaa\xa6TqK\x82[\x828\x1c\x04!\b\xcb\v\xb7\x15\xe2\xa2BP\x16\x82`\tY\xaa-\xcd\x16n\xa5i\xbb\xe9\x06\x131\x19T\xbaV\xb5\t\x06\x8c\x9b\x8c\xd7\x1aI\xb5\xb1\xd9\xd8m$A#\u060c\xc0\x1b\xe5\xea\xcc\r@r\xf8\x83\x94\x008\x01T\x00\x03h\x13\xba\x16\x11\u0138k\xa0\x17\xe0\x10\x00*\xeb\x0e~?\x88\xedA\b\xce+\xdc[\x88\x1d\x85P\xa84\x19\xf3\xf3\x95e\xc4\ucb02*T\xdd_\xbd\xaez_5Wm\xa8\xae\xae\xd1\u05c0\xcd\x02\x163\xbbD\xc8\\U8\xa4\x84\xedJ(UNP\xb6+\x89K\t*%(\u0364,\u07d2\x0f\x02\r\x04&\x93\x9c\u01cc\xb2\u0728\b\xd9#\x91\xf8\xb6 \xedL\x92\xec?\xe8_N\xa6\x91\xec%\x8f\xf17\xc5@\xcayy\x1c,\v\x9c\xb77\xf0I\xf3\xf8\x81\xa0\x92\xf6?\u0169u:\x8d\x12c\xa5F\xab\xd5pOJ\xf7K\xfb\xa1\xe2\x00E\x12z\x9d\x86\x10\xb5F\xafQ\x93\xd7\xc0\xf0\x1aQkuZ5\x91?P\x93\x03P\x81\xdf\xd4W7\xb65\u05d9LuMm\x8d5\x86\x91\n\xaa\xb0\xf7\r\xf5\xed\xb3\xa67\xd9l\x8d\x1d]-I\rI\f\xbf\xaeI\xb6tu4\xdalM\xd3g\xb5\xd7\x1b\x88\u789d\xf1\x9c\x8cw\xaf\xce\xd4(\x95N%V\xaaTH\xad\xe01\xceU\xc9\x00\xa1~\xb4\x0e\xedC\x1cC\x80\xda]ZX\xab\x05A\xb4\x89X\x14\x84K*\x05\x16\x8eSX\x14X\x8d]\x18+0(\x05B.\x81\x839\x13L\x18//\x1a\xc8\xf3\x91dOT\x82?\xf7\a<'\xfdHz\x9b>\x9f\x82g\xa4E\xd0\r&\xd0@\xa7\u050b\x8bG\xde\xc1_\xe2\x17G\xbe\u013a\x91\u0228\x8f<\"\xc7\xf6\xf5\x19\x1b\xaf`\x86r\\\x051\xd5a\x15\u05ab@\x91\x16Ad\x94yE\x91\x87O0\u0708a\x00ob\x85=\xc0\x06\x8c\x11\xd7\x13\xe3\x81'\x88\xcd\x00\xd2(\x8d\xadH\x10\x803)\x800\xaaY\x0f.\x92`}\x87T\x9c\x92\u02f4\x9f\xa3\x9b\x1e\x8d5\x9b\xa9{\x83\x1fw\x83\x82R\xd7(\xfd\x1f\xa9\x11\xa6\x93\x05\xb8gx\xf7\xc8+8Jr\xe3\xc1\nJ\xa3W\x1e\x0fn\xcaT,'@\ffG\xab\x9a\xeeE\x11\u0448\u056f\\\xa7\u0727\u072f<\xac\x14\x95J:H<\xae\xfeBM\xa6\xaba\x9a\x1a\x96(@\xc1\xc8\u03e7_\xe0\xe817\r?\x8e\x9f\xc5\x04c\x95\xc8\xf5\xf1\x04+\xfa`l\xf8a\x84\x04k\xe4\xe6L\xce\u020e\xc7\a\"\xb9\x06\x8f\x9f\xf3\x0e\x9b\xf0\u0291\x83\xe4\u0551\xdb\xf1\x8ec\xe43@\xaf\x0e\x9bd\x1a\x87\xa4g\xf0F9\x9e\x16d\xcc\x1c\xfaR8\x8b\xc0\x00\x18\xf8\u007f\xe0s\xc2?\x80\xce\xd78\x9d>\xcdD\xf1\x19\x05\xad\xf2\xe5\x02\xc6\x04\xde(\xe5\xc3_\xde{OzF8\xff\xd6\xf9G\xd8u4\b\x91I\x17{\xf6\b\x94\x180\vP<\"\xacgO\xbe\u0773O\x8c\x89\x91\xca\xd0/}2rj\xb4g\x0f(A\xe9\xb1\xcb\xf4\xf82\x06\x82\xbe\x84\xb3\x82\xa0D\xff\x10\xbf&\xff\xe0\xce\xc9P\x8e\xf1+ScO\x18\x03U\x94\xa2\u0129S\xf0\x17)\u007f=?\ubb6f\x05F\x8b\x02+\xb8z\xfe7H\x81\x92\x19O\x84A\x1b\xab\x02+9'\x87\x95 W\xb79BT\n\xc6>S7%*\u03a6\x0e\xb2\x8an.Y\xa3\xac\x19\x12\x10\x00\x01\x8b\n8\xb2\x0f\xbe\xf8B\xfaM\xd3P#V\x90#\xc3mx\xf7\x8f\xa5_\xdd+\x8f\u11a5gH\xe7\x85VD\x90\xe9\bB<\xc0/1b\xe51z\xb5\xdcl\x10\xd29\xfc\x18\xa13m~(\xfb\x1b\xb4s'\xc8t\xc1\x8f\xb4\xa8$\xe3l\x12\x81\x88\xa0\u0448\x82^\xec\x13\u05f2\x89\x82z\xd4\xc7\xe2{4+\xcf^\x91'\xf0\xd1\xeb\x94\x13:\x98\xa4\x81\u068a\xaf+\xe8[\xd0n\x80nC\xa4<f\xe5N\xe4\u03dc;\xc3e-\x981\xa3\xdd\xedb8\x93\xf5v\x89\xc4mF^T\x8e\xae\xc84\xf0n\xab\x1b\xab\xb4yZ\xacR\xe5\xa9p\x86\x95\xbe4\x06\\\xde\xec\x99\x1d\x9b\x16{6\x86c1\b\xb5\xc44\xa0\xf1\xcd0\x18\xc4Z;\xd8-\x9d.\x03.\xee\x14m\xc8\xca\xf0'\xcdn\xccW\xa3r347\x9e\x1e\xef*\xf9\xc7\v\xb1\xd5i\xb8X\x92\x06Z#\xb0\x1aA\u0511\xb1\x96\x12)\xaeS\xfa'u^\x91i\xdc4;\xf6\x97??9\xbd\xb5uo\u04e2Y\xffg\u075b\xa7\xa47\x17\xd7\xcfJ\xd8\x1b\x93%\xadU\x9e;\xcb&\x96X\"s\xae\x9b\xff\xe4CJaV\u04e4\x92\xc0\xef\xa2\xd5/\xbe:b\xc7\x02\x87\xf3i\u0279\xb9\u039d\x9aY\x9d\xc3\xd4\xfbiMl\xab`\xa1\xbc\xc6PM\xc6\u01cb\xc0\x13(o\xe1\xe7\u012d\xfaP\xb3iV\x85\x19\x99\xac\x91\x0e\x83\xca\xe6\xf2u \x03\xf3\x15\x86u\xd2 3A7\x8c\x87o\xf5\xa7\x03b\x80\xe5lA\x14XgWd\x1d^\xebX\xef0\x84\xbf\xea\xbeiI*\xb5\uc5b95s\x1a\x13Vk\xe2\fT\xb0\x91\x99\xc6Z\xdd\xd2\x13K\xb4\x94Z\xb0\xb9tJ\xf5\xfc\u0673\xb9\x8dm\xb7\xfc\xf1\xa6}'nis\x14%\xf2\xb7\v\x16\xe9v\u007f\x87?\x1c\x0eL(\xcb\xfb*\u0636~\xaa\u007f\xc6\xce\u0665\x8f\xfe\xf4\xa7?\x95\xfdo\t\xd5\xd93\xdcF\xca\u01c4LH%\xb2V\xb5\x16\xb9\f\xac+\xed?\uc1e8\u007f\x9a\u007f\xad\x9fXZ\xf8n\x9f\xb1Ce\xb0w \xdb\xf8\x80&\xe7\xee\x8c\x13~\xac >V\xa0\x11d\xe9W\xd3\x028\xc1\xeb\xaf|~\uf529{\x9f\xdf\xd2}h\xea\xdcIW%\xd7\x0e\f\xac\x9csS[\xb0\xb9\xa5\xc32\xe9\x86\x13w<x\xfa\a\xb5%\xa1\x8f\xdd\xc1\x87\x1e:\xb8\xbf, \x99hM\x0f!\xcch\xe3\xea\xc7e\x9c\xa3.\xcf\x1al\xb5\u03ce\x97S\x8a*\x9cV\x1b\xd2G(YL\u01b6\xd1x\x94\x93\xb1,\xe6oQ\xc6`#\x1b\xef\x01\x83F\x01f<IV\xa1g\xc82G.\x9c\x91e\xbc\xfc\x96\xb9\xd5=\xad)\x9bJ\xe0y\x11*\xce\xd4i\xa9\x8c\xe7%\xab\u06e3v\xb0\x94w\xd6\xf5\xf7\u0337\xb4\xdd\xccD|k\x9b\xb3\xac.\x10.*\xe8\xf0\u00d2\xaf?\xbd\xb9\xa0\xbe4\xef\u007f\x82S\xd7]*\xe21>\x1a\xa9\x8c\x15\xa8\x18-\xceLT\x19@\xa5\x81!\x8a\x1d\x82yJ\x0e\xb8V\u01dc\xc8\xf1\b\xc4\"@\xc4<\xc8k\xd6u\x97\xa4\xf2\xa6\xe4\xe1\"\xfaf\xfa\t\x02\xaf\x12\xb8\x9a\x00!^4\xcdl\xf0v*m\xe3\x85B\xe6\x15\xb2&r\u0566\xec\xd8d\x01\xa0\xae\xe0/'\xe4\x12\xde\xdd\xe0\xcfAiY%\x033V*\xe0:p\xc4Z\x95W\xfe\xee\x96\x19m\xd7=\xbda\xed\xcfvL\x1e\xe9\xc6\xc1\xc9}\xf5\x89\xf9\u0773J\x8bf\xf4,#wo\xb8*\u045d.\x1c\xeej\xbe\xf1\x9d\x9bo\xfd\xaf[\xdb&\u007f\xef\xd7W\u0756Y\xda\x12R\xdb\xfc\xb6O\xadn\x8b\x12\x8d\xe1b\xd2*x\x91\x13\xb5eJU\x0e\xa5\xae\x15!\x83\xc1\x15u=\xee\xc2\x06\x178p3\x11\t\xcf\xcb3\x05\t\xf0\x9d\xa2Co\xe9\xd0\x02\x96\xfd<\x9d\x18\xc5\xc7\xc6\x04E\u0232Y\xb1\xe2_\x04\x02LUU\xc9o[\x96\x1b\x12\xf8\x83?K\xc7\x0f\x1e\xac\xec\xff\xc1\xec\x05;K[\xbd\x8d\xe5\x13*\xfeL\xb6\r\xef!\xdbn\xed\xeaZy\u3b00\xdb\xf4\x9e\xda\xd41\xa1\x99\xd5\xf0-\x92\x85\xab\xa7\U0009f23aP\x16=\x93\xb9\x86\x17\xadbP$,@\x05\u0744wZ\x9dA'Q\x05\xf2\x02%\x01\xa2\xaa\x02U*/U\x92\"\x95>Z\x9d\xa9\xd4&\x15\xf3`^+\xcf\xcfl3\xb0\x86w\xdf\xe3}\x10\xeb\x03q&\xcclM\x96\xf8\x94\xa6\xd6\x12C4\x9a\x9c4-\xd8\x17\\\x1b$\xc1\xa0!\xe9K\u0192$Y\xc9\xe3\x89\u0704\xee\xa9*P\xa9\xac\v&\x18ZZ\xa0e\xba\xcf5\xb5\x13:\xad\xb4\xe5\x94M\x9f\u03a6\xe5\x96\xd31\n\xe6\x18\xf7\xf4\x882~,\x151\x9c\x19\u0364\u01e8>\xe5\xa9\x06\x91\xb1\x82\rX\xc5\xf1YF:`\x01\xa2\x8eE\x91\xefL<`;\xb8h\xf7p1\x90DX\xfd\xdd<>\xb3\x8c\xab\xffw\x8b\xa1z\xc5\xfe\x15\xf6j\xad\u015eWR\xe3yl\u01aey\xb1\xf6;\u07bbu\u00e1\r\xa9\x92\xe6yQk\xb1\xdfj.\xac.\x98\xbb\xb4f\xd5\xfee\x96xE\x89FZ`\x8du\xa6\xee\xfd\xd1\u00a57\xba\x1a*\x03k\x1a\x9bZ3\xe9){\xb9\x05\a\x12\x05SJf\xdf8\x90\xe4\x891\x98gu\xea\xf9`\xfb\xe6\x19}w\xadLEflh\xad\xef\xc9\x14\xa9\x95\xbe\x92D\xbe\xaf\xb2\xac\xc8\x1a:\xb8\xa1\xe7\xa6E\x95\xbc\xa8 \xdf\b\xacE5\xb7-]\xa2\xf5U\x91%\xf3\a\x06\xe6\xf7\xac`v\xb5\x1f!n\x05\x8d\x01nT\x9d\xf1\xf3.\xab\vC3\x9a\xedE\u0798w\x97\x97\xe8\xd5\u035aY\x1e+\xdf\xe10h\x91\x86%\x8d8K\x1b\x17\xbb(Tl\xc5`\x1c\x9d\x14c\xf4\x8f\xc7W\x90\xfb\x94\xdc\n\xe9\xf8\xd4\u03ba\xe91\x8bt\x9c\xc6S\xc2\x11C\u015d\xfd3\xf7\xf4W\xe2\x1b\xb7m\x8b\xf5^?o\xe4K\x1a@_(\u0246\xcbK\xe7tD\a\xeeY\xc5\xfc\xf9V\x84\xe0\x14\xa5\u024c\xec(\x9a\xc9\u007f\xd6\t1:\xb1d\x1f5!K3\xb2\xcer\xf03O\xb1B\x8aMo\x91g\r\u04de\xba<\xba\x95\xa7\f\x98/\xef\x91R\xa2n\xcd+\xab/(\x98P\xe6r\x95M((\xa8/\u02c3\x06F\x0f?\x18I\x05t\xba@*RR\x1b\xd0\xeb\x03\xb5\xe7\x1f\xe6z\x11\xc2\x17\x1e\x93,\xa3\xbf\x1fFM\xd4\xdbLy&L!\xb0\xa6\u0663\x9f]\xfcl1\xc4h\xb5}_1q\xce<\xc5\xfa\x9eZ\xfdX\x15\xb7\x03\xb9h\xe8\xc8\xe6(b\x01#N\x8b\xb9rW\xc6L\xad\xa9\xea[\xe5\xdc\xcb[\xfeKbK\n\xbc\xd5\x05\xce2\xbf\x05*\xc2s\xae\xaf\xbe\x9cf\u0262S\x9fU)\xf5\xe1\x89\t\xee\xd07\xc5\x1d{\x16\u05ca+/c`T\x9fG\u5e73k\x8e\xa8\x04\xd0`\xe0\x18>3\xd9[\xd9>S\xad\u05b5\xf2\x9c\x95\u00dc\x88\t\x11b<\x14\xf2\x80x\x03\x8f\xe9\x8b7h\x95\u036aYz5\x12\rFK\xabB\x04\x11aAe\xc5z\x94\xceA\xfdH.\xbf\xcah9W\xf9e'e\uf064\x8c\xf0G\v\xc0\"\xbc\xb4\x0e\x8c0WZ\x05\x8f\xd12\xf0\u066dL\xe0\x06\xdc\u007f\bfI\xae\x91=\xf0X\x97\xf4\x13\xc12\xd2&\x8d\xda \xbcIi&\x14\x13\x9a\x9f\xe5!\xc6\xf7\xf3\xfbx\x82\x9aa\x16\x87\x11\xb3:\xf9g\xc7F\xf5\xf0&\xbb\x18\xfd\xff\xd1\xef\ngi\xec)\xa1\xe3\x84J\xb9,B\xec\xe0@\xcd\u007f\a\xb8\v\xe0\xfb\x00\xdb\x00j\x00B\xf2h\x13@\x13h.\x98]\xdaW\n\xb2eG\x1c\x06\x03\x1b!\x18h 2\x84\xf9\x0e\x8f\u0560\xd5\arvN\r\x9dM\u038b\x18\x13\x17\xad\xdd8\u07b4a\xa9\xef\u06e6\x9f\xb0\xcb\xf3\xc5l\xa3;vJ\x86LV\xae_:\xde\xdaQ\xdbQN\x9d\xe0L\xb1\xd11yzO\xf9\xc6\x1fG\x9c\x8e\u01ae\xf9\xe5O\xfdBz\xa3\xb5c\xf5\x82q\u007f\xe0z\x87\"\rE\xe6i\xb3\xd9\xf6\x85wF\xc2\xec\xa3G\u007f|\xd1W)\xafy\xa8.S\xd8d\x02\xdeau\xc8\ue68f\xf2c\xf9\xbb\xf2s\xee\xea2\xf0\x1d\x8c\x8f\xff\xdd]\xd1\xffJ\xf5\xa8\xafN\x99>azt\x94\u0326\xae\x05\xb1\xae\xef3O\xbd\x8c2\xe6\xa5\xe3yw\x80\u04a3F^9z\xe8\x80\xf7\x80\xca\x02*\a\b-\x9a9\xfe>?\xa0\x16[\xb7O\xd9\xe12\x90\x0e\xa3\xed\xb2J\xad\x1co\xc7#\xe5w\x17@\xfc\xa8w\xc5\xf2\xde\u0795\u02f3\xf8\xe5\x96\xeb\x9e\u077a\xf6W{\xda[\xae\xfb\u0355l\x8f+\x1e|\xe8\u0401\a\u007f\xfa\xd3\a\u007f\xf8\xc7\xdb::n\xfb\xe3\x0fo\xf8\xe3\xad\xed\xed\xb7\xfeQ\u018e4\x1fm\xa5t\x8daG7\xf0N\x8a\x1d]s\xe2!\x83\xa6Y;\xab\xc2\xe8\xeb\xb0\x19tz\x8d\x8b\x8f\x8c\xe1\x1a&\xa7oaG\x9eaF\xb9\x94\xfdm91\u07fd\f;~\x9a\x9c\xd3Xi5p\x1c\xe1\xa5\xe3\xe7\":\x86\x19\x93snZRS\xbb\xfc\xe6#\x97bG\v\x83\x8c\x01o^R/\xd5\tm73\xf7f`r\x88\"\x1dr\xebe\u0611\xc9w4\xaf\x1aF\xf1\x99\x83\t\xd7\u03c7\x9a\x03\xb3\xe3:*\u060aBW\x81\u07a7\xa6\xd2-E\x1d\xc6\u007f\x82\u03c2\xdf\x06a\xe2\xb7\xe0ZR\xeeGT\xb3v\x84\x8e\xe0\x9e\xe4\xd4r\x1b\x98\xa3\x1d\xb5\x14\x83\x19\x18\x03\f\xac\xd5\xf4L\xa9\xb1)\x1c\x80\xa5\xe3<&Dk\xa1\u071dd\xc4\x06s\xc4\x1e<\xf0\x05\x83k\x94\x89\xa9\f\xae\r}}\x04\xde6\xa7\\>?\x83kc>JZe\xbb\xcd\xfc\xec9\x01\x046\xe7\xd4O]N\x10\xf2/\xe4C\xb3\x95J\x98\"z\x97Yo\xb4\xf2\xb6&\xdbl\x1b\xb1\xa9\x19\xa4?\x96\xc8\xca\u030cB\x166\xe6\x05F\xb6\xb1\x9c|\xcb~\xf1G\x1a\xb7\xcb.(\xf2\xbd\x1eU\u0762\x96\xb0t\xfc\xa32\xbd\xa3\xa6i\x0e\xb7\x11\b\xc1\xd2\xfb\x98#\xe0\x99\xbcz\xda\xc8+\\\xef\xc1Hs\x85+\x87\xa9\x16Rl\xbe\x97\u0495D\x8b2\xf9<\xb6b\xcc:\xef8le\r\x13k3\x9a\x93:\x9e\x82X\n\xcaY'\xc4I\u03d57\xab\xbc\xdd5\xd6r>\xd2Y\xc4ZFE\x85\x06C\xa7\x9a\xc6\u055f\xd37j\x9ej \x119\xcd^c\x05\u05c8\f\x1b#\x89\xf1\x8a+\x9b\xa5wY\xc9u\x1c{\x8dW\\\xf7f\xb6\x1c\\\x96\xec\x9d\xd5YT\x92]0'X\\\x1b4j\xcb\xe7M\x9d\xb2\xb2\xa9`\u009a{\xfa\x06\x9e\xa2#\xc5\xeb\x9b\x1a\x92\xba\x92\xf6\xfa\x96\r]\xa5\xd0>\xf7\u06b9\xa5\xa2\xc1a\x1a\xb6\x168uzW\xd0j\xf5\a\xa3\x05\xfe\x89\u04d7\xb6tn\xee\f\x97\x97\xff\xb1\xb0\xbc4d\xf1\xfa\xc3\xf9\xde\xfa\xcee\x8c\xff(\xe5_\u01f7#'ZpD\xe5`<\x13\xa6\x9aJ\x95\xbe\x153@\xec\U000ba9b9\xfa\\k]\xf7\xbbN\xb9\x04\xb3\xbdY\xa3\xd3\x19\xfa4k5\xa74_h.hx\x8dM\xd7i2\x98\xf5\xa8C\x94};\x91\xc85K\xe5:\xac\f\xb0\x18\u7460<L\x81\\\xd54P\x95\x86\x84\x955\xb9-6\xbc\xa4lFIdp\ua51d\v\xaan98\xf7\x050Hg3\xa7,\xfa?\xdb\xdc\x05\xb3\x87Va\xd75K>\xfd\xfc\x83\x91\x0f&6\xe4\xf4u\xb7\x1coz\xe5\xf8\x17h\xe3@\xa5\x02p4;/\x86?\x1d\xf5m\x17\xa2'\xc1$\xda\x1cZ=\xab\xf5\x1c\x8bg\xa3c!\x87\xf9\x03\xbad\\kdD\x8c\xe5d\xb2\xbd\xd8\xe0\x1c\vzP\x91\v\x85P1\x14\xa9g!\xef\xeeU\xf8\xc4\xc8\xc6\\$\u013ao\x1e\xb8X\u01ddN\xe9\u0462\xdb3^Ak\xd3Vk\x97h\xb7h\x8fh_\xd6~\xa8\xfd\xbbVyB\rj\xd6@\xfb\x03\x96\x176\u022b\xa0X\x8d7\x85\x96\xa3m\xe8\x97\xe8\x18:\x83\xbeFJ-+N\xa9\xf7k\x9e\xd3`\r\x93\xbf\x8dM\x1a4h4\xfau\xfa}\xfa\xc3\xfa\xdf\xeb9\xaf\x1e0\xb0+hA\rz\x9b\x00\xf2\xb4_\x16\u07b3\xd9\xf4%\x85\xcbH61V\x01\x8e\xb0z\x91\\\x91\x04\xea\"@+\x91\x007H\x9b!\xfdK\xa3\x93\b\xc4i<\n\x19i3\xd7;\xb2;\xb5\xbd\xa2jk\n\xef`L\xc9<\t\x1b)O\t\xb0\xff\xe2\x0f\x89\x0f\x13\u007fO\x90\x04\xfbe\x83R\xdfZ\xc1\xfc\xe2\xed\xc2\x0f\n\xffVH\nY\xded'\xff3\xf0\u07c1\xf3\x01\x12p\xd0c\vs\x14;\xfd\xa7\x13\xa63\xa6\xafYA\x98\x9e|\xdb\xf8\x81\xf1oFbd_\x98\xc1\xbe\x80\xfe\x1b\x9dG\x04\xb1/\xdci:h\u00a6;\x8c\x0f\x1a\xb11\xef\x8e\xc2\a\vq\u1741\x83\x01\x1cP\u0791x0\x81\x13w\xa2\x83\b\xa3\x12!\u03d6\x17\xca#\xca\x12gIq\t)Q\xe6\x11sE|\u007f\xfc\xb98\x8e3\x81\x19\xe9/\xc6\r\xf1\xaa]U\xfb\xaa\xb0\xbej\xb4\x10\x9cg\xae\b\xb0\xa2\xe7\x14%Q\x9a\xf5\x11\xc1es5\xbb\x88\u02c5L\xd6\xd1\xf5\xb4\xe9\xc4%e\u07da\b\xdd\u0411\x02;\xce&.\u0670YO\xf2st\xe3g\xf3\x9eB\xe1\x80 \xea\x88HF\xab\xec\x89\u046a/;\"L\xd8\xe4\xef\u075c\xd6`TZ\x1c\x82\u076c0\x1a\xb4\\\x8ftTz\v\xa2\xeb\x95f\xa3\x8e\x13@\xa4\xedw%\xb9\n\xa6o\xe6\rF\r\bDo\xb2*7C\x84b\x9b=\xc6\xf4\xb4y\xa5K\xb7n]V\xda3-c\x92vp\xbd\x921\xbcz\xed\"\xb7\xb9\xbeyJ\xa6B\x85\x1d#\x1f\xdb\x16,_\x94\xef\\\xb8~]\x18\xbe\x18\xb5G\x15B\xdc\\\xaa;5\x1a\xc9\xcc\xe7U\xa0R\x80\x8a\x03\x1e\x83\x83\x03\x8e\xe7\xefF\x87\u042f\x10\x13?\xbf\x1cA\x0f\x02\xb6\xc2\x0f;P\x11\xc2*\x04\xcdB\xb7\xb0D\xb8]8 \x1c\x11\xfe |((\xecBXH\nD\x10@P\x12\u0129\x1d\nP\xec\x17\x9f\x13\xb1\xc8d\xce\xc2!\x9bV\xa6\xf5j\xa3\xda\u01f5\u010e\x01\x83\x9d\xfe\xa6\x9a\xc9\u07a5V:\f\xe6\xd6\xe5J\xe8QB\x8a\xaa\x00\x97(\xc1)\x17\xe2\tk8\xfb\xe8\x87K\b\xcc\"PM\x9a\t.$`c=oP\x12P\xa8\xac\x1c\xe8\u01cb\u02d7T\xdb#\xb9Bs\xfc\xa2\xb1g\x99\xbe\xc6\x1e\xb9b3;R\x82\xdf%\x83Q5\xf8\xe1:\xe9N\xe8\xf9\u056f\xa1G\xba\x15vH\a^\u007f]:\x80\xebp@:\f\xd3G\xde\x1dy\tVH\xb7\xcbv/Yd_\xf6\xa0C\x99r\x87\xa7\u0183U\x1e\xf0\xfc]\aI\x1d\xd8\xd8\x149\x1e\x9d\xd1\xc0\u007fj\xa0X\x93\xd2\xe0<\r(5\xa0\u066f}N\x8b\xb5L\x1c\xa5T\x1cZ\x83V\xeb[\xe7\xdb\xe7;\xec\xfb\xbd\x8f\xf3\xfa\xc0j\xfd\x10\xe0m\x80\x83\f\u007fV\x03\xb6\x02\b\x00\x80\x98\x84LH\xf7\x1e\x0f\xac/\xeb\xf1x\x1dF\x97\x06\xe9\x19Z;f\xcc5\x1d\x18\xa7\xa3lE\xc7\xd9e\x0f\xe6\xe0\xec4C\xc3F\xe6\xdec\x16G#\xec\xf8(#\r\xd0\xf9\x94A\x8f\x05,\xaa\xb4\"\xe5Ujn\xf8\u00cf+\xdb]\xd6L \xd6X\x11\u041a\xa9\xeb\xdfP\xb9%j\xaf\xa9M\xd9\xf1\xe6o\xccO<\xa2\x16\xbe\xe4\x15y\xd1I\xc55\xb95\ad5\x95\x87\x92\xf6\x0e\xecS\xc8<\xb2\x9c\x10b0:ZUr}[\xc9qX\xc9\x18w\xd1\xe2:\xadn\xefW?\xa7\u01834\xdee\xe8\x00\xa3Y\u046dX\xa2 \xb9\n7\xfd\n\xcf,\a?\x871\xcehM\xadX\xe4:y=Vt\x82\x15\u047e\x9d\u073ac\xcc1\xf7\x92\xd3<[\x01\xfa\xad\x1aw\x15\xabq\x93\xd5\u00ff\x83cR7\xe1\xa4fx\xfd)\xfc\xfc\x99\x97Gf\xe4\xf2\x82\x97\u0594\u07d6\u05fctf\xe2\xea\"JQ\xd0A7z\xff\xffX\xf3\xcf*\xf0W\xb10\x84\xed\xf8\xef\xaf\x13XK\x06\xc9\x10!SXv\xd3\xf9\xffV\xf0\xb5\xfeo\xbas\xe33\xebs\xab\x8f>\xa7i\x8c\xad_\x8cDP(PE\x85\x19\x96\xe7\x9d[u\xc4j\x14\xd8*$\xd1\u0232\xb4UN!\xe0\u077d\xa3\xe1\x8aI~\x1cZthw\xd1\xc42\x87\xf0\x97\x8dW\x11G\xd9\u0122\u0747\x16\x85`m\xd7\x17f:G\x17\x1a\u0696O\xf6\x9d\x06\x8d\xb7:\"\xbd\xfdt@c\\\xd3+\xbd\x1d\xa9\xf6j\xe0}\xdf\xe4\x15mP\x87\x10\xc0+R\x14? \xe8Xl\xcch\xf1!61y\x1d!\x04#$\x97\u05b3l\xd9\u007f\x82\xad=<yR\u041d\xf3_\xc6{\xd7/Q\xfe\x85?\xfe\x8c2\x8eY\xa8-\xa6\a&\xf5\xd9\xe0W\x0e\xaf\x9e\xff\x9f\"C\xf0\xef\xaf\x17\xc2\xda\xc2\xc1\u00a1B2\xa5\x10\n\v\x05\xc7\u07dc\u713f\xf1_\x8f\x97\xbbd\xfe?K$\u27df\x91\xf9\x97\x11yU\x03\xa92\x86\xaa\x93U!*\a\x06_\x18\n6\n\x1e*\x11\x8aW\xe0m\x99\xf1L\x99\x93\\\xb5\xe1\u03c2\xb3,\x93c\xdc7\u9286\x1d\xbb\xcb\xdaVL\xf6\xbd/\xb3\r\x91\xde5FM\xe0i\x88\xc8l\x9f\xf6M^\xde&\xfd6\xd6\x181\u007f\xd1u\xc5\xe8|n\x1c\xe6\fd\a*D\v2\x86|o\xa9\x17{\x8bt\xe6V\xab&\xa8\xc1\x1a\u0193\x96\xbe\xf3\x84T\x8eGU\xc8\a>6\x83\xc5\xe2he\xfb\x8cY\xa3o\xf5\xf9\xdc\xfc\xa3i]\x9f\x0e\xeb2VG\xab\x0eE#\xf2r\xbbHD^\xee\xc3&r#fd\x90\x83\x8fbU\xaeJa\x1f+\xdb\t\f\x14`C0\x15-\xb1\xbb\x1b&\xa4\xf2\x12\x83\x9d\x9eD\xaa9\x16J\xc5Jl\xec\x8cs\xf1=\xec\x04^f\xb0iy\xb3\xbf\xd4\xf9Qu\x92\xd79-\x06+}\xeb+s~\xb4\x9a\xd7:G\xd7=HC\xf0\x16\xd7+\u07cbby\xa6m>\x02\x01\xe9\xe0\u007f\xb9%\x05\x86\x971l\xc5@\xd1\x10\xc6\x04\x03F\x1cp\xb7\xff\x91\xc01\x02W\x12X\x9e[J\xd6OC\x10\xa2\xf7\xa4\xd0\x13\x14M\x8f\xbc\f\xd1\xd1h\xf0\x19\xabL\x8e-\r\xed\u02da\x134\x10\\6\x8c:\xf8UB:\x00\xbd\x97/\"\xc0\xbd\xc3\x15|\xf0\xbb\xcb!X\u03c8\xe2\xc2\xd3\xfck\xa8\x18-zBW|\x14p\u01a1FH0?\x1e|6x\x9c\x96\xe0\"\xfb#\x87#\xcfE\x88g\x8d\f\xe5}4\xf6\t%^:\xb9\x15\xfb7\x03*rn\x19\xd4\fi\xee\xd7\x10\x8dz\x97n\x1f\xd5\x06\xa2\u053e\x9e=\x1d}=q\x1a\xb2\x86?DNg\r/g\xe3Fy%\\E\x8c\xaf\xba\xe4\xee\x03\xc4.\xe6\xb4s\xb1\xbc\r\xa2\x15{\x17\xd0U75\xcbo\x9b\xffd\xa8\xbd%\xed\xe8\xb6V\xd5$\x1d\x93\x16\xd4\xe5m\xb8\xa6\xfd\xc6x\xe2\xea&\xcb\x1b\u06a9\u05fd\xb2\xf7\xc6\xd7~0U\xfb\xc8O@m\xb0\xa8\xdfW\x99\xf5\u02a2\x99\x83s\x1e\xbe?\xe8\xf8\xc2\xed\u016f\xe6\xd6E#\xc4M\xa2\xbc\x85\xd0\u0759\x15\xaa\u00bc\u0092B\xa2\xfeH\x0f\u007f\xd0\xc3Kz\b\xeb\xe7\xe8\xef\xd0\x13\xab\x1e\xf4k\xfc\xbft\u007f\xed\xc6+\xdd\xdb\u0778\xd6\r\x9c\x16\xdcZ\xb7\xd6\xea\xcd\xd8\xfb\xed\xd8N\x16Yw[\xb1\u03da\xb1b\xce\nV\x9dw\xab\xfa\x16j\x92>\xe4h\xb1\xbcby\xc7B,\x1bm\x8e3\"\xbc*\x82\xb8\x89C\"\x8d\xed\xa7\xb3\xac$)\xf7Wr\xe5X9\xb6_\xbc)\x06=)\xab\x91\x81T\xb8\xa4\x16K\xa1\xb2<\x99\x84-\x10l \xf5\x10\xa8J0i\xe1\x83k~6=\u06f29=y*tJO\xbaJ\xab\\\xf8\xc0\xb0\xa1dr\xd4\xf1\xe4\x93\xe9\xb5w\xf1\xaf\xc5\n>t\a:\xfa\x9e?9\x94\x9cQ[\xa4\x93\x86\u03d9Jj\xbbjo>\xf9\xc2\xfa\xfb\a\u0299\x8d.@\x12\xa7\xe1\x0e\xa1\x02TM\x11l\xdf\x04\u007f\xbb\x9f:\xf5d+N\xe8'\xeb\xf1\x04\xd2N\xf0\x04O\xbb\aOp\xb4;pB3Y\x83\x13\xc2d\x01\xdbt~\xe2\x11\x1c\x1a\xab^\xaf\x11\b\x87\xca\x0e\x99|\\\xe0\xd0~t\x18\xfd\x1e\x11\xe4\xb5k\x04*B\xbf\xc3\xe3\xf1\x13\x81S\x16=\xe6\xd2\xf2\xf1\u01d4(z\xfa\xe5\xf8\u007f\x9d\x96;\xeb\xb9\xe7\xcbL\n\xdf=\xc9\nf\xf4\x01lc\xa6\x83\xd3p\xd2.w\x9d\xecI\xbb\\\x9c\x15X\xb9-\x97\xed\xc4p2\x94\xbcl\xca\xd1\xc1|\xe75\xb7\rF\x96$\xaa\xfb\xa3\x83\xffv\x8d\u04dd\x9f\xb7\xe3\xe6\xc1\xd2E\xd55\x8b\";n\x19\xac:\xeeI4\x86\x8b\x9a\xab<\x9e\xaa\xe6\xa2pc\u0083\u07ea^T:x\xeb\xa03\u07d5\u007f\xcd\xd05%K\xabk\x16\x96\xed\xb8y\x87=\u07d9\xb7\xfd\xe6\x1d\xf3W\x84\x9b\x12nw\xa2)\\\u0514\xf0x\x12M\xb2\x1d)\x10\xe2\x16\u04b8kC\x8fgLz\xb3Y#\xd8\xc0\xa6\xb7N\xb3\xdeOgvrV\x96\xfa&X\xad\x1a\x05\xc7)\x01 \x83\xf7c,7\xa6E\x9eX\t&\xea5*\vX\fH\x93\xd1\xec\xd2\xec\xd3\xec\xd7\xfc^#hT\xba\xf3zQ/\x98\u039bY\xe3\xfa\x8f\x99|\x1a\xd4D\x04\xc8\xcc\u029df\xaf\xf9~3\u045b\xf5fP\x9blc\x8dl\xd9vX\xaeL\x18N\u01cdl\x03r\xb3\xf8t<\x1b\x97\x9b\u06c9,\x93\xecxW\x9e\xa6\x10\x1a\"\x12\u0580\x95\xbd\xfcU\u051c\xd8\v\xfc\xb8\xea+HI\xb7\xff\xf6o\u007f\xfb\x9bt\xfa\u0739s\xcfJ\xf7\xc0\x04\xd6\xf2\x1e\xb1>y\xfd\x93\xef\xbeK7\xf8\x139\xb6]\x92\xa7DT\x981c\xe1\x10\x89\x89\x19q\x9dHDV\xe3\x15\xe4|\xc5H\x03\xd9\xd4sY\xcb8\x9a\xb9X\xee\x1a~S\x1a\x1c~S\x8e\x93+h\xac\x19\x14\x8a\xd1d\u050d^\xcax\xab*\x9a*\xb0\xad\"T\x81\xe3\xb1I1l\x89\x15\xc6p\xad\xb1\u0348\x9d\xc6b#.fI@I+\ar\x03\xa4\x90!\xc9n\xfa\xae\xb05\xdc\u0233fB\x17\xafPt8:\x8a:H\xc7\xdd~\u007f\xed]\x86\xf0\u0735s\a\xe7\x0e\xcd%s3t\x84n\xbfK\xa1\x10\x1b\xed\x8d\xe1F\xd2x7\x8a\xc5\x10\xda\xc7V\u007f\x15\xb6\xe6\xf3]\xad\xf4\xa9\x8dU\xddWj3Z\xee\xd3\xc2(212.\xe4\x89 \x89\xdc\xfc\xa2\xd3ts:Bg\xeb\xc5O\u04c3,\xfd<b4\u044d\x8c\x16rq\xd8<\xde\x1b\xf8\u03b8\x9e\x1a\xefx\u007f\xe1\xb2B@\xd2b\xf3B\x03\x91\xdf\xe9\xc86k0\xe6J7\u05ee\xfc\xb7\xf9K\x0e\xcf\xeej\xbc\xb1sF\x9b\xa3rFM\xcb\xe6\x99\xe5M5\r\xe9\x86\r\xff\xbex\xcdC\xcd\xe1\x9e\x05\xf3\xc25mef}\u064cI\xedWvEN\xad\u07e2\xd7\xe7\u06f4\xd6\xca\xf9\xcd&\x9fSO\x82\xa5S\xd3qS\u0456\xa9\x13W\xb6\x17G\x83\xbf\xf1%\xcac\u0392p\u061e\xdf8sq\xc3\xc0\xf6`\xd1\U000b6dad\xb3\u028bC\xc7-\x01\x97\xc1\xe4+q:\u00e1\x92|_f\u0192\xf9\xe9+\x12\x82\xda]X\x9a\xe7\xabNT8EWa)\xd3\xd99\xee\x1c9 p\u020c\x82l\xb5\xbb\xe7{\x16\x8b\xea{\xc8\xc9\xff0\xf0\x85\x1ev\xd1\x01+\xd6\u04d0\xcf\x16\xf1Q4\x11\x8f~\xf6\u076a|\xf0[\xefC\xe7lA\xe6a!\xbb=\xc4\xf6A\x1b\xdcj\vUz\xf2\x13a\xbb=\x9c\u021f\xd0\xc5\xef\b$\xfc\x06\x83?\x11(\x88\xb3}\xbc\xe0\xd2\xf7\x93\x10A\x03\x17>\x15\x1ai\\\xcfG5\xa8\x1dm\xcbL\u02f3@\x9e\x01\u020by\xaa\xb4\n\xf4&0\xa9L*\xb7c2L~!\xd2iOA\xea\x05\xb7pL\x8b\x8e\xd9\a\xe9\xfc\xf3\xfb\xb5\x04\xd9\rv\x9f}\x9d}\x97}\x9f]\xd0\u06b5\xf6B\x1at\x1a^\x8d\x9b\x1d\xad\xd0\xfaj!\xc7\n\xfb\xf4\u03d8\xf38\xc3\x19\x03E\x14\xb9\x05\xab\xc61'\u0335\x9c/\xe9\xccB\xe0\u04aem\br\v\x8c9kn\xb9&wy\xe0\"\x83W\xac\xe8_\x99\xba6\x95\xda\u04b1r\xff\xca\xea\xca\xe5?Z>\xf3\xee\u01b6\xf5\xc3;\xaa\xaf\xb8\xfe\xc1\xe7\x96-{\xee\xc1\ubbe8\xbe\xf4\xf8\xa6\xfe\x9f\xfeip\xf0O?\xed\x1f\u06d3/o\u06fd\xe7f\x8f\xfbY\x97\xa7\xf1\xeaGW,}x{ci\xc1\xc1Z\xe9\xcce\xdf\u077b\xb0\xaaj\xe1^z<\xfeey/\xfbd\x14\x9f\xc5C\xfc+\xf2<\x83k\x18\xaa\xcc\xddXG\xed\xa0\x1b\x91md\x80\xd9\xc8\xfcP\xc8\x130\xaf\xb7\xeaq9\xe8\xdf\xf7\xc4\xf4\xb1\xa1\xd8\xe3t\xea\xc1\xa9\xd8\x171!\x96Q\xeb[\x83\xef\u06e6)\xfb\x94X\x991Z[\x95\xe5\x1f\xeb\xf5EV\u04c7\xce?A\xd1G\xdc0\xfa&7\v\xe1L\"7\t\x81\x015\xe6\\\xb4t)\xcfR\x84\b}\\z\x8b\x974\x8cOC\x90a(\\\x9c\x86P\x0fX\xe1-Z\xdf\x18\x9fQ\xeb\x8b\xcc\xd8:\xb5\xa7\xae\xbaha\u5906\xdb\xe67.\x9e\xe4\x97>\fE]\u0290\u02d7(4\xe3\xe15\xb5\x19WrVj\xc2\xcc*\x17\u01e5\xab\v\\{|\xf1p\xcb\xe2\x06\xa9\x19\xea\x89\xc5]`\n\x15\xda\xc2I_!\xc2\x14/\xf4r\v8\x0e\tH\x8b\xe6g\xe2\xe4\x13\xe1S\xc0\x987q\xc0q\xaaO\xb4\x9fj\xd4jE\x941\xe8T\x82R\xafU\xa9\x88Z\xa3\xe1\xf8\u03d4\n\x05\x86\xcf\x04\xf2\x05JS?\x88\x1bs\x1b\xf6\x04\xba\xfa\"\xcb\u078c\x9c\x91'\xf6\xb0\x03\xea!`'f\x11\x82\xb9]\x17T\x9d<q\xe2\xa4\xf4\x1a\x9c\x1f;\xa2\f\xbeB'\xf7J?\xd9\n/\xe5\x8d\x1f^\xbc\x87\tI#\x1e\xd92J8\x84D\x82\u0223\x1c\x8a\x9eI@T\x9eW\x1c\fP\xf0\xe0\xe7\f'G\x02\xe4\xe89X\xc5\xd6O^\xb80v\x8f\x10\x93\x80\f\xac\x94u\u0447\xb4\u0201*Q+\xba>3G H\xa7xQiz\x11Q\x0f@C\b\xb3iM\xbb\x94D\x89\x94\xc8\xe9HC\xfa\x85p\x9b\xbd\n\xaa^p\xf2J\"\x1e\xd39\x8e\xa9\x06\x95CJ\x8cT\x06\xd5:\xd5.\x15\xa7\u0529T:%\xf1\xd9k\xa1\xf6\xd5r\xb3\xa3\x11\x1a_\xf5]\xf4&{*:\xeaN\xa7in\xfa\x8eG17c1\x98M9\x16Dv\xc7/#\xe5$n\x83\xd1\x05\xdf\x11\xf8W>\xc5]\xd71\xe93\xe9\xc9\xe8\a\xa08rP\x1a\xf4NJ\xe9\xbdQ\x9f{\xa4\xff\xff\u07e3\xf6\xf6\xaeqK\xeb\xa0Kz\x8c\xdc\xf6C\xe9\xcb\u0524@\xb9K-\x9d\xfa\xffv(\xb8p^\xb0p\x82\xf0.\"\xc8x\x04\xf1\x00\xcf\xe0\xdcMX\f/\xe7\xa6\x11q\xc27_q\x1a\xc1r\x8ca2\xe2$\x06\xaa\x03\xd6{tgt\x96C\xc8sHU\xec|L\x1fx\x8cg+\xe7\xff\xe3\f\xb5\x1f\xba\xfdnL\xbd\x9c\xf5\x05\u057d;[[\a\xb3\xd5\xd5\xd9\xc1\xd6\u059d\xbd\xd5\xcf:JR>_\x8a\xc6\xf7\xdc\xde\xc1\xado\xd9\u065bL\xf6\xeeli\u0759\xad\xaa\xca\xeel\xf5\u05b0Ok\xbc\xbeT\xc4\u9324\xd8\xfa]\x848\x03\xf79R#=[q$r\xa0\x13\xb5\x98\xdd(\a\x13\xa4}T\xc3\xee\x95\xc3\tlT\xfd89N.\x10\x9edhj&\x88\xf92\xeb\x9f1\xb7f\a\xb2\xf13d\xf7\xad\xbb\u8c11\xfd%w\u0491n&G\xf1\x03\xa3w\u04f9UzM^\xe8\v(\x8a\xdb\xf0o\xa8L<l\x8ck\xa5\xa1'\xc1\xee\xe4e\xa0\x95\x06\xc5{\xc8\xee\xd3\xd3Y\xddQ_\x9f\xef\x94\xef\v\xdf\x05\x9f\u023b\x9b\u070b\xdd\u012d\xdf\x0f\x00:\xf5_L\u007f\xc2\xee\xbf\xc0\xbb(\x17hr\xf0\x88%\xf03\x88fm\x88Pz.]q\v\xe3\xb7F\xf1\xe3\u07ccl{\xaf\xbc>\xa8\x8f\x15\x15\u0369\xda>\xf1\x81\u0553VwD\x9c\u0573&,\x87~\xdcv\xf0d\u0664\xea\xa8+TT\x1c\xbd3\xd5\xeaOg\xeb\xcbgt\u036b\xee\x93i\xae\xc3)|\x84?\x86*\xd0m\xbfD\xaa\v\x1f\xff\x8c\x92\x1c;\xca\xf6T:\f\x1d2\xe0B\x90\u06ed\x0f\x9cF\xc8vZ\x99\xd0'\xbc\x89h\xa2/q*\xf1E\xe2BB,\u0667\xdfO\x13i\x95\xa1\xc90\xdb@B\x06(f\f\x93\xa5\xf9[\xf3\xf7\xe4\x93\xfc\x0f\x8f\xbba\x99\xfbJ\xf7\x0f(\xa7nsq\u80f2?\x99?0hN}\xeb^*\xd9\x14-\xa9\xc8c\xc5\xdc\rU\xe8YS\x0e\xab0\u007f\xb2\xcax\xe4b\u0468\xfa\xb2\xbb\xa9\x8c\x8b\x03\xdf=c^\xa2\xad\xc2q\xf8W\xed\xd7N\x9ct\ud536&C(\x13[\xb7\xa02S\xa8\x89'\xa2\xb3R\x8b\x1b\xeeX\u06b0\xa2\xa3\x94;\xdd4\xe0\u05aaJ\x92\x93\n\xb7\xdd\x10\b\xfc\xa6\x88^\xd4\x1ar\x9b\xf6\x9b\xbcak(\x1e*\xba1\xda\xe0\x9f\xd0}\xe9\\9=*\xca8\x049\xb3\x88\x02\xfa'S\xe5\xa8\x191]U\xb1\xdb\x1eYu\xbc\b\xed\xd6X\xb4\xc4\x00\xdd\xea\x92\xea\x86t\xad\x9d;\xe1r\xb7\u03d8Q`5U\xd4\xd4\xd5\xc4\xcd\b\xe4\x1e\xe0\n\xae\x17\xb9Q*S0I\x0f\xac\xb3}qZ\x83\xd3\u075c?\u02e3\xcc\u05fb\\:\u0598\xd4X\xd9\x14r\xd6\xf1\x05\xb6\x00+\xcb6,\xfd\x8cw\a\xd8|&`\xa2\x1a_\xdb\xf2\xe6\xd4\x19t\u0767\x05*\xceD4\x81\xe5S\xab{\xf21\xc1\x84\xb5\xa6\xe1\xcd\xf1F\xc1\xed\xb3g\x97\x97\x96D\x82\xb3\n\xa5\u7136\xdc\xf8z\xbd4\xcc\r\xc9\xf3\v\xaa\x9e\xe4Fx\xf9\x16,Js+\xcfka\x04Y\x91\x16\xb4\n\x05\"?2!\x9eJ .\xd7f\xa8\x12s+\xc5#g\xe4\xdb\u0170\xa7p\x11^\xf8\xb9\xa1\x1f\x1fx\xa0~v\xdf=\xab'L\xdcz`\x00/\x90\x86\x85\xe9_\x1f&\tSb\xcbs?\xbc\xf5\xa5+\xe3\xf2\xfd\x9dp1\xbcEv\xe4\xee\xef4~O\xa7K\xef\xf44z\u007f'\xb6\n\x9e\xc1\xb6\u007fu\xbf\x05\xfc\xd6w\v\bp\xe1\xa4d\x01V\x91v\xa1\xa9\x99\x18a\xf58\xbb\xd5bQ(\x8c\xbb\xd3h\x10\r\xa1\xe3\xe8\x14e-\xed\x1et\x0f\xb9\x8f\xbb9\xbbUo\xf1Z\xb0\xc5\xc2[u7\xf2t\x98\x18e\xd6kJ\x01%\x82\xa2l\x06\xbeY\u51bf\x145\xb3\xbek8\x99\x10=\x04\x1e\xf0\xb6n\x9dS\xd6\xea\xd6\a\xc3A\xbd;\u04b6\xa0\xf3y\x97\xb7\xb6,\xff|\xaa\xa7\xc1\xafQ\x1e\xe4D\x81s\x05\x82)\xdd\xdd\xf5\xaa\x82h=\x02\xb4\x80\u0193Vy\xfe}2S\xa87yMQS\x9f\xe9\x94\xe9\v\xd3\x05\x93\x98\xbbu\xd3{\xeb`\x17\xec\x03\x02ZQ\xff_\x88\u018et\xe2u\x88\x8e\u07bc)\xcb40~\xf7\xa6`\x02\xb7~\x0e\x84\x80`\xb6Z\x15\x9d\xab\xa1\xecY\xdc\x06\xbf\xb1\xd47Tj\x14V\x9bE\xac\x1f\u030d\x9bP\x8a\u2aa3\x14W\x99\x91\x17\xcd\xfb%2\u6882\x96\x81\xa9\xaa1hE\xd8&\xef}\xe4\xd7\xfb\x87\xfc\x8f\xfb\x9f\xf5\x9f\xf2\u007f\xe1\x17\xfc\xac\xacjy\u007f\x9a\xaaO5\xa4\"*\xf7\x87\xfa?\xd9?\xe4\x87Goq\x95\u0341&&$\xfa\xb8\xbc\xfe\xc3_\xd2b\xc7G\xcbfmik\xda<;Z6s\xeb\xd4\u018d\xdd1\xa9=\xd90!\x99\x9c\u0410\xe4\x16\xcc\u0653\xad`ko\xe9>\x16\xa3\xfb\x81\u014b\a\x06\x16-\x92i\x9fEqP\xef(\x0e\xcaf*\x19\xecQ~\xaa\xfa\x84\xe7\xccZ\xc0Z\xe0\xb4\x04\u007fJ>\x892\xb7\xb5!@\xdfAB\xe8\x9f!\xa13\x9f\xd9\xe3\xd1>\x06\x9f\xe5\xf3\x151\xb6\xaa\x85$\x81\xcf\xedh\xeb\xe35\x06\x80\xa0J\x12\u018ep@\xaa\xdb\n\v`\xc1V)\x957~(c\x9ar\x84\x84[\xf8#\x860z\x13\x1fC\xc8\x10B\xdb\xff/2\x8a\xe8\xff\x92{G\xfe_mW\x01\xd7V\xb2\xee\xe7\x9b#!B\\\x0e\x04H\x80\x84\x84\x04\x1a $!hh\vI\xbb\x10\xb8\x15\u02b2@ho\x95\x15\xf6\xf7\xbae\xdd]\xbb\xbdR[wo\xf7wo\u07baw{\xdd\xdd\xdd\u0775\x8473\xe7pHi\x9e\xbf\x87D\xe0?sf\xe6\xfb\xce\xe4K\xbe\xef\xff?/\xa2P\xaa\x92\u00d2\xc4a\xb34#a\t]\x88\x00\x01}\x81\x9b\xe19\xde2\x15\x93\u007fb\xa8/\x16S\xfa\u0297\xe8\xeb\"\xee/\xa4/\xa2f\x82\x9d\x12>\xee\x04\xb3\x13\x9c\xe8\x1a\x04\xa4\xb7\xb5gt8\xc5nh\x97l|\x13\xa4\xcf\u714f\xd3>93\xe93@F\xf6\xca\u008b\x16\x11\xed\xf3 \xe4MY1h$\f\xa3\x1a\xd0\xd0.[\x10 \xd2\\\x1d\x15\xb3\xc5\xea\u00a5\xdc\xfd\xfc4\u04daX\x93j4TV\x9d\xa65\x81\xacf\xab\u05da\xb2\x8eZg\xac\xa2\xa2;a\xa2\xba\x13(\xa2\xcaNLE\x8ae'\x14\x85\t\u534bkY\u007f!A?qZ\xe9P\xf8\u0612\xecD6;\xf0\xe0\xa6]\xe1\x9dTv\xe2\x91\u007f\xe9qwlL4\x12\xd9\th<\xf3\xc3F*;1\xb8$;\xd1\xd5\xf8\xed\xca\xe6:;\xf1\xb5\xcdDvb\x94\xcaN\xb4x\xba`l\xe5f\xb2\xb8(\xeb h\xf6Z\x1b\x90\x0f\u0475_\xb3\xf8G\u0600\x1cy\xec\x12\x1a\xc8\u06d0'\xf3U\xf5\xbc\xc6\x0f\xe1\x18\"?%\xf0\xf3\xe8a\x82\xb7\xa5\xf4\xac\xc1\x98\xabf\x19\x8dJ\xe1O\xa0l\x11\x1e\u05c4J\xe2gT\xfcI\x15_I\U0001cef1$~L\xc5\u03e2!\x82w\xa5\xca9L\u01398\f\xae\x98\u070269\xad\x8dNi#\xa2w\x87\u0189g\x90\x0f\u07e3\x1c\xae\xaaj\xe7H\xabZ\x97\u048a\x16\xb8\xc7b\x16kR\u058c\x10\u007fJ\xf65\x13\xb2\xa1;R~\x81\x87A3\bf\x18\xe4@\xe0\xc0\xcc\xd9x\x9b\xce8a\x11/\x04\x00\xb0\x1b\xcaL\xbb\x1c\x0e\xfa\xe2\xb3\xcad\u03d8\x1c\xc0\xdb\x05\x9c\xb3X\xcas\xc7up\x8b\x0e\x86t\u0425\x83\n\x1d\x94\xd1\nK\x93\xb5,\xa7\xe1L9Y(\x82p\x06\xdaT\n;)r\xfb>\xd0}1L\xd9\xf4\xec\xf3M\xf2\xa9O\u0522\xa4\xef\xe4\x1aA\xaa\x19\xa1r\uc07c\xa0\x8a?=\xf5b!z\xb0p\x12\xef\xe7\xc7\x17~Ey\xee\xd8\xfe\xcfs`r+S\x8cPx\xf70\x83\xb3lM..\u0629F\x02Y\x93\x06\xb6\x8e\x97\xc1)\x84\x90\xfe\x05p6\xf9$/[r\x86c|bf\u03e0\xe2//2\u007f\x01\x83\xd0\x00\xd4_,\x12 \xc5B\xa5\xf0\xf3hR\xb6'k0l\xb0)\xe8\xe2\xfe\xf5E\xf8\x13\xc8S\x847\xdb<%\xf0X3\xa6\xe2gQ\x85l\u007f\fn\xe20\xa07\x84\x00\xad\xb0\u007f\x88\xf2\xd4\xd91\x9a\xe49\x14\xbeS<\x87\xfbW\u0381\xf2\xda\u007f_\x84\x9f_|\xa8hL3+\xe7\xb0\xf8;\x84\xb8\xa6\"\xfc\x89\xc5T\x11\x1e\x9d1\x878\xe9\xffG\x9a1\x15?\xbb\xd8K\xf0\x15/\xc8S #Z\u032f\x98\x05F\x11E\x1f\u008c<hWj\xb5e\xa2lWm_-\x8cWBW%TJU\x13\x013\x98\xc1\xb8\xdd\xeb6\xe5\xa4\xe3\xf0&|\x17\xb8[\x00\xe6\x00\x86\x00\xbaX\xb5^\x19uS\\\x953Z]9\xcc1\xa2\xcar\x05\x1e\xf10Za\xf3\xce\xd4\xef\xc9\xef\x14\x8d\xd8H\xb8\x12\x95\xb5%\x1c\x8a\xd0D\xbd_\x11\x99\xa0\x9c\x96\xb6x\xe4VEaB\u045b\xb8\x95{\x85)M\xfc\xfa\xd7Dk\x82\u06c0\xb7S\x99\x89\xe7\x99\xe4\x04\xdet'\x95\x9b(\x1c-\x14\x9e\xfd\u0752\x1d\x85\xdb\xd9y\u07ea\x9c\xf7'e\x9b\xb8\x99M\xfe\x98\xaf\n\xe9\x8am\u00b8\xcbl\x8d\xdbd\x1b\xa2M\f\x8f\x83l\u07fa7\xdf\xdc\xfe\x1f\xe2\xe7\x01\xcb6a\r\xd6\x05#\xcbhT\n\u007f\x02\x1d+\xee\xff/\xf9HW\x89\xfegT\xfcI\xf4\x8a\xd2\u007f\x98\xeesM\x9d%\xfb\x1fS\xf1\xb3(\xcfl\xce\xe1\x04\u0676\xc8\x11\x16\xf2\xc1A]\xb1\xcd\x01\x9d\x0f\x06\xee\x14\u007f\x14\xe9\xd1\x05\xa9\xb5O\xe8`\x8c;\xc8a\a\xe7\xe7b\x1c'rp\xb6\xf6\x88\x16WjC\xdaN-\xa7\xd5\xc2\x18)6\xc0\x0e\xd1/\xc6X\x91\xc1\xd9\xe8\b\u0095(\x84:\x11\xa7E\xc0}\x0f\x01\xa2\x1f\xf0\xea\x890v\x0e]\x8d\x8e#\x0e\xa1\x8a\b\xcd\xdfE\x96\xaa\xb5\x91\xe2\fZHh\xc1\xa5\x05\x8d\x16\x02p\xb8\xf0\xe5C\xd0\f\xadGI(\xde|\xb0\xf0\xd9\xc2\x17?\x88\xbf\b\xcdG\v_\x860}\xfa\xf9\xc3\xd0\\\xf8\xf2a\u01119\xe6\t\xbf\xfc\x14\xaaD>\x14Am)wM\xd0\xedW9\xd2\xees\xcaw\xb6T\a\xc2^+\x1f\xa6Z&o\xf7\xbdmae]\u07e7\xdeF\x1e\xaa\\s\x96\x86\xa0$h5M\xe1$Dh\x17\xb0*K\xa1=\x00,'\xaf\xb0\xce?|M\xe6\xc9\r[\xa7(\a\xfa\x9c{\xfa\a\x1f\x1f\x9d\x9e:\xe5\x8d\xc0\xc7\a\xb62\x02\xf4\x83\xe1B\xb2n\xb4\x85\x92\xa2\x15\x06z\u03fe\u96f6C\xf0U\u0184\xae\xf5\xcc\xcd\\\xfb\xde\u00b7_\xca\xef\u017f\b\x13\x1a\xf4\xdeg.Zp\xdb\xec\x84\x18-\u06cdq[\x99_t(~\xd7#\xfb\xa9\xc4\xfc\xf4X\xbe\u06a7W-]\x02?\x8f~#\xfb\x05k\x90\x93<*\xbat\xff'\u041d\xc5\xfd\x17\xf2\x9ep\x89\xfe\xc7T\xfc,:\xb0\xb4\xff\x05\xe8\xe6\xc1Iq\xfd\xca\xfd\x8fq\xff\xd81\xba\x951M(c\u0492\x83l\u041a5X\x1dS1\xff\u078c*P&\xd5$\x9a\xc01\xf1\x00\x02\xb4\xcb\xedq\xf7\xb9s\xee\xfd\x84$!X\xf4\x9a\x89\xb2\xed\x95\x153z\u02cc\xa8'\xdf\x1a-\xa7!f\x95\x93(\xe6\uf6ffOM\xcbt\x1ch\xa2}\nT\x06\xbe\x83\x06=*\xc1\x9b??\xba\xef\xcd;o\xa7\xb2\x16\x0f]\x91\u07d7\\\xb8v\u04e5\x97\xcc\xee\xdd\xcd\xe1\xe9go\x18)\x10}\x91\x1f\xaf\xbe\xf4\x99B~\xcfe\xe7\xedB@yLBX\xf4\x10;\xcc\xfdk7\x8d\xed\xad/\xc9a\xbf\x91\x86\xfd\t\xf2`\xb0\x15Z\xd3\xe8\x88\x062\x1a\xd0\f\x86P(9\xe0\x05o\u06b2e\xe0\x9a\x01\x90:\x06\x93\x9b\xd6j\xbc\xf6\xf6\xe1>H:~V\r\xd5#\x92\x9d\x16\x1a\x12vC\x9fRg\xf8\xfbw\xa8GR\x1e\x83\x99\xe4\x10\xc9ok\x8b\xfc>\x80_N;\x14\xbdsR\xeb\x0ey\xf9M\x01+U\x96C;\xfe\xd1p\xdfY}\xe1\x8a\u0606d\xebP\xcc\xfd\x8b\x1fn;\xd0-\r\f\x8d\u058d\x8e\x1b\x1b\xd7w\xf7m\x8e9\x1b{\xd7\xf56n\xdfz\u07b9\x85\u03ee\xbf\xf5\xad}{_\xbb1\xc3\u007f=\xb5u\xa8\x93\xe4\xc8\xedu\xc1h\x83\xa7\u007fx\xb2\xfb\xd9c\xd5u\u007f0{$SO\xaf;\x14j\xad\xf3\xa5\xfa\x06\x82\xb1lo{\xac7\u0617\u077a\xfb\x9f\x87\xf9\xbd\xe7?4\xdb\x1e\xdex\x99ls\xc6m\x13k\x89\xcd\u05f2\x98g\xcd#\x88\xeef\x11\v\xdd\xcd>\x9ao\xef2\xd4(6/\x8d\x9f?\x1fQ\x0fa\r\x0eD\xe2*z\x19\xebU\xb1'\u0422\x8a\xf5\xc5W\x97\xc0\x1aU\xec\xc9E\xb9\xdf6\x8a\x8d\xf6\x97\xc0\xf2*vVDrd\xd7ki\xe0p82,\xa3)\xbc\b\xff!\x15\xff.R\xf0\xed\x14O\xea\x0e\x8a\xf1\x88\xa3x\xf1Y~\x1fj'\xde3\x84>\x90\x9a\xd6\x19A\xa7\a\xbe\x06t\x18\xb8\x9at`\xd0\x12\x8b\x95\x872\xa0\xcd@&\x13\xf1o\u024ed\u7cb8+]Q>6\x1cK\x06\xd6\x05p0\x00\x81Q\xcb\xd7\xd3?O\u33e5\xe1\x8a4\xa4\xd3M\xc1\xb5\xb0v\xc4k\x96\x82\x0epd\xab\u033d\xd92gS6\x82\x9c,\xae#\xdfSQ\xf2+GwQ*m\xa2H\a\u041b)\x9a\xb4\xffy\x1b\xdd\xfb\x10\xcb\xd0\n\x94&S\x9a%\u82ab\xb4(\x85\xa8VL\x1aT\x18T\xfc\x9f\xae\xff\xca@x\u04f6\xcb7\xac\xbd|*^L\x1e\xfc\xca\xf9W\xbd6\xf7\xe1+\x96(S\xd3\xc7\xc7)aj\xe1\xbe\"B!\x146\xc8,\xabH\u01becO|8*\xadd\x17^\u007f\xad\u02a7\n736\x15\xae,\xe6\x1a\xc2\xefd\xfe\x15\xf3)ZoM\xb9z\xc4>\x83J\x8c\xb9\x1b!dN\xe9`4\b\x8e\xa0W('\u664a1,\xe3\x9c1\xff\xcb\xc8\xfe\xfa:\xf3\xd7\x10\xf3\xd7\x17\xf2\x91\xb8QR\xfd\xb5\x14~~/\xf3+\xd6\xe0\xbcP\xab\x8a.\x85=a]\xc6\xea[{J`y\x15;kU|*I}\xca\x10\xca0\xb4\ua0cb_B\b\xbe\xc6\xfa~G\x89-oAt\xe4\xc0[\xe4\xd8Rk>-\xb6<\x80\x10\xfe`\x11~~q\x00\xb1\u0470\x06\x13\xbc~Ely\x98\xe0\xbfT\x84?Q\xf8Yq\xff\x85\xbc\xdeU\xdc\xff\xe2\xf7\b\xfe.\x91W\xf1\xb3\fOcK\x9bE\x89-\xf9\xba\x15\xb1\xe5z2\xe7\x8cX\x8f\x02(\x81\xe6S\xef\xd1\xfb@\x16\xaf\u0579!\x98\xfe\xac\tL[\x92\x9fLB$\x99K^\x9d| \u0277\xa4\u07ed\x80\x8a\xb1\x8e\xcfv@mY34g\xaf\xae\xd9_\xf3@\rWS\xc3kb\x10\xcb\u069de9\x1e\xce\xe2!\u0083\x9b\a\x1eP\x1f\x8b0Y\xba\x8f\x12c\u06e8.\x13\xb9g\xb7\noa\x15\x04\x125\xe0J\xb8V\xa8\u04b2\x00\x80\xfcS\x13\x00\xb9\xe6^\xe1\t\xc0\xc7\ubca1\x99u\xd7$\u007f\xb0\xfdX\u6f34/s\xd3\x1b\xf3\x94\xc8\u043f\uf46d3\xb7x\x1dU;V\xfft\a\x14\\\xadgE\u03dbr\x91\xcdwv\x92\xd0\xe7Z\\O\xd7\r4\xdc~tv\xe0\xde\x17>w\xe9]\xdf:<\xb2\x96\xf8\xf3e\xaf]\xbb\x86\x04(\xe3\xf7t\xdc}\xef\xc2\xee\xc8\xd8\xea\xc0\x9dw\xf5\xed^\xdf\xf8\b\xb1\x17\u3230\xfd\xeb=\xf2\xfe\x15e\xab_\xc3V\u007f!\xefi6\xa03\xfcr;\xb3\xd7\x06\u064f\xdfe~\xece~\xfc\\\xde\xdf\xe44\xfc\x87\xf8\xf9\x9d\xcc\x1bX\x83\x11o@E\x97\u009e\xb0\xab}\u04f1\x04\xa2%\xfb6\xaa\xf8\x93V\x86\xafg\xf8Sy_[I<\xaf\xe2\xa9\xef\xd3\b5B]\x9f\xb6\xf0\xf6\xb2\x16jl\x8184\x8e\xbe\u035b\xf9\x8f\xb2\xba\xac0\x9aI%\x8c\x0f\xd6A\x1d\xff\xae\xf4%\tK\x12\xf4\xe0a|%\xbe\x13\xf3z\x1c\xc6\x187\xeb\x01 \xf0\xdc\xf7\xaa\xc1T\xddW\x9d\xab>^\xcdWk\x9f\xbb\xdb\x066\xf2\xbe\xf9\x05\x92\u07b4\xa1\xe7\x00E~N+\xcdde^\xaaPE\u0746V<)\xfa\xa5\xc2\u007f\xa2bK\xb4M\x17\x0e;\x1b\xa2UUm4\x03\xdeVU\x15mp\xae|\x8e\xb7\u007f\xf3\x9b\xbf%4/\xb3\xb9\xbe3\x14$t\x00\x8b\xbf\x13\xff\x80~\bc\xf6\x91?$\xe9\x1f\x92\x88#k\x92\xe7\xb7\xf3\a\x90\x1b\u0563&R\u02fa\xf1\xa7\x01\xf8J\x00.\x0e\x1c\n\xe0\xfa@4\x80\xed\x01\xf8[\x03\xfc\xdc\x03/y\xa0\xc9\xd3\xed\xc1\x95\x1e\u0419A\xc0\xe0w\xc2w\xb5\x10\xf0T\x95\xf9$_\x87/\xe3\xe3}i\xb4eUn\x15h\xaa\\U\x89\xaat\x15_\x956\x8e5\xd7\u0430\xdcO\xf2\x18\r^rS\xd3\x10*\xab\x95j;j3\xb5|\xed\xb0\u036c\t\xb9B\x89P:\u0107\x86\x05\xe7r\xd6<\x1c\x96)\\\xf4\u01a2\xbe~\xa8_\u02c24\x9a\x80Z<\xa1T\xfc(\xa1\xb4\xb8\x14I\xc7\xf9\xed\x94\x0e\x94\xdc\u0752|x\xed\xc0\b\xa5\x04\xf5\ue376>\xd8\xdb7\xb8\xd0i\x00w0\xb9g\n\xf6\x8b\x85?Y\xfc\x8e=\u04f8\x952\x84\xec\xd6\u9279\xf5\xdf\xdcOYB\x95\xae\x91\x99m\x99\xcf\xdf8\xd6\x0f\x9f\xa8x\xec\x89Tk![\xa6y\x9a\xf8\xd3Q\xd5_\xc7\xe5s\xe1\x1dv\xee\xb8\u0679s \xef\r\x18*\x8a\xfd\xaf\x18\xaf\u0129\xd7*{#m2\xea\xae\xfb\x8f\xf0\xf4|h,\xea\xffo\xf9\xbaU%\U0007c29f\x8d\xc8;chigt'Y\x8b\xe2\u0619\xd51\xb3cL\xca\xe7g\x8f<\"\x0f9\xc8{=\r\xa8\\9\x82\u0293\x12\xed\u0207b\x8c'e\x00\xa1\f\xa2i\u0756D\xd8\xe3&\x19\x92x5r\xbb\xed-\xc3&'\xf2\x0f\vf\xa5&\xa6\xafO\x0e\x94\xc9\r+x(VI/\xa6L)\\P\xd7\xe9d)\xf8\xbc=\x919;A\x99\xe0\x1d;\xef\u0692\x98H\xc7Id\xc0s\xfc\x12C\xf4\x13\u0144)\xee\u04d4V\xbf\u0111r\x90s\xc1[S\xd9n.t\x95\xa1\u00a5\xd2\xea\x9az\u007fv%mJ]\x03^]\x83\xd9o \xf9\x1d\xc7*\xbap\xe0\xe9A\xe5\uaaa9\xfcC~\xba4\xff\xd0\x04\xa5\xf9\x87\x04O\xdb>O\xf2X\xbf\x12k\x91\x9d2\xe0\x10\xb2\xff\x8e&2D\xcd?9h\xe4\x803\x95\xe7\xca\xe7\x88@tyQB\xab\x8d\xe6\xe3\x14\xfd\x87(\xd5\u007f\xa0\x05\x0e\x1aZf\x9b`2\x10\\m\xf4\x82\xf6\xf8\xee\xe8'+\xfb\xfa\xbb\x9d\xb0\xdd\xd1\xdd\xdf_\xc1\u007f\xbdn\xac\xa3c\xacN\xces-kB\x90\x11~\x95[/~\x88\xe5\x14\x0e\xbd\x8c\xac\xacV\u00da1H\u498c\u07b0Z\x8d\n\xf2\xc0^F\xaag\xed7\x98\b0\x87\xdedI\x18\x11UR\xc6F+\xf9G\xe5\r#\xba9\x1dF:\xd0=\xe9\x82#.p\x95\x19I\xdef\xbf\xc9\xe41\xe5Ls&\u0794\xb2\xb92\xa6'\xaa\xe1`5T\xd3Vz\xf2\xff\xea\xfd&!'`\x81\u030bTEM})\xcc\xee 2E\xee\xbfD~[[Je$4\xed\r\xaa\x80\x01\xb7>00\x19OL\xf6\xfb|\xfd\x93\x89\xd8\xe4@\xf0\xfex(\x14oi\t\u0145\x8fv\x9c\xdd[[\xdbsv\"1\xdeC\xee\xb7t4G\xa3\xcd\xcd\xed\xedt\xddO\x92y\u007f]4\"7\u02a4Z,w[a\xce\nV\x0e\xf1\x17\xf2\x98\xb7f\b\xe0.\x13\xa9\u0298\xd3^\xad\xfd\xae\xf6\xb7ZQ\xabM\x1b\xc1x\x17or\xe5\\\u0605h]\x1a\xad\xbe$723\x9cZ\x82\x86\xa4\xf5\xb27\u04c05*\u01f5\xf0\xb4\xc7o\xf8\xa0\x18\xec\x1f\x8f5f\x87\xcf\xf2y|\xe5\x1f\x14\x1bWoi\x0f\x8e\x0e\x9d%\xac\x8e\xc5G/\x1a\xf2{\x03\xb5\xed\U000512c6\xfd\xb5\x81Z\xe5\xfa;\x90\xe7\x8e\xe1\xa3,\xe7\x8f\x05\x84^\x01%\xe7\xaf\\ve\x037\t\xf9\x9f\xfcd\t\xab\xf9\x0f\xb1\x9ae\xac\x8b{\x1b\x1ef\xfa\x8e\x03\xa96\x93\xd1c\x8c\x18\xb9F1)\xae\x13_\x16yQs\xe8QC\u0780\xe7\r7\x19\x0e\x1a8V\xb2\xe97\x80hp\x1a\xb0\x01\f\xf7\x8a\x1c\xa2B\xe4J\xe9\xb0\u0317\x0e\xf4rt\xaa\x1a\xbf\xd1\x18X\xd5^\xf1M&9\u03bd\xed\\\x92\x18\xbf\"\xb6\xe2\xb8kR\xad\xcaq\x99P\xba\xa2\x91\xce\xf4\xd2U\xa1tE\x0f\xfd\x05:$\"\x83\xae\x1c\x96\x1eR\xb9~\u0792\xf29\xbc_V:\xff\xa6\x91\x1eVx\xc1\x99\xb8\xf4\xca\xcb:\xbao\xb8\x81\x1d\xf6?\xbd\x9e\x8ez)\x1dvY\x9d\xff\xbf\xeb\xe9`:\u007fn\x1f\x9b\u007f\x05\xba$5ar{\u0738\u045a\xb4\xae\xb3\xbel\u5b76C\x8fJy\tG\xa55\x12\x9e\x97n\x92\x0eJ\x1c%\xe7\xfa%N*\x97E\x9a_\x16xA<\xf4\xa8>\xaf\xc7\xf3\xfa\x9b\xf4\a\xf5\\T\xbfF\x8f\x05\xbdC\xef'C~\x10\x01\x92\xf4\xf7Z\x05\x8ee\xc9\xe8\x18\x15\x1bE\xa2\xcb\xc6\x02\xc5V\xb5\xfe\xa5\a\xf0scP\xb5Z\xe1g\x05\x8f1P\xf4\x94\xfb\xea\xb2\x15O3h\xe9\xf9<#\xbd*\xc9\u017e\x97J\xb7JG$N'UJ!:\x87C\r\u05b8u\xd0\xfa\x02\x99\xea\x836\xb0\xfd\xa7+\xff\x02\x9d\xadU\xb8W\xd2+\xf3Q\x8d\x1f\x99*v\x83\xa5\xb5\x17T#<\\\xe4\x0e \xc1\x0fN\xb3\x89\xf0\xe0\xb2{\x14y\x8a\xa2\xe1\xcf\xdd\xcf\xfc\xa4\x02=\x91\xba\xfeA\xf7\xf3\xee\xb7\xdc\xdfs\xff\xce-P\x02\xe3\xd5n\xce\xebna3T'\xc7&Zj\x86#\xb69\xdb\u0576\xfd6\xde\xfc_\x9d*!\xb5\x8e\x889qN\xe4\u0624U_\x93-\xa9\xceX}\xb8\xd2\xf5\x84\xd2>\u0226_\xda%]\xcb\x0f\x15.+\x1c\xc3\x0f\xf2\x8d\u0206\u04a9\xe6\x19\u01c5\x8e\xbbIV\x9f79<\x8e\b)J\xce9\x84kt\xa0\x93\u017e8\x0f\xc1\xb7\bo\t\xf4\x02c<-?\u021bH\xf5\x81\tE>\x1df{\xf7\xa7\xa7J))lk\x1a\xde\xd3\u04f5'\xdb\u071c\xdd\xd3\u0573g\xb8\t\xffj\uc4a1\xfa\xfa\xa1K\xc66_2\xec\xf3\r_\"\xd7\xd7O\xe3m,O\x1cN9i\xb5\x9c\xc0\xf3@U\xb9\xcaH*\xb8(\x0fLV\x86\xaa\x10\xb7\x9dV\xfd\xb6\xa1T\xb1\x1bBg\xf4K\xfb\xa4\xe9f\xa7\b\xa2\u04afxZ\xbf+r\xc9x[\xa9\xd41\xed\xb7p1B\xf8\x00\u04f5\xf2\xbcx\xfaE\xa8\xb8\x15\x17\xa1\xa2\x97\xeb\xc3\a\u0605\xf7\x145+\xeaw\x06\xbc\x1e\xffEx\r\u9403\xb0V\xbac\x8e\x01\a6\xb9<\xae\x88+\xe7\xfa\xae\ubdeeE\x97F\x8b\xe2x\x10c\xfc=\xbd\xa6\x8d[\xcda\x8es\xba\x1cB\x8aPW\x04\x10~\xac\x15\x1d\x0e\u03a4\xf9\x16\xf7m\xe5\xf2@2\x8b6\xdc\xc6t\xf1\xc9\x13\xb2H\xac\x16\xb2\xdeA\u0530b\x10e\xd7\b\x8a\xb3\xda\x03\xfc\x97+\u007fS\xb8\x16\xae\xfd\u0555\x85\x0fr\x9c`s:\xb5W\xe3\xef\x1f:t\x14\xf7/|\xfa\xd1\xd0Tky\xb89d|\x13\xfd\x1b=\xe5s@\x00\x00x\x01c`d`\x00\xe1p\xb3\xa6\xeb\xf1\xfc6_\x19\xe49\x18@\xe0\x84\xb8\xff/0\x1d\xd3\x16\xf9\xaf\xfc\x9f\b\xfb:\xf6b\xa0:\x0e\x06&\x90(\x00:\xfe\v\x9b\x00x\x01c`d``/\xfe'\xc2\xc0\xc0\xc1\xf0\xaf\xfc_%\xfb:\xa0\b*\xb8\f\x00\x80\x88\x06\v\x00x\x01m\x92C\xb4\x1eA\x14\x84\xeb\xef\xbe\xfd\xcf\u0136m\u06f6m\xdb\xf66\xb6m\u06d8\x93u\x8cUl\xdb\xd9\u0119\u050d\x93\xf7\xe6\x9c\xefT\u3daa\xc6\u01cfO\xd5$'u1\xc2\x1e\xc7\x04\x97\x0f\x05\xa47\xbaz\xf1Q\xc9\x1dGS\x93\x05\x13\xccA4%\x15\xa4=*q\xae\xb5i\x8aJf\x1e*\x98\xda\\\xd3\x10\t9V\x89\xb4'\rI\x19\"\xa4%\xa9OJ\x91\u06a4\x92\xd6\xebZ\xdd\xe3\x17v;\xd2D_\xa2\xa7+\x06\xb8l\b\\\x1a\x8crK\x11\xc88\u049d\xfd\xd3\xec\x9fE`3\xa0\xaa\xd9\x18\x96qI9^\x1b\x81\xd7\x10A\xb4:\x89\x8fQr\U00087eb8\x9c+\x82\x8e\\\x97\xc7\x1d\xc6N\xb9\x03x}\x01'\x80l'\x8dQ\xc4l\xc4,\xde9>\xb5\x98T\x85o\ub19fee\xa4\xbe,\xe6}o`\xb5\xfd\x8a\x9er\x83lDO\x9b\x06y\xa4/\x92s\xfdj3\x04\xf3\u0310p\xa7\x04\xda\xc6jo\nV\ube1c\xd6z*\xd7\xd81\\\u007f\x05]mc\x14\xe2\xdcR\x9e\x87\xe80@\xba\"\xae\xb6\xedf\x942O\x90IzG\x8e\xffP\xb4\xfe\xe5=\u06f3HS\u049e\xf8Zc\uf86f\xac\xc4\xfb\xe8ft7\x8fPHv\xa2\xa9\xaeQ\xefuL\x10~\xb4\x03\xb4\x9e>\xfa(D\xca\xe9[\xe8\xc3jW\x01C\xd4\xef\xc8\xfa\xf0\x1a\xc7\u06db\xb7(\xc3\xf5\u0359kA\x85\xb4\xa5\xf7U\xd5\xf7\xd8\xf0:\x03\x9a\x85\xe6\xf07\xcc!/\xa9j3\x84\xaf\xa9%\x99U\xa1_9\xfc\x0f\xef5@U\xb3\xf8\x1b\xcdB3s\u00f0Z}\x8f\r/!Zj\x16\xb2\xf1_\x98\xc1y\xfa?\x87\xba\x98\u0726?u\u007f\xe5\x10\x03\xfa\xa2\xaaY\xfc\x8df\xa1\x99\xa9j\x96\xdcc7}kN=*@S\x9fD\x02\xa4R\xf4\u007f\xb5\u04d0J\x91\x1cl\x1bt5\xfb\xd1T\x89\xc4\xfd:\x8a\xde\xc6\xff\x06\x00\x9b\xb5\xb3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00X\x00\x86\x01$\x01\xf2\x02\xa2\x03^\x03\x86\x03\xb6\x03\xe4\x04\x1a\x04B\x04\x86\x04\xa0\x04\xd4\x04\xf8\x05>\x05p\x05\xbc\x06:\x06\x82\x06\xf2\al\a\x96\bR\b\xca\t\x1c\t\x84\t\xca\t\xf8\n>\n\xae\vf\v\xda\f\\\f\xb6\f\xf4\r0\rr\r\xd2\x0e\x10\x0eF\x0e\x82\x0e\xda\x0e\xfe\x0fz\x0f\xe8\x10<\x10\x82\x10\xf8\x11l\x11\xe2\x12\x14\x12T\x12\xa2\x13\x88\x13\xe6\x148\x14\x8a\x14\xae\x14\xd2\x14\xf4\x15(\x15@\x15p\x15\xe6\x16J\x16\x98\x16\xfc\x17n\x17\xbc\x18\x9a\x18\xe4\x19$\x19\x82\x19\xdc\x19\xfa\x1ap\x1a\xb8\x1b\x04\x1bh\x1b\xcc\x1c\x18\x1c\x98\x1c\xf0\x1d8\x1d\xa2\x1e\x80\x1f\x1e\x1f\xa6\x1f\xfc ` z \xe0!F!F!\xa4\"\x12\"\x98#6#\xb4#\xda$\xb4$\xfe%\xa4&*&|&\x98&\xa0'L'b'\xaa'\xec(F(\xd6)\x06)T)\x90)\xc4*\x14*P*\xae+\x02+(+R+t+\xea,\x02,\x1a,2,J,d,\x80,\xee-\x02-\x1a-2-J-d-|-\x94-\xac-\xc6...F.^.v.\x8e.\xa6.\xc0/\x18/\x82/\x9a/\xb2/\xca/\xe4/\xfc0J0\xde0\xf61\f1\"181P1h2 262N2d2z2\x922\xaa2\xc22\xda2\xf43\x823\x9a3\xb23\xc83\xe03\xf84\x124\x825 585P5h5\x825\x986\x046\x1c6:6z6\xf67F7\\7r7\xae7\xea8.8\x968\xfe9~9\xc29\xee:\x1a:::\x8e\x00\x01\x00\x00\x00\xd3\x00g\x00\x05\x00U\x00\x04\x00\x02\x00\x10\x00/\x00Z\x00\x00\x01\xcd\x01&\x00\x03\x00\x01x\x01}\xcf\x03nd\x01\x18\x00\xe0o\xed\x8d&\\\xbd\x18cD\x1b-k\xbb\x8d\xc66\xef\u0483\xf4z\xe5\xcb\v\x8a\xdf\x06\xde8\xf3\u00b3\x97\xef<\x13#\xb4\x9f{+\x16\xda/\x14|\r\ud5fe\xdb\t\xedW\x12\xfa\xa1\xfd\xdaW\xe7\xa1\xfd\u0641\v\xff\x8c\r\xb4T\x05\xf6\x95\xf4M\xfc1\xd0U\xf5\xdbDEM_U\xcdX )x\xb0#\x88z\x9e\xce\x1e\xa9\x19\x9bh\x19\xe8\vd\xa5dd\x04\xcafZ\xba\xaa\xb7\u046c\x9chR4'\x19\xcdi\x9a\x9a\x1a\xfa)-mq\x8b)%C%\x15M5)\x03c\ri]\xad\xf0\x8b\x89\x9a\x89\xb4\r\xab\xfe\xfao\u02fe\xff\x92rR2W\xe4\xf41\xa3x\x01l\xc1\x83\x01\x03A\x00\x00\xb0\xf4k\u06f6\x8d\x91n\xe1\x0e\xd4.\xf0\x89\b\xf8\x05A\x9c/\x12\"I)i\x19Y9y\x05E%e\x15U5u\rM-m\x1d]=}\x03C#c\x13S3s\vK+k\x1b[;{\aG'g\x17W7w\x0fO/o\x9f\u007fA\xf0\xb0\x05\x05\x00\x00\x00p2?fo\u0676\xed\xb5\xbd\x9b\xf5\xb2]\x97l\u06f6\xf92\xcf\xf9\xe5s3\x9ah\xaa\x99\xe6Zh\xa9\x95\xd6\xdah\xab\x9d\xf6:\u8a13\u03ba\u8a9b\xeez\u8a57\xde\xfa\u8adf\xfe\x06\x18h\x90\xc1\x86\x18j\x98\xe1F\x18i\x94\xd1\xc6\x18k\x9c\xfd\xb6\x99m\x8e\v\xd6\xfah\xae\xa5\x16\xd9`\x8f\xed5jZX\xa3\x96YV\xf9\xe5\xb7%\u0599\xef\x9a\x0f~\xdah\xaf\xbf\xfe\xf8g\xab\x03\xee\xb8\u5820\x90\xe5\xc2\ue278\xed\xaeG\xee{\xe0\xa1O\xa2\x9ez\xec\x89Cb~X\xe1\x85g\x9e\x8b\xfb\xe2\x9b\x05\x92\x12R2\u04b26\xcb)\xc8+*\xa9(\xab\x1a\xef\xb3\t&\x99h\xb2\xa9\xa68m\x8b\u9999a\xa6\xaf\xbe;\xeb\xa5W\xde{\xed\xa8cN:\xe5\xba\xe3N\xb8a\x9e\x8b.9_\xa3v\xbdJ6\x11\b\xb4\xeb\xd8 W\x8d\x14K\xa1\\1\xd28\x9a\xab\x14K\x95|\xa4\x98\xc8\x15\xff\x03@<hK\x00\x00\x00x\x01\x14\x10C\x80[At\xdeL\xb0\x8e\xb1\x9c\xd4n\u007f7:f9\xa9\xf53\xf9\xb5m\x9dj3:\xd5\xe61?\xb5\xcdS\xf6^\xdb6g\u007ff\x9e\xfd^\x8d7\xff'\x11t\xc0W\xd8\xfd\x05\xa4O\x10\xfc\x18\xfe\xa8|$\xdd>\xec\xfe\x80k\xde\rx\xd7\xf4\x8eHo\xa1\xcd\x1b\xff\x1b\xfef\xc2\x1b\x9d\xf2\x14&>\x82S\xe2\xe3\u04476'\xd3xM\xe8aa\t\xfb\xfb\xc7K\x1fx\xef\xf1\xfb\u07bb\\\xfaS\xf3g\xf4\x1f2\xea^\xf6\x1e\xf6\u0713\xee\u1ee4\x94\u07beUJo\\\xf7\xd2\xffWJ\xa9t\t\u039e)\xa55'G\x9f\\v\x92\x9c\x12\x97\x8e\x9e\xb4\u0635Z/O\x1c\xcb/f\x972\xa0\x895{\xd3\x05%\xac\u06ce\xd0\x0e\xb1\x83$\xb7\u007f\u060e\xb7m-\xa5\x9767m\u01a9x)\xa5\xb1n\xb1P\x8c\xf4\x8f]\x8cec\xe4\xec\n\x98\xf4\xfb\xf0o\xcc\xe6C\u06d9\x81\x99\xb8\f\u073c\xd4&\xa8Q'\xa8A[\xee\xe2$\xf0L\\615\x91$'\uc780=\xe3\xd5\xf1\xb8\xdd\xc8\xe0H\xdcv\x04\f\x1fj\xa7\xc34l;40\x14\u06fcV\xae\a\xc2u^\xc2M\x04\xba\x91\xdd\x04\x17*\xe5J'\u53623Z\xa3-\xa3\xd5\xd1}Q]\x9a\u00f5\x886\xe5\u00da\x16\x11c\x11\xf3\xc8\x1fe\xcc\xfaC\xb0?\xb0~\x10\xec\a\xc3\xc44\xb1P\x10\x8f\xb0\xb9s':\xd9#\xbf\x88\x85Y)\u035d\xab;\xd3\x14\xa7\xd7\xc1-`\xe2f\xaf\x89c@\x1c\u0088\xa7MY\x13\x96L0\v-Ei\xf4\x01\xe9\xcc\b\x969A\x0f\xa7 \x95\x89\u021d:\xf5>e\x14\x83z\xab\xf9\x03\x86\xa9\xb0Nm#\xe7h\xcd\xc0\xa1\xaaa\x9d\x8a\xf8\xd0a\x833\x00\x89!\xab\xe3qTW\xd9[\xad\x96\a\xab\xa3+\x87\xf4V\xc7kBMNX\xa6\t\xe6\u028c\x13\xd55W(&$\x00\x041\fl]\x9c\x87\x18\xba\xdfD\xd7?;\x13 \x0f\x99kPTkS\xa3:\xd8\xcfX\x1e\x13\xa6\xaa8e\xb4\xe5C\x8f\x11\xa3\xd24a9J\x01b:\x99\xe3\u07dfF\u0597")
+
+func third_partySwaggerUiFontsDroidSansV6Latin700WoffBytes() ([]byte, error) {
+	return _third_partySwaggerUiFontsDroidSansV6Latin700Woff, nil
+}
+
+func third_partySwaggerUiFontsDroidSansV6Latin700Woff() (*asset, error) {
+	bytes, err := third_partySwaggerUiFontsDroidSansV6Latin700WoffBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/fonts/droid-sans-v6-latin-700.woff", size: 25992, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiFontsDroidSansV6Latin700Woff2 = []byte("wOF2\x00\x01\x00\x00\x00\x00,\xd8\x00\x0e\x00\x00\x00\x00[D\x00\x00,\x81\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x16\x1b\xa5@\x1c\f\x06`\x00\x81\f\x11\f\n\xfb@\xe6n\x016\x02$\x03\x86L\v\x83(\x00\x04 \x05\x82d\a\x83g\x1bXN%\u3615\xb8\x1d @Um\xc2(J\")\xc9\xfe\xff[\x02\x1d2\x84\xa2)\xa0\xf3O$\u0084\x15\u0444i\x86&:\x10\xb3\x16\xf3\xcc3i^\xe7&\x96\xf4\xb2j\b\x93\x8f<\xb4\xb2G\xd9\u053f\xc2$n\xfdK\a}\u2123\xd75\u007fC\x93\xba)m\xcd\xc2\xc1e\x8d6\u0155$\x824\xe9#;\x9d\v]>\x05\xa2\xd5?\xfaQ\xad\x169\xda\xd7\r\xa5\x84'|W\xfa4\x1aY\x06L\x9cp\x19(\xe0\xb6_i\xf7\xca\xc0{[\xf8$\xc2\xd5\x10l\xb3\x9b\x99`$\xa2\"!\x12VQ%\x02\x92\x82\x05\xa8\xa8\x18\xd13z\x9b\x9bK}{.\x8a\xb9\u029f\xeb\xcfm\xef\"\xe2c\xdf\xea\x9c\ry\x19+\xe7\x17F\u0388\xabp\x97X0\xb7\xb9\xdc\x1c9\xbc\xd2\xccC&\xf4d\x1f\xe2B\x81\xe7\u007f\xbf\xe1\xf1\xfb\x1e\x8a\xa0\xc5ni\xc6`0\xb48XX\u02fb\x01phS\xa5U\x1f\x06\x90_!\x9a\x10o\x9a\xb2\x19\xa6`\x19\xbee\x9bu*\u0470\xf6\xef\xb7yT*S\x8f\xed\xd3\xf2RP\xb1'\x93d\x05\xf0\x0f\xfd\xfb\xf7\xa4\xc2&5*?\xdd\x14\xa8t\xb1\xde\x1c\x81K\xe5\x95\x03\xdc\f|\xfe6\xbc[:\xff\x93l\x87\xb4\xab\xc0\a\xec\xe1:\xae:\xdb\x1bx\xc0\xa1\x03\xb6\x1d5\xeb6\x99\xeb>\"\u016f(\xaf\x01\x02\x0e\xea\u03bfNs\x95\f\a\x18\xe0\xe9\x8a8L\xbd\x9b<z\x98o\xec0\xe9\u007f\u024a\xbf\xc0\xa9\xc2r\xd0\u0391\u008aCJr`\xb8\xf7l'=\x02\x9ej\n9%C\ti\xeb\n8L]\xbb\xe2<6\x1do\xeb\xd8}\xeb4\"\x0f\xf8k\xa5\xbdW\xd4e\xfde\xcb#\\\u02f6N.N\xf23\u064c> \xf9\v\x80\xb3\x87\xb3\xadf\x8d\xc6lN\x97\x15\xaa\xaa\x13JV\xd8BN\x139\xf2\xed\xc3\xe0\xb0jj:\xedoL}\x1f^M\xc7\xe6R\xbb\x8cAC\x11\rA\x04DD\xe2\x1f\xb39\x06\xc8yd\xa5\x80^\xde\xc2<\xbe\x94\xd9\tf\xcd\x01OE\x11\xb0@\x01B Z\xcd\xfeoY\x99\xa3\x90\x89\"\xac\xc1\xec\x1bT\xc5\xd3LI5\xda^\v\xbcy\xe7C'5\xe3~!\x1f_\xad\xe8\b\xb1K\xf6u\xf9U\x055\xaao\xf5s\xe4\x151\x16\xd2\x1a\x13\x1f/C\xd2\xd75\x18?2+\xb9\x9e\xfc\x9a\x8a\xa9\x8b\x01\x1a\xbc\a\xaf\xfbT\xbc\xe5\xa7\xfeZ\xd2\xfd\xe9\xa5\xf4u\u0595~\fbv\x1a\x92\a\xe4G\v\xf9\xfe\xb4\x98\u0093O\xcb\x10\xb4C\u007f\xf4n\xfbZ\x89N\xdaQ\u007f\xb3W\x83O\xfaFv\u4393\xb7\xad\xd3}x6O5\xef\x8d<\xde\ta\x12\xa6_\a)\x19\x86\x8a\x06c\xe6%\b3\x16J6Y\xb1\xe8\x8f[\xb388lX\x9ap\xecX\x81\x04\x9c\xa0\xc1\xc0\x03\x16\\\xbc\xe1'\xab\xed\x87\xc0\n\x10\x81\x93\x90\t\xa4\x90\x0e\xa9M\xb7\x10=F\x85Yg\xa3\x04\x13\xb6\xa3\x9a\xb2\v\xdb\x01\xcb$\x8e:E\xe9L\x92\xcdr\xd1%jW.\xce\x16,\u088bQ\"\x89D\xa3\xe11r\xc4B\x89#\x12\x9f'\xc62\x01+q\"\x82(\x86 \x83\xa2H\xa9 T\x90\xdan;\xe8\u0429Kwv\xed\xcfA(C\x86\x8dd\xb7\x13\x99\xdf\x05\x8bvZ\xb2\xcbA\x87\x18\x1c\xb6\xech8\x05\xe5\xcc\xceP\x88E#\n\xbb9r\xa2\x12\r!\xe6\u01a5\x9e]\a\xd6\xdb`\xdcF\x13as\xb6\xd8j\xdb\xec\xf6\xd1\xcdl\xd6\n\x02\xa2hDa\x1f\x8b<Q\x8d\u0798p&I\x92$\xd7\x1aW2W\xc7\xcd,\u02ad\xc5)\x18\xdbV\xedp]\u0627\x8e\x1b\x90t(\u05b6\x8c\xa1\xdaD\xfc\xdfkk{;\xda\u066evw\xed\x0ev\xa8\xc3\x1d\xe1\x8adj5V8kc!\xf6\x89\xe3p8\x94\x80D\x83\x88I\u011d&A\xc9\xd4\"\x00\xa0\x80\xfb\xcd\xdbA\xac\x88w\x15\x8d\xdbsv\xdb  \x82F\x14\xa6\xc7:\xebm0n\xa3\x89\xb8\x92\u01ab\xd0R\xb6\x1cm\uc268\xdc\x1c\a\xf6y8B/@\xaf\xb9\xc2_6>\xf6Z|uVY+\xeb91\x14k\xac\xe0v\x0eS[\xb3\xb2\xf5\xddb\a\xdd,=v><\xa2\x91 h\x87\x811\xb1\xb2\x9c\x11\\\u13c9N\xca\x15\x1f\u0255\x1e\xf9UljBI%-\xb4\x9dv\x1d:u\xe9\xeeH_\xd1}\xd2\xd4\xf9\x06\x996c\u059cy\v\x16\xed\xb4dW\xf6\xc0=x\x0e18l\xd9\xd1p\xec\x1ew\xc2\xc9pj\u03ec|\xf1~;+D\xae\xaa'U\xc1\x11\xea\a(\xfaY\x12\xd4\xf9\x80*\x97\xae\x95F\x1az\x84w\xbb\xba\x82\b\xbd\xdcxJ<\xdd\xed\x92H#\xb7\x18UU\xd5\xfac\xf5q\n\xf9\u01b4\x19\xb3\xe6*y\xc1\x97;\x10O\xb8\xf2\xb1\x1c\u03c9\x9ct\xa8\x8ezZR\x9bf\x9a-\xd6\xc1\x1f\xe9\\\x89\x16\x06`b\xfd\t\xa7\x82\n+JJ\u0151T\xe2q\xd3\xd4]\xc9+\xd4_\xe7\\\x9d\xa9|\x93\xe9\xccd6s\x99\xcfB\x16\xb33K\u0655\x03=\x98\xfd\u0621\x18r8\xcb9\x9ac=\xde\x13\x89\x93iE\x8e\xab\xb8\x1e\xcc\x13\xdd\xce(\xb3,\xc9ZR\xd5WG\xdf7\u07c5.vg\x97\xbaK\x18\x92d\xa97\xab\x03X\xd7\xe2\x0e\x9f\xe2C\xfd\"\u048b\U000ea28a\u0696\xd3b\xbd\"\"\xb2>\x95-PDDDDDDEDDDOUc\x81\xa5\x96\xb8\xd1rR\x01\x12%\x8cB\x9c\xc2\xd3g@\xb4\xb6\u0474\xe0\x10:\x8a\xbc~\x8d45!\xe7\xa4\u0486\xdf8\xadVk\xca7a\xba3o\xcev\xce*JS\x9d\x142\xde\x1d\xb1\x1e \x1c\xcc.m\xba\xea\x89l\xb3\x92\r\u6894\xa6\xa1u!;,\x16\x16VVw\xdeb\xae_c1\xf5\x02c\x8e\x9bm3\xf6\xd6\xe5\x83\v\xb8\x97\xea3\x06\t\xf1b\xb1\u0242\"\xa9\x85*\xf4\xcea\xa0\xbc\xfeT\xce$F\x19,H\xa0\u05cf\x95.\xd4\xd3n\x13\xec!u\x1d\xfc\xfd\xe4\x80\x06n\xff\xee\xe3}\xb9\x0e\xbd\x9c\u007f\xff\b4~\xe9\x11*^\xb9m\xa5\xa5\x93M/g\xe3\x1d\xf3\xa8\xaf\uf62dt\xe0\xd2s\x90+G\x1f\xda\xd3>Qs\xe6\xa3s\xeaup\xe8\xf5FJ}qy(\xfa|\x84\xa3\f\xda\xc3X\xdf<\x86\x18\xf5d\xb3yd\xdc7\x81\xfd\x8e\xbf\xaa\xc4\u007f\xa7I\u0274\xf1\x8a\x91I\x85\b}\x9e#\xcc\n\\\x17;GL\xf0-\x0e\x83\u0438T\xf2\xa7\x85\xc8c\x8e[\xa6^\xf3\xac\x8d\xd5\u062e(\xea8\x84\xbb\xd3\xd8/|\xf4\xfa@\xd8kp:H4\u052a\xe3\xf9$\xf1a\xf0\xd5\xd9\xefP\x98{\x95\x87B\xe2\xff/S|X<\xbdF\x1aB['p\xe4A\xe3\xb4\x11\x97_ri\xfc\x96\xae\u01b4\xe0\xd9\xf08\xfb%\xad\xb4\x85FiryY\xa1\u0487_\xb4/DG\x94\x85\xffc|3\xb1\x12\x1b\x04\xe7\x96(\x8a!\u0258\xb9\x05,\xc4E\xb0\u04d2]\x0e:\xc4\xe0\xb0eG[\xa2\x8e_\xfe#n\xbc\x96[\u079eo\xb2\xe1;\xb5\v\x87\xec\x9aU\xfa\xc2G}\xb7\xe1W\xfd\x9d\x06\xea{W\xf0)\x1c\xc5\xd2\xc8\x13L\xc5=\u0461\xf7\u0715\xbf\x8c\xf8\xcdi\x1a\xe6\x1f\x90,\x8el\xac\"\xfa\x11\xf2\xe3\x9a\xc0v\x01\xb0 \x00\x96Zk\x1b*\x80\x01\x9b\xf3\x19\xf9\x0e[:|\xf9\xf4vN\xb0\xe6j\x00\xe8\xeem\x000'F\x80%\v\xb4[\u05a0\x87\u02c4C\x00L\xc6\x01cR\x8e\xe2\u007fC\x90\x8b\xf2\x8b\u071d\x13\u0096#N\xb9\xe73\x04\xe6\x9c\x1d\xe43\x9cYs\xa0\xda5\x0e\x9f\u6e5c\xfb\xbf\xae\xef\x9b\xff\xd7rK\xf6\xca\x1eY\x92\r2\xc0\xddE\xb0\x15b$D\x94\xf0\xf0*\x80\xb9\t\xc0\xc7\xd0\xecv5\xea\x18\xf6$`>c\x80O%\x16'\xbcCp\x97\x1cb\xde\xd2\xd2%\x8am\x1e\x1a\x87w4\xa5\x8bO4'\x8a\xb3\xa7\xa1\x9d/F\x9e\x1a;1H\xea-\x85p\xf1\x99\x97\x1f\x1b\x1e\xe9\xdci\xc1y\xedj\xc0\x92\x17\xc7l\xae\x1dY\xa7@\x92\x9bC\xa59\x90\u05bfh\xab&S5,1\xcfZm\xe5\u2043B\xda\u0626\xd87\b\xa4t\x9c\xfb\xe8\xdb-\xb4pf#\xc7b\x1a\x03!\u011b\xe8q\a\xdaW\x13\xdbO\xccl\xe7-\xac\xf3t\xc1\u0726-\xccf\x9f\b\xb8\xf6S\x1d\x91\xcb\u028e[\xb3\t,\xd3X\xe3D\xcb9+X\xc3\xee\xe0\xfaM\xbe7\x99O\xcb\xf7!6YdJ\x00\x993M\xd9m\xdb.\n\xcb}S\x94\xa2\xe63 \v\xaff\xa8\f\x93u\xcf6\x1b\x0e\xc0\xd8\xdcGe6\xf5\xf0\xc0\x81\xc9\x1cK'#`\x90\"0o{\xa8\xc4p\xacl\xa6\xa4\xd6MB\xbb+\xcb\x05\x85\xed\u007f\xe0X\xce\xd7\x18\xd06\xf0R\x93\xe2\xf1\xc1h\xbd\xb9\xee\x18R\xaaM\x03\x8eS~\xb6\u05f2}\x82\xc4^\xbf\xfb\x92y\xf7\xb4&\x134U\xc1W\x16\x9fA\u05e9E\x89\xc8&\xab\xa5\xea\xaa\x1d\xfc\xac\f\x89\x05\xce\xe0\xc00\u02e8qo\xe1\xacvw\xbbn{\u00ddb*\xcev\x02\x15\x8c\xd1\xe4c\xe9p~\x1a\xc3]\x9aKC\xa7oo\x82\x17\xbee{\xed\u01a7W\xc1\xa2\x16\xa6\x92\r\xf3M\x152\u007fM\xd0r\xb3\x1f;1IR\xbd\x1a\u8c3c\xf8\xe0\xfd\x1a\x86P\xcb\xfb\x16\x97?\t>\xf8V\xdd4\xb0\xe8h*\x82\u06a5\xb7r%-\u077eNn\xdc<\v\x16\xeb\x03\xca\xccN\v,\xaa\xaf\xb7w\xc1\x03F\x84\xd8\x03\x19\x05Z\x06\x89\xea\xa5+\xb8k\b\xf5\xf9`\xa6\xe17\xebak\xce\xcc6\xfb\x1a\xd9U\x0e\x83vh\xbe\x95\xca\":\xc2y\xb4\xa9\xdc\xc2\n\x18\xf56\x8b\xb5\x88}\b\x8d}\xe5\u07a2\x16|Y=QD\x17\x84\xcc\xc1\xba Jq\xe2\xd6y\xba\xae\xf2\u00f6ZY\xa5m\x11`\xe5\xea<| \xe3t\xeeC\xe0\x80\x18J\x803\xab\x0fJ\xbe\x16\x06\x82r6\xf8\t\xf2\x9fi\xcf\n\xef\xf4\xe3\xed'G\xbbe\x14\xce+\x8di\xfc\u0232-\xbc\x96\xceB^]\x12\xb2\x97M5\u0351\xec\u0185:\xa7\x85\xd35\xd1\xf5\x13\xdcw\x90S\xb3\xe5\xeb;^\xb8.\xc1f\\]\xb8\x1f#\xc9>}~\u013e\xee\xf3\u0732\xa7\x0f\xa5}e\xb7\x06q7\x8bw\xbd\xa2&\a\xb4\xb0\xf7\xf5\x1b\u007f\xa8E\x05\x15yU\u0366\xfbM\xc4\x06\xc3\xcd\xe3\n\xd8\x1b\xf7\xdee\x9f\xb8a\u0712T\xbb\xff\x1a\xae s\xb3\u055b\xbb>\xbc\xd6\v[\x16t\xf6bD\xfc\x82\x10\xbc&\x14!\xa7\x83\xe6^(k\u4ab4\xb8~\xb8\xbb\x9b\xaaT\xc2\x00\x056\xff\x10\x94\r\xe0N\xad\xbf\xfe\xc4\x04\x0e\xdb\xdd\xd67>\xf8\xc1\xb0\xe9r\xf2;\x8a\xbe\xbb\x97\x8b\x00\xc0\x027\x0f>\x06\x8cx\xe9\x93#u>5\xd1\u0243]\x8e~\xd3\xeb;\xfd`-\xa7\x8e\xa9\xdcu^f\x90\xbd\u0324\x17\x19`e\xbevg\x18.\xeb\a\xbf\x1c\u07a1\xf3\t\x94\x9a\xe3\xab\a\u007fM]\xd7\xc2I\xaf\xb9\x9b$$\uc531\x8d9\xb0\xaa.,^E\x1b\xbc\u0590\xec\x115\xe2g*\xaf'6\x9e\xa3\xc2\u035c\x8a}\xddnI87\xc1\xe6\xe1\xe4\x00\x1dA\xf8\xcdZ\x82G\xc1\xcdY)\x9e\xb7\t\xadB\x8d\xf2\xb8*\xaf\xb0\xfe\xd8L*\xdeK\x0e\xda\u007f\xf6\x12**]-:\xa7\xbd\x06o\xa5\xc79\xae\x94\xd1\x14B\xac\x80\x9f\x0f\xeaC\xaap\xaf\xe9\x19\x9c\x1c\x14\xbd\nt\u03e7\x1b\u04b4\xb9\xa3\x84\x8b\x15\xa76\xa0\xb1d\x1f\x82{\x85D\xe1<\x9d\x1b\x8fM\x96\x05\u0162\xab\xb23!\x93\xf6\xd0V\xadR\xf3\xa8^\u00a1u@(\"\x0f\xe3'o~\xe9;f\x9a ]\x10~\xbe\x8e\xf1E\xbd4\xd4l\xed\xe5\xc1x\xcc\xe6\xff>$\xfb(\xab\u01a6G\x88\xd9\xdf\xf8\xf5\xc4\v\xc0\xe1\xd9}\xe6U=\xb7\xed%\xb7\xdb/*\x99\x81\xd8\x1b\x9f\xb0\u007f\xf3A0\xf0.iw\xa5\xa3%\xef\x80e\x8b\xf3\xed\a\xa0K8\xd6\x03Nv\xa5\x01\xe3\x0f\xdc\xfa\xf4)V\xf4\xd4\xf6X\xa6\x00\xc6d&Vi\xd6L\xd4\t\u06e2\x17\"F\xef\xb9\xd8\xca'\x9b^v\x80\xd2\xfdtt\xbf\xc7\xdd>w\u0132\xd8\u04f9\x01\xfb9\xca\x1b\b\x95?$\x12\x80\x14\xafH\xf4 PB\xa8\x81!\xa6E%\xd4\xfb\xfa\x99'US\x13\xa1\xcd1\xc8Z:d6\xd4B\xba;a\x14\n\xe3Xdv(\xe2\xf5\xfc\xa7\xd2\xee\xe4\x0e&\xb6\xd0\xde\x1c\xf2I\u0631\x10\xb7\xd7k\xd2b\xb9\xff\xa2\xedi3*Zs3\x83\xc1Q\x9cr\x05\x98\xb5\xe7\xbc\x1b\x86\xf6\xe4\xab\xfd\xb6\xfd?SrB\xa1\xcfa\xc5\xf4C\x0f\xddGC,\xc2\x108\x1f\xa6\x97\xea\u0401g\x10(\x1f\xd24[\xdb\xec\x1c@y] 4W%\xd5\xfeq\xf6V\xa0\x04\xf89\t>\xa2U\xc4\xc9%\xb0\xa7\u05dei\x13.\xf9\x95\x81*\x8f\x1f\xbd\u007f\x19U\u007f\xf0\xa1\xb6%0U\xd7kc[\xbc7\xa1\x83\x8bU\xde=\x870\x84\x14\x8b7\xb8\x154/\x83b\xe8cD\xd2\x10z\xd1@\xee\x93\xea\xe4\x84=\xc5VR\xa2K\xdc\x18a\txl9\xaa\xfd is\xb1\xbbc:\xd4\x1fm\xb2\x85\xae^\xf2\x1d$z>o\xed[\xab+\xa9@]\xe8k\xfa\x15\xec\xa3j{D\x0e\xdb\x14\x91\xf4\x03iwkq\x03\xb76\xd8\xd2>\xe3\xaeI\xe8\x16\xb2\xd9\a)\xaf\xc7\xc3\xeeuc\u063cr=#c\x976n\x1a\u07f8\xc7\x17\x8aa\x94T\xc6jg{\xca\xe1\xf1\xb9A(\xd5\xe0G\xbc~TF\x85\xeegzf\\\xd8A:\xb97\xee\x1e\xa7\xa0\xfb\xb2J\xb8y\x1aa\x9a\xd0\x18\x05\f\u06b3\xd7`\xdb\xca>\xc1\xe9\u035e\x9d$\x1e\x8c\xe6\"\x0fx\xf2\x12&\xab#\\:\xcdqm\xe7\u0771L%d:}\x15\xef\x05i6\xd4\xc7hnc_\x96\xa8\xf6\u011b\xc5\xd7N\xf3\xe4\xae\"\x00Kb\x8b\xe3\xb19\xaa\u0472tu\xb3>\xac\x96\xc9C\x18\u007f\x18!\xb4\xb1)\xb2=6C\xcb\xf1\xb3\xebS\xe2\x0f\xc1A\xb4\xaf\xb1\x06\x1d\xfe\xffg\x86\x11\u007f\xfa\x94\xe0Jb[W\xe5\xfd\n8\xb1I'\xee\xd8\xea\xadq9\x1c)CG\xa6\"\xbb\xb8pc\xfd\xa8\x8e\xccn\t\u0324nZ\xbb\xfd\xbc\x02\aCp\xf6n\xe3\xd0j(It}w\xb7E\xde\xd8\xedY\xf8\xc5rCc\xf5\xb5\x95;M\x95\xfdGW.\xcc\xf4m\u052cJ\xb4\x04\xdf\x1c\x1a\x90\x17_\xc3\u0234\x9fk\x88\xef\xd3\xfd\xe3\xbb7o\xe6\r\x90\x1d\xaa\x17\xdeI\x0e\xe0\u0630w\xe3\x01+\x9f\xdb\xd3*N\x15\xef\xb0\xf1\x89\x82Pq\xe84\x9brah\x82;\xae\x98o\x821X\x95\x17\xf8\xa1~\xe6\xae\xf1C\x93\t\x8b\x9e\x98\x82\xf3\xc6;50\xcd\x1d\xf5[\r%\x04\xba!\x80/\xd8cQyr\x8eFR6\x8c\xdc\xf7>&\xff\xf2\x9d\t\xecB\xac\xec{\x17\xe1i\xd1\xce|@\x9b\x9f\xaai\xf5\xc5;/\x1c@\xd5>+\xfdh\xe6\xec\xdeq\xeau\xbe\xbc*\xc1\xb0\x17\xbc\xb1\xa9\xcet\xb8X\xe0\xf1\x18L\xd2\xde\xc8\xce\x1c\a&\xf3A\xf8\xb0\x8a\xf7\xaa[4\xe9m_YW\xf8\xc6\u0154\xce\xd2\xd5\xce\u027d`\x9fh\x0e\xccJ]1\xdd\x0e\xea\r\u007fi\xfeE\x10Z\x8cFU\x13\v\xbcAMr\xa8\xc0#\\R\xa3;]C\xec\xc8\xeb4\xbf\x8b\xb1\aXaV\u0299\x01I\x89\u0102\x91{\xd5:\x04\x86-\"\xed\xe2\xf9@\vX\x83\xa8\x8c\xe6\x01\x1b=y\x98\x11\x19\xfa\xc2\x06\xccC>\x8bg\x85\xd7\xe8\xd9!\a\xc3\xe0/JB\xb7_/\xb7\x85\xfd#&\xf5M\xf3\xc1\fx\u01ad$\x86\x9d\xcf\u074f\x8bf\xb5]\xb5\x84B:\xae\xea\x82}\xde\xfb~\xf2K\xa7\u6104\x12*\xbc\x1c\x8a\xa5\xbd\xd3q&\xbd>\xaa\xcc\xc0mM\x85U\xe9\xa3H7\xea\xdbc\u05deT#\x9a\x96\b\xf8\xb5k\x89\xb5\xcd+\x99\x10\xdd\xe7&\xcc.\xb0\x10\xb6\x9afq\u614dP]\xdd\u075b\xcf\u0361n\xf1\xe0&\xab8\xf8\xe0nhKC{\u0319\xa1j\x97\x91\xa6\x95\xcb8\xdb\x01\xe7HT.\xd2\xe3\u0232\x0f\xecPK>\xd1Q\x80od\xc4+Kf\xb1\x1d,,\xfaK\va<\u0168c)\xfb\x01\x99\xc6\x1a\\\x0e\xe5\x8b\xfe\xd0\u05ae\xa5j\xe7V\x0fRR1\xa34\x16\xee\xf9\u034c\x1db\x9e\xfd\xb1\x13\x8d\xeb\u007f\u055a\x99\x06\xf0\x18\x0e\u05f4\xfb\xd9\xc0{c5\xfa\x8a3\xfaa&)\xea\x92z\u0123!Y\xb4K\xf1\x85W1w\xb3\"\xf3\xb2\x1fs\x98N\xc0\xef\x00\xb7\xa9\u018c\xb1\xffD\x9c\xcc\u0560\x19K\xf1f\xa5N\u06ad;\xe7\x90\x1c\u046cAz\xfe\xec\xb6\xd4\xf9Iw\xb92=\xc8\xe4T\x94\xdd(\xdb\u075e\xb4jE\xfb\xf6\xb5l>u-\x1ck\xa2n`\xad\x06\x02\xa4v\x17\f\xfcX\x94\xd7 ,\"\xff9\xa1\x93\xbcW#\x1fe\x1fYuI!\x9f\x8b\u015c\x1a\x18\xc3\u01c1\xe5B\xec\v7n\x80\xe1$\x89\xc60A\xc5<U\x013y\xae$C\x01\xd8p\xfden\xa9\x8a(\x17K\x92\xb5\x96\xfd\xb9\xb6\xbbP,\xa6\xe7>y\u020d\xc7,\xf4l\x9e\xd8\u0774\x970LM\\\xe4\fCHL\x12\x11\x10j\xec+o\xc5\\\u0269[\x97\xf4\x80\xad\xf2\x0f\xfc\xff3\xf4\x93w\x9fT\xe8\xb3 \x9c\a\xe9\x8fO\xf3\xf9?\xfa\u00d3\x84\u00de\xfa\xf3\xb1\u007f\xe0\xe7?\xef\x06\xee\x17\fH\xfb\v\u035e\xd8F\n\x12\xcay!/\x8c\xae\xa3x\xeb\xef&\xad?\xcb]\u007f\x8b\xbd\xfe\xfdu\xe8o\xa3\u007f\xbe\xf3\xe3mX\u034c\x8bI\x1bn\x9d\xef\xe3w\x8f_\x9c\x0f\x19\xe6\x00E\xb8\xc2\rk\xd6el\x8e\u03f6\xbc\u05b3B^Sl\x9d\x05\x95\xfbLY\xacS\a\xe6\xf9\xe8\xa1\u0104\xb2\xf6\xb2\u07c4\xa9\xf0nnjZp)\x8b\x1bU\x97\x97:\x1e\x95n\xb1\xb5g\\jr(H\x83\u05be\"\xb9\xf7#\u007f\f,L\x87\x0f\xb0\u04d4\xd8\xd2`\xa1\u06f9\x13\xf3\xef\xfe\x99\xaf\xd7\r\xe0\x12:^I\x8a\x81\xf3A\xd0\x1c\xdc@$\x84\u0537\xfc\x95I\f\xae;\u06a0G\xee\x94T\xb6'(%-\t\xd2J\xccN\xbd>hA\\\xd1\x1a\x9f*m\x8b\x97U\x04/L0\x89\x87\f\x1f\xf0\x9a\u034d\xffc\xd2,\xaa\x9aU\x8bWMy_\x02\x15\x1e\xd4fj\x92#N\x93*j\xce\xc6\xf6\xea\xb9\x1b\u04d2\x02j\xa8Y\x99\xc9\a\xd2\xc2\u013e\"[\x11\x96\x1fW\xa7\x97n\xc0\xa6J\x87Q:Al\x15\x8f\x1e\\\xc6\xcd\xca\x11N\x19[\xc3\xc9a#N\xec\xf8\x97\xc8\xc6\xf0&z\xe3<A\xd0\x19\xecK\x1f\xe2\xb9c\xe3\xb2}v\x86\xb1Q\x91\x19\xcc\x06\xdf\x18\xeb~\xa8\xcb\x15\x8e\xde/\f\xabl\xe4a\xf82\xf5?`@\x88o\xf4\xff\xcc~Z\xf2}\x92\xea\xaf\xfe\xd3C\xd7~\xad\xf6\u007f\xc3|\x94\xf7\x03-\xedk\x92\xa2\xe4\x1a\xfb\xa1\xff\a\xa0\xc17\f\xf1%^?\x12$)\xbe\xd2\xd2\xf2~`>\xf2\u007fS\xfd\xeb\u0435\xfe\xd3\u007f%\xa9J\xbeg?\xf5\xff\fr\xcd \xc8\xe2\x8a\\\xd8\xdf)\xae\xf7\x91\x8fk6G\xad\x8dxSu\x17)tG\xfc\xa9\xcfE\x16\x83\x8b\x8b\u016b\u0165\xab\xa5E\xabE\xfaUpY\xfd\x84\xa8\r\xa9'\xd6u\xdf}\xeb\xd5\xee\xd1\x06m\xa8p\x03qs\u007f\xb9\xff\x05v\a-F\x1eF7\xc0\xa1\x06(\xfe\x13\x00\xa0\x8c\xae\ue2c0\u059c9\x99\xdd\xdd|,\xbb\xfeL\x1ct\u07fe\b\xd7\xea3'r\xba\x9b\x8ee7\x9e\x89w=\xb4\xef/\xc9\xdf\xf9\xba\xd4?\xff\xf9w\xe7\u007ft\xe1\xacDl\xa3\xf3q@\b\xe7{\x00\x96\x11\xdf(\x19\u042b\xef\xfe\xfbf\xaek\xfd\x91\x9f\xab\xfe\x03\x99?\u0752\x95\x91\xe8y\x95\xdcbT9\x95#\x17r\x93G\x92\x92\x99s\x17/eq*\xa3\a\xe0\xf2\xbc\xd9\xe8\xca\xfc\x84\xf1\fi\xec\x96\xdc\rk\xd7%\xf1\xf6\xec\xb5\x13\x83\x84\xa7\xc5<|\x8d8\xb5,\x8ebo\xb6\x17zhq$\x9365X}\x9b2Vu\x03\xa1\b2\xffV\xe3\xafq\u02f4\xc6HK}\xa9\xd1^\x02<6\x80%\"vz\xaauwrT\xb50V\x947\x17\xc3\u03d4\xe5\xe1EN\f\xaf\xa9\x92\xcd\u05f6\xa9C\xcb\x11\x9dP\x9e~oH\xa3\x9c\xd6\x02\xa8\xdf\xe1\xf6\xe2\xb08\xd5-\xc4\x0f{\xbd\xc6\xf7\xde\xfbj\v\xbc\x8d\u0218`KK\xf7\xe0\xb4\xeb_JA\xa0f6}2\xba\xba\x98:\xab\xaff\x1f\x1fj\xfb\x91\xde\x1bY`\xa9v\x92{\x87Z\xfb+\xe1j7\x8d\x1d\xb6\xab\xaf\xa8V\xbf\xb6d\xc8c\xa6'&\xb0\x8e\x1c\xf1\xd2\xc4\ucaeb\xcf\xefb[\xc0\xd5\xe7\xb9\u07089\xa9\xfdf\xa2\xe66m\x04\xea\b\xff\xcd\xff\x0f\xb9\xd8\n\u04fd\x8b\x92]\x8d\x9e3\u0276\t\x1d\xe4\x06\xa7\xbb\xc7f\x8c\xc7\xeb*#w\x16WS\x8e\u0577\xed\xa1\x15\xe9\x8f\xf1z\xb7\xf2?\xfe\xfd\x19\x8a\xe2c\xe7\x91A)\x90\xd7)C\xb8\xfe\n/f`\xa8\x9b\x96(\xe0\x10\xc0\x8d\xa4\x8e\xbd;L>\x9e\xf5\x13\u007f\x06\xa9\x92\x15\xe5$\xa6V\xc6lWP\x82\xf2\xe9\xd2\fj\xfd\xb6\"\xae$=\xb4\x92\xadd\x8e\xb5\xe6\x1e\x8c,\xac:\x1c\u07a8!\x8d(\xb9\x98jnF6{\xb3\x9d\x84\x95 \x0f( \xcbXm\xf5\xf2I\x8c\xb9\x96\x86t\xa7\xe0\xb8\x1e\u013c\\\xb5\x10\r\xa7\xe8\xe8\xb8\xc0\xb4CLb\xb0'\xd3\xe6\x87(\xbf\xf6\xcej\u007ft\xff\xee\x8eO\x1f*wlE\xfaW\xaf\x1f\x03\xe4/\x8c<\x97\x9b1'\xb4\xd3\x13\u0577i\xa3PG\xf8\xaf\xce_\xd9b\xab\xe0\xee]\x94\xec\x1a\u026e\x9e\xd66\xb4\x91\x8b\xcd\x18\xb3\x97\x9e\u06735\xf9\xd3(\xaa\xf7T3)\xf9\x8azW\xcc\xd33\x97@,\xe6\xeb\u0351\u007f\x9dL\x02\xc7\xde=7\xf5e\n\xf9\x85\xb21\x19\\\xa9m5\f-\xff\x1f?\x1e\x17\xd7\xe6\x06L\u06c3\xee,\xdf9\x03v\xae.\xaf\x02\u06516\xb7\xb6\xb8\x8f\x15\xa0\xf2\xa95\x00\xf3\xa7\x9cP\x88\b\u03612~\x1b\x1e#\xfe\x11\x18\xcdc'\u04f7E\x8bQ\xd9w\xe7\xb5\xc1zx\xb1sD\xce7\xf8\u04b4\xb8Ni\xa2\xa7:B,\xe2\x17\f\x93Vw\xc3\u2412\xb6\x17'9\x8a/\x90\x9c\\\xec\x8f\x17\xdd\xe8\u01cc\xe0#\xca\xd1\xde\xd4t\x04\u0169lp\xa7=\xd2\xe7\a\x0e$8\xa5%J\xa6\u00ce*r\xe3w\x967\xcc\xd0r\xb1\x19\x96r\xfb$\xe7#\x90)(\xda\f}\x81\xbf\xd3\xde?\xdcO\xe9XGo\xe1~\xdb\xd5s\x84Y\xb8\xe9e\xf6\x16\x83\xe0\xcf\xf5\xbd\xf4\x1f{\x86W8\x1dQ\x95\xb6\x15\xae%~\xfe\xa7\xd3PO\xf1m\x87\xbcr\u039d\xc9u\xdb\xdf\x10\xfe8\xfb\xec\xe8\xb6c%\x8f\xe2Z\xb7YjO\x1f/\xb0\x8d\xf3C\x94p\u0549\xe8\x8b\b\x06D\x1dl}7L\xe2\x15+$\x10\x85.:\xf0\x97F\xf9U\xab\x8c\xf6>t\xbc\xde\xfb\xa7\xe3O3\xd2\x12\x85\xaeB\x0f\xb5\xab\x86\x12~\u0141\xe2H\xfd\xfb\x1aZ\x95\b\xac;\rK\xbd7\x10}RF\u007fn\x82wA\xb4P\x14!\xb7*H\x0ff\xf0\x91\xd5R-}K\x9b\xfeht\x95\x89\xb3\xa6|2&\t\xf2'\x1f-\u05b1\xca\xc6b\x1b\r\xf1\"O\u007f(\x1b\x8b\x82R\x92%\xee$@\x14\xaf(\xd6\xd2T-\xb8\xe5\xf2J\xf4!yC/)S\xb1?H\x17`\xf2%\xcd3\xcb1\xc7\"v\u13c2\xc9sI\xce\v\xb3\n\u022eo\xff/J\x15\xfe\x12\xa1\xc1i\xfe\x16\"f\xa2\x81\x88\xf8\xea\x88\xd6\xe5\xe4QH\u06beV`jX\x9a4R\x1e>\xa8\xb6\x8e>\\\x87\u07eb*\uf294\r-\x97\x9d?\xff\x01\x18qj\x02r\xfe\x83\x90?\xfc\xf7\xa1\x16\x02^\x15\u007f~\xd11\xfe\x83\xd6~\xfc\xf7'\nB\xc3i\xbf\x8fV\xfa4Az\xad\xf9\xd3\xffd.\x9dT\xb8-/i\xa0g\xcfz\xe9\x96+\x1f\x10TA9\u007fP\xfd\x16\xb1\xe99S\x8c\xf2\xd6\xf8\u00e5z\xf4~e\xeb03\x9b\x92j]M\x80\x02!\t\x84W\u007f\xaa\x8eh\xceoD\xfc\xa7\xf8p\xb0z\xb2w\x9fp\u007f\xf3{\xf3(\xc1\x9a]\xe4,\x1b7#\xa6\xc0\x1a\x1f\xc2w\xde\x01\x13&\x00\xd3>\xda8Z\x9bX\x87\u06aa\x0eE\x02!\fd&g\x94K\xac\x1a\br\xba\xf6z\xd2G\xf9\xf7\xa3`\xb9`1@\x00\xf8\x11K\xd8zKS\xa5\xb1\x04b\x94d\xc4\x05t\xafy\xe8~\xe5\xac\xf3\xf9t3\xa8I\xfa\xec\xc7C\xe3w\xd0\x03\x90\u05f0\x8d\xb8\xc6\xc6)F\xa9\x16\xd0\xe9Z \xdf\vz\xfc\u007f\x15Y\x9a\xf2\x8c\xb9\xc6$\x93\xc1\xe8\xbd_\x90\xba\xfd\x9f2\xcd\x0e\x89\x94moDYC\xb1u?\xe8\x02\x14\xea{\v|\xe8\xe4\x85\xdf\v\xe6\xe7\xfd\x80\xed\xb8\xc0wY\\\xe4C&\xcf\xfd\x9e\xbf0\xff[\xfe\x8e\xf3|H\x02\xd8Y\x1ed\x1055Re\x8a&\xaa\xa0\ta(/\x8f\x87H\xd0\xdcH\x95\u02da\xa9\xa2\xe6 \x03\xf0yb\x16\xdf\u0791[YX\x95\u06dc\u0734\x92\x19\xbd\xa7\xa3\xf3v\xf2\x0e\xa6\xc5\xe9t\xd80p5\xa1\xa3\"q\xbe\x9d/c\u0548\x9b\xfc\x9dU\x9d\x02\x8cnt\u041am. Y\x9bt\x18\x1c+n-\xce\xd1\xea\xaaeM\xc9\u0744\x9b\xdf\xceaw\xeb\xdb\xf7\xb8A\xb5\x94t)\u33e2}\xb2>%\xa34R\xe1a-\x8f\u00c3\xf8\x91\rj\u0296\x96\xa2\xa3\xb1\xb5\xf9\xe71)\x18\xd8\xefYh\xad\x9f\u0599\x18\xcar\xb9\u0102\xa3B\x9e\xcbC\xf5\xb7J\xa9Z-uP\xab&MT\xe7/F\xe6\x87km\xd5\xee\x9a@\x96\xe6\xe3\xf9$_6\x94a\x15\xc0\x17\x89\xe8\x81k\xb3\xa4\xa179A\x8d\xa2T-\xa1\x19\\+?Xl\xe4dT\x04\x04\x17\f\xfb\xcbh\xe7\xfa\x87~\x10\x0eu_\xe7\xf5\x0e0/\xd6\xed\x0e\x1f\x17\xfa\x96%\xb0\xd2\xfc\x12\xdb+\xc67\xad\a1\x9d\x86h/\x0f.\xf2\xaa4D\u06f7\x97\x90\x1c\x92\x9d2\x1c3H\xa4h\xe7\x9c\xee\x94L\x06\x99;\xfaI<p3a\u0196j\u02f6\xa6\xf7::\xf6Z\xd3l\xd86\xd4\u00c9\xfb\xaeg\xb9\x98\x1a\bV\x1a\x1f\u0712-\xd7.\xc56\u065a\x16\x18hE\xb5\xe6\xd9\t\xad\x19\xb3\x18\x9b\x03\xa1\x0e\x10\x003k\u00f0\x15\xda\xf0\xac\xa8\x15\"\xcd6\xf9 \x91\xbb\x84chG\x00\x02\x12P\xa3\x91u\ax\xc7>m9'u\xb4\xb5\xb6\xe5O\xfe\b\x025*s\x05\xdf\xf3\\ct\x18n\xee`\xb7\x00\xf8\xbe_A\x1cx'\a\x97\xde!\xbey\xdf\b\u02a8O\x81\xd9_O\u007fx\bL\xc5.r\x82F\b\"\xb1\xe4\xc1n\u0783\x1f\xaaN\ub039\xb9\xa7\xc60\xec\xf3\xc5\xf0\x81\xdcF\xdb1H\xa7n\x06a\x8fh\xa2~\x11@\x8a\xefx\xa6\x8b\x942\xae\xe0/\xa8\xf4\x13Z\x80\x15\xe0\xb8<O\x80\x8a\x19\xb7\xb4!\x93\x92P\x99\xce$Z9Z,\xc5u(\xf7?\x99\u007fl\xb1\xcfTLO&\xb3XkQ4\xb8z%%\xe4Jx\xc9w\xf7\xcf]z\x15b\xaa5>\x93\xe2\x19\xe2BB2\xa81\x91h\xa6\x17\xcb[\x14\x01p\xb4r\xe9\x00;{$\xea\xd6\xe0p\xd4\xed\u0711\x11\xb6<J\xeaJ\r\x82s\xa1\u013aW\xc0\fB\xc8\xf73\xe69 \x106\x14%#X\xe1\x8e\xfb\x12\xca\b\xc0\xb0\x9dK\xd6p\xfc\x84N\x8d\x181\v\x13\xa1\x14/\xcd\u0308\xa7A\x89s\xcdi\xf2\xda^\xd6\xed\xf19\xce\u00f5\u0767\xa3\xab\xa4\v(N\xa0\xec\x05\u066b6 \xb2X3\xbf0\xaf\xd9^ \x1b\bf\xc3\xff#\xd3=\x19\x8e<\v\xf02\xb4m\xcd\xf0h\xddh\xd8\b\x85\x1b3\xb8Wd%e\x92\xcdx~9\x84\xee\xa3z\x153lKV10r\xf7\x88\xcf\x11\u0700\x10\x8eK1\x80+:7b\xc5I\x98\xd8L\x05\x96z:\x87\xa0N\b\xf3K\xcdk;\x8d\\%\xff1\xfd\xc1\xd8\xee\x9a\x15\xfaH\xbf\xe0\xe7\x911\xf6j\xc7\xe8QvY\xf1~JC+\xe5x\u077aE\u07c0\x1c\n#=0>4\xd5J\x02M\x81\x1dz[!\xf0R8\xe7Z\x80\x90\x94\xda'\xb5\x84\xda\xf9\xb19\xa1\xa8 \xb4?#\xa5\x1b.Q5z\xedc>xMu\f\x89\xc3\xf3\xe2\x18O\x00\xf5G\xd5\xec\x14\x91`\xcfBK\xc2\xfb\xf34\xdb#\xf2]\xc5g\xf1Z\x0f\xe8\xc6m\x15>\xbb\x85\xcd\x01r.\xaeB\x98\xc1\u0778!\xffA\xd4X\xd9\x02\xbaT\x10U\u028aG)\xe8\x89\xf2\xa0\u05ec!K\x8a\x17\xcc?N\x06\x91\x05\xe6\u0315\xa5F\x0e\x14\xa8\xb7\x87\xea \x10\xb3\xf1\xfd\x1e\xb4\xbf\xdc\xf9_\x92 \xd1[\xb6\xca8\x89Y\xa8\xdc\x01\u03fb\x89\x01fOr\x94T\r\x9d\x95\xa8Q\xa6&\xe4\xb1{@>a\xa0\x96S\u00cfM\xc6\xe1\u049c{\x14v=\xf4\u00cb\x10\x8f6V!\xe21\x0ex\xe98/3\xa5+$C\x13:\xa1\a\x96\xe1\u0358\x8dg\xaf\xc1\xe1'\xce\xcec\xd0\vgO\xc2\xe1\xd7\xcfnr~&!\xa4\x13@\xf6\x1b|\xb6\xad\xc7\xc7Wr\xb8\xfbu3gR\xe8\"\xe1V\x12\xa2K\xaa\xed\x896\xce-\xf8J\x1c\xe0\xfcl\xf1\x82C\x8a|\xec\u9b9aL\xfb]UBU\xa75\x06\xfb\u007f\x81\xe7M\x00\x99B]\x9cY\x93\x14\xc3\xc3a\u00e5\xbfB\x0e:\xd6Q\u24c3\x14N!\xe5;\xe6\xb2\xc6\xeeu\xd4xaP\xea\xcb\xe6\xa0\xe1\xec\xad;D\u06aaB\xe5\u04a4D\x19\xac\x1aA\x9cG\b\x1b\xa2Q\xd6)\x9d\xf0\xa2Ni\xfcl\xc5\u03e5\xcd\xe7\xe7\xa5-\xcc\xdeQO\x17\u4a66/\xcc\xf63nu\x8c\x9d\xe4U\x17\x1f\xe1u\x8dqo\xf5\xf7\x153FOpk\x12\xb8]\xa3V\xf0&4\u04a0\x95D\xae\x031\x01\u0170\xbf f\x13\xceW\xf4\xb0\x1d\xf9\xda\xec\x11)\xb3~,R\x18\x8a6\xbf}\x1cf[k\xc6\f<\xa0\xe2\x97HN\x00\x96\r-\x01\x9c@ru\x88\x98\x87\x89\xb1\xbe\xea\xf9\xd4\x19\xfb\xf7\x8d\xa8\x86I;N\xe0\u0223\x14\xac\xe0:\x91\x85\xeb\xa0QgJ\xc2O\xce,\x0f\x1c\u0316p\xfd\xf7Y\xe1\x0eB*\xcamNO\xa9\x85>\xa5\a\x1e\u07f4\x8aU{3(\b}r4!\xfdE\xf0\x9c}]$\x9d\x86\x97z\x80\xa8\x11\x9e<\xb1\xbdR6\x87\xd1E\xa6\x99\xa5\xd8'\xb9\x96\xfe\xb3N\xe5\xa7t\x93\xda\x06\xa2\xb6qL\xa0\xd0\xd3?\xcaC8~,X>\x89\x96\xec\x97\xc3\xe4\xc7V\x14&M 2\xb4\a\xb0\xe9X\xe5-\xae\u007f\x0f\x96\x9eP\x80\x80\xdc\x1f\xe6\"\xae0|J\xe3\x84I\x98\\\x90}\x1f+p\xde\xf6d\xa6\u024b\xcbn\xf4S\x8a\xc3\x06\xf5\x9e\xa3\xads\u06727\xe7\xde;<s\xf0$\xff\v\x009\xe8\xd0K\x8bS\xfb\x9a7\xe9\xefh'*\xd0\xe7v0=q\xb9\xc1\u00ad\x0ef\x16\xe0Veq\xb8\x81TzC\x80\xdf%]\xf8\xeb\xf6|\ay\x9fs\x8ek\x95\x99K\x95Sn\xbd\x83\u009e\u007f\x83\xa0hc9\xfd\x98\x8e+y\xdf\xe5\xa4w(\xb2U\u01d9\x19\xe9-\xe9V\xac=-\xa8ZWA\x85+\xdd^\u9833V[\x9b!\xed\xb2\x1cK \xc5]\x15\xef1\u0390t\xd0\x11\x93\vO=\x92|<9U\x0fo\x88I\xbd\x9aWo\xe8T\x90\xce?P\xf1\u016e\xd2\xc7\xcc%w\u04e5\x9c=\x15\x02\xcf\xe9w\xf1{\u007f\xda9\x19\u01b5\x9a\xf9L\xfb\xc3\x1fOu\xb7\x83\x93/\x05\x81\u0088\x83\x97N/\xbe2\xb9xd\xf75\xe0S\xd4&l\xfc\x90\x90\xe9DF\u00e8\xbe\t\x9c@\x9d\x9a\xb2\xe0\xdb\xfe\xa8\x84d}\xbd\x12\x831=\xfa\x04nS\xe6P[h\x94\x86\xc1T^'Y\x97<n_\xf0US\x02\xf38\xb1\xc0\xab\xcan\x15\x98?p\u034fy\x9c\xc0<\x96[\xfe\xb8\xe4\xef\xeb\x9d\x18\x8cQZma\xa9\x83\xcdc\xb8\xe9Q\f\xa6\xf3\xfa\xdf%\x8f\xb2\aV\xc7I\xb0\xf7\xa5\x92\u0459N\t\x1f\x1a\u06c4Y\xc0>7\xb9\xf3\xed:W\xef\xef\xf7\xf6m|\x11\xd8\x14\xc1\xf7\t\x18\xa0\xbb}\xc9\xe8\xf8g\x9d\u02dfp\xa7\xfa\u05fe\xd0\xea7\xfb\x04\xf4\xd3\xdd\xc0\\\xdaw*\xf0\x1b=\n\\\x8c\x0f\x97>\xce\u05d56c\x9c\u070e\u020b=\x03\x91\x97u\xddc\x9cT\x9b\xa5\xfd\xd3\x02\xae\x15\xc3\xfeI\x9d\xe4\x11\x9b\u04a4s\xa3(\x83bD\xeeM\xb2\x9d\xa5\xdbZy\xfd\x01\xae\x1f\x82\xeb}hk.\x01t\u7562\xfd\xb8d?\xd53\x86W\x05<\x91\xca\xe1e\x9c\xe1\xaf\xf2\x87\"=\x04G\x98\xbbfM>~=\x97\x82z\xe5*\x8c\x19\u067f\xba\xff\\i\u00b6\"\xcdF,\x98\xfb>\xc2S\xdd\xd7\xd246\xda\xd44\x9f\xed\x19\x1a\x91\xe1\xf1\xa6\xa9e\xdd`KK\x8fWND\x94g\u0596\x86\x86\xe1\xe1\xa6\x06\x83\xda3\"J\xed\xb6\xd0P7R\x18<,\xf5z^\x907\rN\xf5\nB\u04bd(\u07b4\x0f\xc1\xe5(tod\x10\xd5\x1b>\b\xf0OQ}QD\xe7\xbd>\xbb\xff\xb7\xde\xdf|\xfe{\xbe\xf7\xbe\xee\xff\xda[uJ\xfb:\xae\xcfE\xdcj+\xfc\xfe\x00\xf3\xb1\xc0`\b\x87\xffi\xf2\x05\xbd\x92K\x8e\xce\xcf\xe7\xaeC*s\xf6\x84\x88\x03\x84'\xa8\xbe\xfdD\xbe\x90\x8d\u017b\xd7F\b\x10U\f\xcf\n\xaaH\x84\xd5&hiu\x15\xb7\x12t\x1cN|Ui\xca\x146\xbbh\x1eI\x0f\xbc\xa1Q\xc0\x95\x1er\xfb\xa0(\xb6\xe3\r\x94\xbb\xfb\xf3\v\x02\x14\u0653\xeb[\x9d(\x14\xa0\xb3\xef\xa7&\x96dV\x12\x9f\xbd>\x9er\xc5\x03F'\xa6\xe2\xe9n.\u007f\xb5\xbf\x01\xf6\x9d\x8d\xfe\"\x12\xce\xdb\x1b'P\xfb\u00f3\x04oAI\xc2Q?\u007f\x91 \xd1\xc7\v\x97\xb9\xe7\x05\x91\x89\xf3\x8a\x13\x92A\xe4\x97\xcf{\u5375wg\f\x17D\xb7{\xf7\x9f\xea\xad\xf4N*\xd8N\u036f\x0f_\xca\xcf\r]\xd4\xd5m\xa5\xe6\xa5l\xc2P\xfd\xd8s%\xd1Q\x04W]\xf8\xa9\xcc\u065e\x9e\xd9\xccS\xe1:]v\x9d\xcd\xec\xe9\u025c\r?\xa5{8c\xedl\u05a90c\xd8M<\x10\xf9\x1b\xc8m\u03b87=}/\xa3\xb9\xd9{\x9a\x9e\u03b8\xd7\\|\x01\x01\xf3\xbf}\nkK\x12iD\x81\xc7\x06\u07d4\xe88\xb4H\x10V\xe5\xc11V\x18'\xceD \xb3\xfcb\xc8]\x0f\xc6\bJ\x9a\x16Af\xc0\xb4\tG\xdd\xe3DO\x96Z\x9d\x10)\x9e\xb0\xc0\b\x04,\x00\b\xe3\xc2.\xfeRu[Y\xc4l\x16v\xfeO\xf7\xc2_\xbb\x00\x19|]\xd5\xdf[]\x06\xac\x94\x9et^!\xd9\xeb\xed\xd0\u007f\xfb\x848\u0473u\x16\x86\xb9\xbe\x16[_\xcaZ\x8a\xff\xbb\u05efa\xde\xdba\xa7\x15))\ab\xb3b\x03L\u03d72\xc3\x1b\xd3\xd2\x1a#X\xac\xa6\bU\xdau\r\x93e?*US\x18\x8b\xd5\x18\x96\xa6\xc2\xefI\xa6o\xf5\xa6\xb50\xd8\xdaM\u077e\x9b\x99xk\x98\xa8\x01\x17-\xdf\xee1\x166\x13v\xee:\x9c\x9c`w\xcf?\xf8\xe5n\x1c\x99\xfe\xde\x13\xf1\a\x12)E\xf2\xeb\xc6IQ\x93\xccB\x8a\x1e\xc6K@\xab\xe2C\xdc\x04\xe1\xc2\x14\xf9!]z&@M?\xa2\v4r/[\x14\x1be\xe6J\x0e\xa8\xdd\xd3{\x94\xd7\x0e'\xc1O\x92\x83\xda\tl\x0e-<\x1c\xfa\x9b\xea\x13\xbed\x87*\xecS\x82\x01\x8ap\f\u0165\x04vk\xfb\xefo\x88\xcfM\u0203\xf1b1\x12\x009\u007f\u01d3\x87\xe3\x86\bP\x82OR\xe8\xe4\xb0\xec\x97\x17#jp\xd3=\xb7\xa7\tc\x92bK\u007f\x85^o\x03\x17\xeb\xc4\xdc\b\x05\xf6\x98;\x1ab\x94\x12@\x9a\xc1\x02\x10\x00\xeb\x93\xc9$0\x13\xcc\xe2\u03ec\xa9\xd03\x92\x8c\t\xa2\xbe2\xf6T\xff\x18\xe9|U\xf5\fA\xab\x02\x15\xdf{\x8d\x17\xd9\xe4\x9f\xd1>\nf|\x15L\x86eZ_\x9a\u007f\xc2\u0226\xda{/\xfa\a\xb2\xa3\x94\xb6I\x9b\xce,\xbd\x1a\xb9~\x1c0\xd9\xefOBl\xb0\xfe\u05b2\x00:\xb5*)N\xdf\x14\xfc\xfa\x14\xc0t\xa8d\xc1])\xaaJ<\x87^\x81\x17\xabB\xbad\xc5HD\xaa*\x1c\x97V\x86\x93\xa8p]\a\xa4\xda\bmB\\\x12\xaa\x8cP\xc7%\xd0\x06\xd0\x1f\xfb\x87\x9d7\x1ct\u044c\xe6-\x94\x81]i\xdf'\xd0\xd2\xfd&\xb1\xf9\xf4\xed1)\u021c\xbb\v\u0661\xf2\u00e6.\xa7\x8a\xeb\x92$z\xa8#\x13\x92\vZR\xf6\xf8\xc6:\x95-pQ\t`\xab\xae\xadW\xc6\"\u007f3\xc8\u05ef\t\x1f\xff\xfb\xa9_\x8e0S\xc5\xcf\x02F_D=\xdas\u079c\xbd\xeb\xe0\x06qO\uc381\xf5oM\u03bb\xff\u0789\xd7\xc0\x11\x8c\u007f\x8f\x0e\u07b0)\x18\x8dGoZ\x8f\xc7\a\x87\xac\x1f\u07db\x05\xa3\u05cd\xaf\xffn\xe2@s\x1c\xb3b.M\u0619\xa9Q\x05\x1d[\x8f\xdd\v\xe5\x04\x8c\xe4C/\x9a\xc9HnIS\xab\xe0\t`\xf9`H\u0665W4t\xd6m_\xdb\xcbv\xa2\xcb/>uJv\u01af\u052e\a0~0J'\xee\xach?\xc9\x1f\xe8\v<\xaf\xfd\u007f\xe1\xb3\u0246\x03\u429a\xa8\xc5&\xae\xb8\xb6ZW\xa7\xcf\xcb)\xd7\x01\x0e\xed\x0e\t\x9d\x99\xc0\xe5D\u007fXp\x81\xb42\x85\xc4N;.)\x8c\u784c[z\xb5\xeb\x89z\xd8k\xdf\xe7f\x9a\x0f\xd75\xd9\x0e.\x90\xc5%x\xde\xe9a\xe3\xf7=\x11'\xf2\xa14d82\xe9\x1e+\xf4\xc7\x01d\xa2&)K\x9f\x9f\xa9\xd3\x11\xca\v\xd9;\xd6\xe6\x9d\n\xad,?\x86\xee\x101kA2\t\xd2\xfe\x93\x96\xa6\x9bI\xe1e\x11\xeb\\E\xb4:\xb4J\x1a\xbe\u0290\xfd\xacokl9\xbe\u011eB}}\xfan\xb4,\xf8r\xa9j\xf7UH\xf9\xbf\x1fD\vw\xfc\xfd\x8b\xdek\xbd7$\t\xb7!c\x81\xe5\xd7L\xeb|\u052b\u0674+\x8fI+\xd8\xcc8\xe4\u007f\xa3v\x90\xb9\xda9~\x82_U|\x84\xda\xd5\xca=^WG:V\xd12E\xc9\xca\xecN\xf8H\xf6\x94i'\u0211\u03c7\xb4\x9b\xff\x1d\u01f9H\xf0d\x0e\"T\xaf\xea\x1fLt\xc9\u0173\xb9\xc8\xf0|\xe5\x14\x90i\xc6z\xec\xb9\xef\xd1\n\x11\xce\xcb\xcbW\x94\x87F\xe6\x89\x1d\xbc\xbc`b\xc5c\xb4\"\xa5\x8c\xa7ht\xf5r\xc0\xa0\x10\xa2\u02db\x8a\xceu\xfe\x14\x956\xa9\xa0\x16\xd1\xd8\xfc_\x86\x16\x99\xd1&\x94\xb9#\xf0\xfc\xed\x19\xf1Y\tL\xfa\xcd\v\x1dRk\x92\xc7JM\xf4\xc2T98K\x12X\xef3g@\x17\xab\xfd\x01o\xe7k\xc4\x02f\xb0\xdc=\xf2\x8ck\xd6P\xe4\xed\xec\xd1\xe7\xbbQ\x16\xa9\x800\x02\x85\\;\\<*\xd4\xe1\x02\x01X\x00B\xb7\x9b1\x19K\fXI\xbag\xbe[\xc0GJ\x84\xdc\xf1+\x94D\xcar%~W<\xb7$pI\x82X\x81PK\xdeFR\r\xca\xed\xf7\x04a3\xdfF!\xe4\xb4x%,\"\u0483\x90\xe2\xfc\u5451\xfe2R\x9c\x12\x16\x19\x1eO&-.H\xba5\x12+B\xa3EX\xec\x17<:\x05x\xccP|i\x87\u059b&\a\x95\x93\xb8\xb2\x80pT\x92/\x0f\xc1\x81\x05\xf8\x86^Xo\xcaG\x96\x93y\u04800d2\x8c\xbb\xa7\t\x10\x1ex\xaez\xbe\x95W\x9e\x06\u03c9Q\xcao5uA\xd4b\xebC\xeb\xbaW\xbf\x8f\x18\xbe\xbe\x02\xb8\x87\x1b\x9e\xfd\x8c\xa8\ti \xd6v\xaf\xae\x12T\xed\u03bf\xc1\xbe'\x9f\xb1[?\x05\xb1\xae\xd9\xed!\x94\xdf\xd4\u0740G\xe0\x8er\xb7G\xd0\xf2\x84\xbbo\x9c\xb7\xb2\x94G.\xe0\x17d\xbd\x91b\xaay\\\x1d<>\xd6\xe7K\xe2\x06WK%\xe7K\xe2\xe9\xfcc\xe3\xb7\xc4\xe3a\xaag\xc2\xd5A\x16|\xfa*CA\r?a\xf9\xde\x06\xbf=l\x1c\u007f?\xde<\xd1Bz\x1b\xdaX0\x8d6R\xc1xh\x95b\xa0\xe9d\xeb\x8fS\x04j@\xbd\x80\xf2\x9d\xac@=\xbfR\xff\n\xb5\a\xaf\xd8-\xff\xb7\t)\a\xd9\xdf9K/~o\x8f\x16\x83D\xe0\xe09p\x9a_\t\xa0\xbea\x9d\xf0\xab\x11\xdd\xea\xf7\x98\xd2\xef\xb3\xf9\xe4\x83\xf4\x0e\x9e\x14\x81\xd1Mw\xcc\b \xf1\x8c\xc3\xcc?\xc0#y\xab\x1f\xd6\"\xddU\x88\xc0}\x0eH\xeepW\a\xeb\xaf3\xbc\xaf\xdf\v\xd7\xea\xf7\u00da\xc9]X\x9d'\b\xa8\x1e\xa8\x89\xab\xae\x83\x18\xf4{\xc6H\xbf\xcf]\xfa\x03\x1eK\xee8\xc8Gqp\x8f\a\xfd\x1e\xef\t\xdc\u03c4\xe4\x8e\x11>\x8eJ\x9d\xca\xd2\xd4S\xb1\xce\xf5|\xe8\xf4\x0eL\xef\x13\xd2\a\x01\x9d.\x1a3\n\xcfP\xadZ\u01f18\xba=\x89tz\xb3t\xfac\xd4\x1d\u007fV\xa5\x8b\xac\xbd#p_\x0f\xf4\xfb\u00ef\xb4\x1d'\x14J\xb5\x8cZ\xb4\xc8:\xa3\xb7:\xbdi:\xfdVg0\x86\ua693\xb3\x99\x9eC\xa0\xe3Uh\x85\xb8H\u007f!4\xa6[B\xad\xd2\u9b76z\xf7\x0e\x8f\n\x83}\xfa\xe8\x0f\xaf\xbe\u0e2e\x00X\xcd\u030btL\x11\x02\x88\xces\x86\x1c\u007f\x00O\xfd\xa4\xdc\xe3V\x00\xdc2\xbe<\xd1fj\xa5\xe1\xac\x18\x19B\xf4;w\x85G\x00*4v\x90\x93\x15/\xb8=4@\xdeE\x14\xc0~>_~\x02\xbb\xa8 \x02\xd0gu\xd22\xc0\x9d\xce{Vu\xf8\xae7\xe0JNC\xa2\xd4n\xdc\xc6\x05 E\x13\xf4\x0e\x84I\xb74\xff\x17\xf9!-Lk\xa75\xb9\xfc~r\x86\x10{\\\xcb\t\x84\xa2\u047a\x80\xe4&\xe1\a\xf3\x16\x9a4\x02\x90\v\x85p\t\xe0\xaf\xe1\x1f\x19\xcfB\xc65\x00\xedxCZ^\xcb\xe2$\xa7\xebRM\xb8\xcc\x05\x10M@\xc5H\x80(\u011b\xfc\x17\x9c\xf8\xb8f\x89\x8d\xd6\u02f0\x8f\xfb\x9d9b\x00\xf0\xe2\x84\xe4\u007f\xc0\xb2\xebI;\r\xf5\u0487\xdf\xed\u02ed!F,\xc1\b\xb2?\x04\x10S\x83\xd5:\xfe\u02de\xf1\xaf\xc60\x17\xa4}\xb8s\x1b\xab\xb4\xdfr\xa2\u00c0U\x1d\xb5\xb7a\r\xf7-[\x8b\x1f\x9db\x00\xb9\x81xUI$'\xc8E$\x931\xe2\x85E/\xf2\u0655!\t\xa9R\xc4\xc7x4n\x82Kq\x1e\x1e\u0270\xea!-d\x83\xec4\xbe\x13v\t\xf7\xe8=\xd3\\(\xc0\xcd\u00f2s\xa7\xdaM\xb0\xac\xf5\t\xa6\x15\u0715\"v-\x80\xf5\x86\"\xb3\xa1\xba\x9dH\x18K\xe6\xf9\x96#\x1a\xaa\xb5aDW\xf2Q\xce\xeaAQ\x02\u9a85rG\u066d\x8f\xc0w\x80S\xd0;\x00\xba%\x82\xcc2$.\xb2\x81\xe8C\x95\xc2\xc2n\x9c\xfft\x9b\xe1\xd5F\xa4z\x8fk\xec\u007fLK\x12\xa6\xe9\xec\xa0\xd6\x1d\x94\xe6\x838\x13\xae\x91Rc\xab*w\xe9\xf2G\xf1\x0e\xdf\x03$\xe5\xe9\x15Z\xe6\x1az\xc1\u05b2\xca\ufc37\x15\xc0A\xf0\xcbT\x00D\xb3\x00\u075b\xd5G\xaf\xf6\x16\"\xe5\x15s\xa8n\xfa6/$W;@h\b\xf3\"\x152\x16\xf5q\xd8't\xba\x8d\xaf\xd1<Zy\xc1\x12\xba\xbb\x8e\x91\xab\x1d\x96m\x14\x84\u007fl!\xad$\xb7\x16,\x81\x99U\xe4\xe8\xd0V\\\xe3\xe2)U\xb5\xc5L\x87o\xa4\xbew\x95\u03ec\xa4\xbb\x11{\x1b\x16Okv\xb6KPT\xee\f\xac~O@\x0f\xa4\x0e\xe6E\x00\x18tJ\xe4\xa8\xf0S+\"\xdc\x048\xe4\x10\xaaT\xa7P'@\x0fv\x88\x04\u06d7x\u0115\u06e1rgh\x94\xb7#\x91\x97Y\x00\xeaG\xaf!|\x04]\x82\x1a>\xaampt\xe0\x10\xa0}\x81\x1c\xea\xc1.\x85@\xea\xcb,\x00\xf4h\xd1m\xecU\x19\x12\xe7\xc1/(`\xeb\x18\xb0\xb5Y\xc6\x15C[\xb5\xda>\\A\xd0\xc0\x8f\xa6F\xec-\a\x11\xc1\xa3b\xac\x86#\xb4 \xc7\xdc7x\xf5\x98\xda\u0384\xa8q\xa9\xc0|\x80\xf8\xbb=\xb3\xb7\xf3\xdbl\xb5\xcbhAZ*\xe2\xbf\xec\x03p\x8e\xb5\xac\xd79jv\xc19\u03a2E\xe7D\xa6N<\x18\xa5m\r\xb4\xb2\xe2<-,%\xab\xa8\x9cR\xac\u05d2\x9334\xd9E\xf2\xec2\x18\x16;\xa5\u0381m\u68c6\x95\xf2@\xe5wbq\xd1F\"\x84\xe0\x9f\bj\u0515y\x1bHX\x95@\xe4Bg#\xb1\xa2\xae\xe2\u9312\x18\x9c\xbaZ\n\xc9*\xc1\xb7F\xa3\xcb\x0e).\xcb\xc5\xe9\xf3$\xc0\xcb\u00d5\xe3xl*\x9d\x9f\xb2-\xc1\x12\x05\xa0\xbc\xdeQ\x12N\xcec\xf8W\vCX\u0289\xf8\x1b6\xf9\xdd\u0517O\xaeP\xaa\u050eN\xce\x10\xa8\x8b\xab\x9b\xbb\x87\xa7\x97\xb7\x8f/\xcc\x0f\xee\x1f\x10\x88\bB\xa2\u0418`l\b\x0e/\xf3]\b\r\v\x8f\x88\x8c\x8a\x8e\x89\x8d\x8bOH\xfc\x89\xff\u06dbB\xa5\xd1\x19L\x16\x9b\xc3\xe5%\xf1\x93\x05BQ\x8aX\"\x95\xc9\x15\xa9JUZ:\x11\x19\x99YK\xbe\u0461\xd3\t\x1b\xbc\xec2\xa8\xcfV\v\xa6\x13\xce\xfa\x8d\xf9\xfce\xc0\xb8\xb5\xce\xdd\xff\xb4\u0362\xdf~\xfd\xfd\xff~\x85^\xf9v7\xb5f\x98\xf6?}=\u0757.\u07f8z\xed\xfa\xab\x9c\x1fn~\xb7G\xee\xc7\x11?\xff\xf8\x93\xee\u037b\x1e\xf9y\x05\x85\xfa\xa2\x1d\x8aKK\xac\xe1\x8dPYQU\xfd\xba\xa6\xae\xb6\xbe\xb1a\u0664\xe6\xa6\x16\xad\u07be?\xea\xd6\xed{w\xf6;\xc0\xe0\xb0\xf3\a\x1dr\xa1\xdbI\xa7\x1cO\xf7\xa2<<\x9eL\xb3|Ve\x97\x95k\x8a\u02f2mNqeYye\xc9i\xce+.\x03\x00")
+
+func third_partySwaggerUiFontsDroidSansV6Latin700Woff2Bytes() ([]byte, error) {
+	return _third_partySwaggerUiFontsDroidSansV6Latin700Woff2, nil
+}
+
+func third_partySwaggerUiFontsDroidSansV6Latin700Woff2() (*asset, error) {
+	bytes, err := third_partySwaggerUiFontsDroidSansV6Latin700Woff2Bytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/fonts/droid-sans-v6-latin-700.woff2", size: 11480, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiFontsDroidSansV6LatinRegularEot = []byte("\xf8U\x00\x00\x1eU\x00\x00\x02\x00\x02\x00\x04\x00\x00\x00\x02\v\x06\x06\x03\b\x04\x02\x02\x04\x01\x00\x90\x01\x00\x00\b\x00LP\xef\x02\x00\xe0[ \x00@(\x00\x00\x00\x00\x00\x00\x00\x9f\x01\x00 \x00\x00\x00\x00%\x83\xbcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00D\x00r\x00o\x00i\x00d\x00 \x00S\x00a\x00n\x00s\x00\x00\x00\x0e\x00R\x00e\x00g\x00u\x00l\x00a\x00r\x00\x00\x00,\x00V\x00e\x00r\x00s\x00i\x00o\x00n\x00 \x001\x00.\x000\x000\x00 \x00b\x00u\x00i\x00l\x00d\x00 \x001\x001\x003\x00\x00\x00\x14\x00D\x00r\x00o\x00i\x00d\x00 \x00S\x00a\x00n\x00s\x00\x00\x00\x00\x00BSGP\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00w\xa8\x009\x1e\x00NV\x00-\xd4\x12\xcd\xe9\x8a\xc8`\xd8W\xc9hKropq\"U:b,/\x962\xd9\xe3\xdb\xd3\xf0\xe0\xc6g@\x9e\xba\xd6$@6\xa4\x92\x9f\x83\xec\x03\x8a;\"\xf1\xa5\xb1\x18\xe0[E\xc7LFM\xad#^S[\xaf\xd0\u03cb^>\x17\x1eZb\x91b\x92`x\xba)\xecQ,V\xd6\xc3<\xf0\x04\x96[\x9aU\x90\x83\xa4jmC\xccRQ\x98\xd6h\x92_\xa9\"\xc7\xfc\xc9\xe5\xech]\xa1,\u0395IV\x9e\xca_\xb2\x02\xb9\x92\xa3\xb3\xbb\xb2\xb5\x99\x06\x16\x8e\xfaP\x80\xa0\x9ek\x85fb\xe9\xa3\xf5PA\u0221\xa3\xed\u02f9\\\xac*\xb8\x1e;\x02T\x1d\xfa\xaa\xc0\xf3'\xeaSg\x1fS\x11&\xc00\x06\xc1\f]E\xdd\xd9rY\xb9sE.y\u045d\xf6]Xt5\x93\xa9\xfc\xe6l\xb1e\x06\x95\xa1\x10\xfa\x1d!LM\xe3\xd8m\xa3m\x0e$/re\xecV\xafP\xc1u\xe7O\x9d \x86\x129h\xa6\xe28v\xa96j\xbc\xb8\u044a\xcf(iV\xb7\x88\xb4+\xdc(\x86\a\xc8\xd6|\xdc\xea\u007f\xaa\xfc\x9e\x90~\x99\xb6r\xaaT\xceC\xf7\xe6\u0755\v\xdc\uf863t3}\x05M\x96\xaaT\xf8D\xfc\x8eS\xbe\x14\x89\xc0J*+\xc9\xc4;\x90\xce\xcd\x02\x040\a7\r\xd0\xc0\xd3\xcd\x14\xa5\x8a\x87h\b;\xb9\xedJ\x1aj\u0124\xc8\x1c*h\x86\x17\x91\x1a4\xa3%\x8c\n\x84\x91\x1en3\xccq\xaa/\x1d\xb8\x12\xdaV\x97\xe1\xec\xf0\xb0\x05,\xfb\x98\x19S^\x03\x03\x98\xd3\vG\x15\x89\x8f\x18PM\x1a^K,\xe5oe\xba\n\xc9\xdcEa+\x81\xc9\x06\x88\x1b\xf8\ay\xb6Ef\x14\x005\x84\u050d6\x13P+\x9a\xb0\x9a\x90lr\x843\x1c\x9a\xa9,15R\xfeR\x84I_\f\xb1\xedI\xfb\nYh.\xf8S.\x81[\xe3\x8aX\x88\x1d{aK\x16\x85\x8e\x06\x99\xcc\x1b}\x91KI\xca=sn3\xa8atJ\x01\",Q\xd2\xf7\x98\xa0\x06\x9fD\tf\u0114Rr\x15\xdds\xd1HD\xd0\xc7\x13hc\u0212#\xb0\x00\xc6c\xc29\xe650\"\x19|\xe3\u07a0\xa7\x0e\x1fu\n[\x1cN3+\x89\xf1K\x86Y\x82D\xc0~`ja\x81\xa7\x89\x848\xe5\xe5\x98\x03V\x02K9K\r*\xccyT\x94S\x96)\xeb\x0fE\x9d\t\r\\\x17\xbc\x17\xdc\x17\xfc\x05\x9a\x1c4\x81\xc0\xe3[\x0eX\t\f*\xd62\x8f\x02N\x12V\x11\x9c40\xa7\xdd&7\xdeAnf\xb5\xe60\xb5\xc3\x16\vF\x01e\x82\xbc\x0681\xa0R\xdb\u009a\x00\xa6(di\x1be\xa0@,\xcb.\x81v\x00n\x84C^#\x8b\xceb\x80\x8e\x943l\xaf\xc2_ +\xc7\x0e\x02\\\xb7\x18.0\x9ca\xb9\x9a\xe3\x13\xd8\xcf\xcf+\x1c\xba\x81\xb5sl4S\xa1\xa3Ze\xc3\x0f\xc3\xfb\x95\x98\x03`d\x18\aq/\xe8\u00f4\x8e\xe3\xd7B\x1f}~\xf0d\xa0B8M\x1e\xf5\xa3F\r\x1a=a\xd8\x0e\xc4h\xfe\x05A]B5\x10T}6\x19\x87\x17\x8b\xa0\xf7,)\x99\xdf8'\xdas\x98\xb0w\xad\xc8\x17\x84\x91\b\x06.\x1e\xc0\x9f\xac\x1e\tvH \xfd\xe1\xf0\f\xa0eC,\x12Y\xa4\x05\x87\x10\x13\xc4C2$\x18\xf4\x1c:\xb66\xbe\f\bF\u00d4\x18@\xec\ad!\xad\x85\u04ad\xfe\xa3\u007f\xf7\xf0\x8b\v\b\"\xce|@A\xbd\xfa\xa2\xe3\x84\x1cth\n\xdd^\xe9\x8aq:b\x90\x03\xe6\x82\x01\x1a\xc2,\x1a\xc2\u0524h\x18G\xa0\xb1\x1c\xe8\nTF\x19\xa7\xd1k\xbdD1\xaa~D4K\x89\x18e\u010d\x0e\xd8\f\x8d\xd7\x15\x00\x194<\xb32p[\xa7\xbb\x1cL\xa2\x95y\x0f\x81\xbcr\xa5\x10\u0725M\xfc\x8a\x8co\x1aG\x17^5\xde\x05\x9c),\xf4\xaf\xb6\xfe\x97\xf4_\u026d\xe7~{\xf7\xcf\xfc\xffl\x92v\x95\xa1q\xaa\xdd\xff\xd8\x17h\u07616\x9c\xdb\xc6\xdev\xf5\xb7\xbd\x11Hzsm]\xf2;\xec\u07e6\xff!\xa9|\x97\xfde\fN#;\xb9\x18\xc6\xe3g\xa5\xa7\x9a\xe4)\xc4%6V\x12H\x82\x9e\x17#6\x15\x18\x8aC\xb7\xb8\x19\xcd\u0133C\x0e\t\x89xN=,\x89\n\x9ec\x94\x88Q\x84\x86I\x91\x11bM\x88\x91$yi\x88OHN\x86\xe3\xceL\xe4\xeeG\x92\xfd\xf3\"\aA\u05e4\xfd7\xea?U\xfb\x8e\xba\b\x90\x04\xb3.\x87Q!\v\xbar\xf7\xbf\x91\xcb\xfa\xba\n\xb7!FL\x93?r\x90\x18\xc1K\xfb\x84 \x88\xceP\x02\xd2\x1c\x81\xc8_\x89\xf8\xd0\xebo\xec\xfc\x87F\x8d|4j\xd1\xe2\x05\xaey\x04\x84F\xec\u0321P*@`^W8\xb9\xc9\xcents\xab\x95\\\xac\xa5u,/Z\xf6/\u06f9i\"\u0697\x14\xba\xbd\xab\x04\xa7\xc2\x16)O\xaa\x02\\\xc7\x12\x98+.\xbcn\x04\x18\xec\x83V0a\x15\xc4\xc5k\xd6\bAdPb\x83T\x1c\xb2\v#\x01\xc0\xa1\x05\b\xa8Id\u0371\xecA/\x02\x93C\xe9\xe4( 3vjD\xe4\x85xZ\x86+r\x81K\v\xfa9\x8f@\xbc\\\x91(\xf4\x91\n\xf9p\xe3k\v3$l\a\xadaL\xcc\xcaVegRU%RU\x12L\xd3\xeah\x12\xa0e\x03\xa8 \xc1&\n9\xa3\x9b9\u00dd6\xf3x9+\x028\xd0\xe7\x8e|\xea\r\xe4\xd2\xcc&\x82\xb6\x98P\xe5\x0f\xc1\xc7^\"\u07aa\x88[\xa4\xb1\xc1\x93w\xf1_\b\xec\xe8\xf0\x0f\x05h\xacB\xcc\xd5{\xb8\x1a\xbc\xad\xaa\xdb\f\xcdXo10\xea\xfd\xd0\x14\x8a\xec\v&\x92\xbc\xc6\xc49\x87\u018dc\x98X\x9d\x91\u065d\xa1\xda\xfa\xfbI\xd9!\x0eO\xbd'\xd4\x1f{c\xac\xa8]\xf4\x8f:\x1b\xf7a\u007f\x8c\xa21\xf3\u03bd\x0f\b\xe6\x8a\x11^[\x13\a\x13\f&n\x97\a\xde\xc0\x03y\x10\"\x01r\xf3\x93v\x16i\x13\xa8.\v\x93\xb4\xf6O\x91\x90\x8a\xbd\x96\x8bS\x17\xb3SR@\xdb\xd0\x063P\xe3\x05\x8c\x97A\x92\xcb\u056c\xf1I<Y\xea(\xaa h\u0513`\x9d\x8b\x99D\x86\u0518,I\xc8#\x03\xf3*\xd3\xdc\xe6U\xe5\xf5\x94'\xc9m\x0f')\xc6{\x94\xf5<\xbc=\xad\x91\xf5R\x9d\x9dZ\x8a\xb4-\aY\xa8\xec\x88\xc2\\;b\x87}6t\xe8\u0671\x04`\xd1;\x18\x02n*G%\u02a6\n\xdfa\x9e\xdeMl{F\xceg\x04\xfdT\x93\xbaBV\x82B\x82c\xe3\x19\r\x14z\xa7b\x9dec\u00b9\x9dOP*o\xf7\xa1\xbaK\xf5\xaa0\x0e,\x1cr\xc1\xe5RjQ\\?|VD\xf8\xaaMcI\x81\xbaqo\x89QF\xf0l\xe4k%\xa2\xbe\x81\xa0\x0f\x15eU\xf6I\x18\x19\xee\x12\xdb\x1bV\x83\x15'\x88\xa9\x85\xc6\\\xf1},\x05\x1f#\x82h\xb2\xb7\xd1b\xd5\xdf\x11z\xce\x11\x0f\x98G\x1b\x90\x06@r\xd4a\x92\a\u06ed9\xef;\x90\x02\t\xe8\t\x8c\np\x06\xd8#\x1f\x94\x12\x9d\xae\xde@\x9c%\xb0\x00\x00\xa5\x10\x00\x04 \xa5`\x9b\xb1\x97\xa3W\xa1\x1e$\x1d\xa0\x8c\xbdGl\x84i\x90\xc0\x9f=\x92\\\f\xbf!\u034c\x19\xa388\x17G\x81\x9et8\x11\x86\x04\xeb\xbfp\xfd\xac\x1dh\xd6\x0f\x02\xfe\xbf\x80\x19\xc0\xa7\xe5f\x16\x87\x95\x15d)\xc8,\x8a\xce+\xf9\xbb\x98\x00\xe6N\xc0\xecN\x00\xc6\r\u0634\x1f)1\u01f0\xb2D\x85\x8f\xdd\xeb\x05M@\xde\xde\t\xc8`\xc16J\x851A\xaa\x9d\x1b\f5I\xe6\xde%y\xe0\xfe\x80i\xb0\x9a\xab\x98\xe6\xdfa\xcff9T\xda?\xf8\xe57\x9c\xc5@e\xc1\xfc\xd8\xd5\xe0k\x82\xd0\a\xaag,d\x83\"\xab\x15\xb7(Sa\x9d-\x9b\xd2\xd3p\x17T\xc8\x10\xe6\x0f\x10\x82,\xe6\xf3\x0531@M8\x1f\xfe\xae\x89\x18\r\x16\t4\u0559\"\\\xeb\u027dO\xe4\xe6\x97K\xd5\xe8\x91&e\xbbA\xe0[1\xc0He\xd0\xed+\xc0\x05\xe5\xceq\xc5Aw\xaa\xdf\x15\xadV\xd5 \xb4\xdf\r\x94a<\xdc\x02\xe4o\x0fTB\xd68v5\xc5!\xc5\xec\x04\x13\xe5\x13\xf8\x16\xb7\x91\x044X\xa1\xb3\x97\x80%\xca%\x90&\xb0\xac\xc2\xdd{\x06\xd5\u070a\xf2N2o\x0f\xeb\u0207N\xa4+\x90d\xa7\f\x95\xe6i\r\x00\xa2\x97\xacf\x83%\r\xa3=k\x99\xed\fp\u0474\x00E5\x10w\bH\xfbh\xac\u43f6\u07c4\xa1\xf5'\xeb\x12{\xe9_\x9b\xc0y\x18\x9fs\xe9\xc0>\xa3\x99\x03\x860\xe7\xd6b\xfdX\x17\x8dm0\x842\xeeK\xab\x03\x1e\fzD\x8eC:O\x8c\xb9\x03\xe4W\xc1\xa4<\x1eh\nMj\a'\x86?\f\x9f\x89\xc5\xe4\xa1\xf8\x11\xfezh\xba\vf\xc7\x00\xfa\x93\x01{\xfcxk\xbe\xfb\"Pn\x02\xd9\u042c\x96\x18k\x12\t\xf7\xa5\xe8\xe9\u007f)X%6\x1a\x82d\xa6\xd1\nU \xf2YXEE\x8f\u01e2\f \x86A_\x931B0`\xd4\xfbWm\xb3\t\u007f\xabO;a\xa2\x8aNu,\t\xa6/kn\"\xab\u06b7\xec\x9dj\xcduI\xadQ!\xe4\u013f8\x9a\xae9$\xe2A\xfb\xe0\xc1B\xf5a\xc1M\x12\xd9mnU1d\xb1c\xe6+-\x15\xb5\x19\xfe\x8c\xf7\xe2hCd\xbef\x12\x05K\xf3\x83\x9e\u02b2\xd0p\x80\xa3\xe8C\x12\xa1\x11\x89FJ(\x1b\x155\x8a^0d\x18\fRLi\vd\x19\x11Nu%<n\x1d\x18FE\xeck\x1cj\xb9\xb2\xbc\xbc\xa3(2\x03\xc1i8c\x15\x8a39`\xd0\x1b\r\xe10\u033eS\x13\x86\xf3\xad!J(\x91<\xed\x96 \xc9\xd85f\u7a28\xce@\x8b\xa1_\xef\x18:(QX0\xe0\x93\x1e\x9d\"\xa0\xaa\xa6\x92\xae\xa8)\xe19\x03\x04\xcd\xc0\x14`([-bf\x02>\x1cJ&&\x8c\v\xb5\x05-\u007f\xa2\x01\x99\x96\xad`\x9c\x99{!&\x1f\x16\x03\u0182Jp\u01b9h\uf0b3\xab\xfcl\u063cM\xef\x1e\xaf-\x1e\xbf\xca\xea\xcdGB\xddL%\xc7\x1c\xc3[-'I\x9d\x00tONV\xc9JH&\x15\x0f\xa6o\u007f\x1d\xbb\xab\xe7\x87y\xc9\x04\x96\xe8\xef'\xd4\u05f5YF\xa1\x15p\vq\xd1g\xa6\x84?Q,\x95<\xb6\xa1G\xd8\x02\x91\x9c\x97\xcc?\x9cpM\xb9R%~\u007fJ\xa7M\xa4\xa1H\x0f\x9e\xed\xa8\xf3\\\x8aZ\u06b0&\x02\xb6\x1b\x9b\xf61u\xaf\x14>`\xd5r\xf13\u07e9\x83k\x14\x151`\xb1~\v\xdfqZ\xba\x8b\x85\xe0(LC\xe3\xc3\xe6\x046\x9c\x1c\x12\x06\xe2s\b\xc5.\xa8\f\xaexi\xf4r]\x16S\xaa\xc7\xf4)\xc7P\t\xf0g\xa3\x88\xdd\xe1\xe9<\b\xd3Z\xae\xf7\x92k\f\"\x97\xc5\x18\xddb!V\xedH\u01d2\xa52\xfd\x83\xfbaE\x160A\xf1`\xad\xea>^\x81\xfd|d\f\xa0\xe2A\x9a\x9f8\xc0\u1604t\xd0\x0f\x8e\a\xc8\xd80q\x81\xb13\xc33s+\xe7\x02E_\xa8!\a\xa8)\x10R\xf8\x19\xd8\xea\xcf\xd91\x85\xe5)\x90\xe6~\b:u:\xe5\r\xdd\xfb\xceu\x15\xf0\t\x05\x96)\x0181T(\xadb\xc6\xfe\xac\x8c\t\xf7\u0524\xa2\x1c\x99\x18\xdd\xe9\xa1 \x14f\x10\x92\x04\xc6Z\x0f\xc5\xcfU\x84|x\xda$f\xfaDK\u0266\x81(o\xa4G\x1eD:\u007f\x13\x83\xedH\fiz\u0268@1\xac\xacZa\x80\u02e3\x05\t\xfb9R\x92\x99<\x80\x8e1J\x10\xf8\xb4%\x06L\xbc\x81\x11a\x0eLD\x98\xc6&\xe8\rg\xca((\xd2\r\x89F\x9f\n+0j-\x88\x06'\xa6\xb0%\xd0,\x02\xa4\xc3)Q\xb7U\x12U%\x03\n+T8@\x89\xb0\xf3L\x98\x87\x11\u02b1!S\x190\x0f\xd5\xd5\xe6\xd2V\xfe\xa5 l\xa71\"e\xac\xf6\x04\xa7\u06433H\x11\x8a\xf1\xe8?r\xd0kw\f\x93\xa9\x01\x11U\x9b#\xe5Me\x9aJ\xb9\x9cJ\xac\xfa\x10\x0ek0\xc52\xa0j\fHABy\b\"%F\ua1eb\xe6\x9e}\xbb~\xc4\x05B\xfaN\xb9\xc9\xf0nG0\x91\xe3aR\u0639`\xcfD\x01\xe9>\x8d\u071d\xa0N\xd0\xed\xd6\xd1m*<XF\xf3\x02^\xc5\x107\t4=\x01\u03e0>\xd0\u00ad\x95@\xb6\xb1\x80D-\xa6,j\x9c\xb7\x86\x9eEF\xb8@\xfe\tC0\xf9\nkL5K\u0552\xc9J\x9e\vTB\xc8\xf1\xe4&\xe4.\x8e\x92\x1e\x98\xa1\xcd\xc5\xd8\x06\xdbv\x03\xb7\xa0\xd9!\x0e\x017\tp\xd2{\v\x8a\xca\x13\xc5S\xb3\x01\xf7P\xabRMGS\xc78a\xdaE\x12\xe2\xa5D#\a\xbb\xe0U\x10\x9c@P\x98;LH\xb1\xf8\x18\x1e\xc8^\xcc^\x85\x8d\x16\xb4Q\xf9\x17O\xc1\xc8\x1dT2sN\xa1\a\xa8\x12\xae\xca\ri\xfd\x1ej\u0214O&h\x04R\x00\x8ai\x1c\xa2\x97\u035f\xf5\x93\xa5\x15\xfd\x9dD\x16\xa1\xb7\x90\xde\b\r\f\xd3\xc6_X\x19\xa4\x861\x93\xbdi\u0419\xb35\x15\x02\xd4\x04\xc7\xfd\x12\xba\xbb-\xecN\x16\xc3\x1cZ8H\xfb\x94n\x91\x132&a\xb1\x18\xf9\x9c\xe6t\xf6\xf1Y\xa8\x95\x9c\xc7\xce\r\xc2\xe3@E3\xacc9:\xd3W\xd0~6\x12\x89\b\u07b8\xa8\xeeD6#y\v-\xa7\x98\x92\x88\u6d55 !\x15J\xa6\x93Wb\xb0\x93`V\xc7:\x16\xed\xa5m\xa3\xf1\xec\xe8f&\xf9\x118O8\xf4\xa2 \x19\xc5\x12\x92\xc3@\xf8\xc0\xf2\x88\xe2\x1d\u031c\xbc\x9dH\x8a\x11\xcf\x04`\b\xed\xe1\x99\u039a\u00b1\x92\x97\xa0\t9\xbaQBw\xd4\nM)\x84uQJ\xd5\x02\x99`4I\xe9]\xa1<\xa9\u0705\xbe\xab\x83\xdaK\xbc\x9d.\"d\bM\xb0\xab\xe2\u01b0\xf5-C\u0147\xf5\\\xb2\x13\a\xaa6{\vu\xd8(\x17\x02L$\x95(\x83\xdd2\xac\xd1G\x1a8\xa2\xf9$#\x13\x18R\xb0\u01850M\xcam\xda\xc5H$\xa8\u04d0\xfan\xd9(\x13\xf6\x85\x19*\xb9\xa0\xe1%\xab0\xea/E\x19\xb9O\xfc\x94\x02A\x1c\u05b8\x14\x99*4%0[\xb0&Z\u2c9d\xf8z\x17\x85K\x1a6\x9cTn\u0629\xe8\v\x94\x9dp\v\u8ade\x1e\x93\x06h\x19\xe2\xa0\xea.\xe5\xf6$\x85$je|A'\xbc\xd5\xfe\xc8\xf2\a!fF\xdd\u04bb\x91;\x95(\x1c\xa9\xa6p\x13W\x87\x12W9!\x8e\x95v\x17G\n\xadQ\xa0\xc8Z]\xf4\xec\xd6H\xf98\xa8\x98\x1c\u0265.B\x88\xcd\xe36\x97\xdb\xe2j\x8ci\x06\xeb_\xb1\xd1P\xc8X']\xf4D\xd2N\xf7g\xf9#\xcf\xcf\x05e\x97\u007f4\x91\xd5\x03)\xbc\x811 %13i:f\xb2\xb2S\x13=\x02\x02\xda3\x0em\r\xf5bb\xec\x8c\xc2\u05a7\xe0\x88\xd1<\x86\x83hf`\xd3\xdc&\u012a^8 \xbbf\xddP&trHG\xe6{3\u060f\xaeisu\xe5L\xe6/\xa6c\xa3\xb3I\xdbV'\xael=\x99\xddz\xeau\xae\xf6\x9b\u06a4\xaa\xf6\b\u0494^k\x138\u0553,\x04MS+\xa3\xf9\xeefj\x8e^K\x99j\xa6\rOt\xa6\x1b\b\xcf&*.\xcd72\f\x94\xcau$\n<Q\xdf|\"\x1eu,\x9a\xa3\xd8\xc0\xfb\x82\x95E\tf\x91\xbeP)\xa4\xdb\xdd\x17^\xb1$\x86\x11m\x16\x1f^\xee\f\xa6lE\x9a!3R\xb5\vTH\x95\x98\n\xa4\xd4\xfeK\t\xbd\x19\xdcP\x1f\x04\x98\vs\x01L{P\x81\x12q=x\xf9q\xd1l\x14-\xb8\xf0\t\xb3\xda\xe48U\x1c\xa0@\xc8\x04\xbb{A\xf3;%kT\x80\xb0\xbf6\xa7\xcdk\\\xbf\xca\x03\xbd\xb2\xa36\bf\xb2\x05I\x96\x10}\xa5\x89\xf6\x8b\u05dd\v_i\x1a\u07f8\xeb\xef4Xe\xa3#\x97\xa0;\u024d\x02\x15\x02\xad\xfb\xe7e.\xabWs\x18\x86\x03\x00\x98\xff\xa01\xf86\xdc\u1fa7\f\xd6\x05\x90\xdd\x00\x1dPA\xa0:\x03\xe7\xe6`p\xb3\xc6z,\xd3Z\xbb\x80\x1c\x11S\x97\xe6f\xe9\x8e\u02e5\t\xb4\xabI\x90 \xa8~Cx\xd5\xe8\x88K\x9f\x93\xf2\x19k\xdfB=E\x954\xabu\x83\x8e#\xfe\b`\xf5\x8d\xa9\x0ek\xa1\xdd_I\xb1|\x1e\xbc\x154\x9b\x16\xaeE7\xc46\u01e5\x90\xf7JS\xea\xa4\xc6$Ya\xaeB\x8fv\xa9`\u02bb{\x86\xa5\x98\x19AIv\xe6\x89\u0741y\x06y\x8f8\x10b\xe1\v\xe9\x86\a\xd8\x0f`\x1c\x128\u01ef\xe1\x8b(\xf3\xfa\x18\xc2\x00\x92\xf3^\u0096\x18\xa0X]\x15zX\x99\x80r\x11Ak\xb0|\xfd\x03\b\x8a.\x18\xc7\x00\xbb*\xa7\x06\x8e\f\xb9\x84\xec5\xc6\u05f2\x06\xbbGXa\xda\xff\rM\xd0@\rX\u0755\xef4lh~\xa5,3B!f\x04}\xa9!\xf3,\x82>\xaay\xaf\xdat\xb2\xf8\xac\x00k\"\xa3\a\xccT\xac\x03`\xca\xd8M\x8a\xe7s\x06\\+}\xeal\x91\xae\x82wM\x93\u053aRh)|\xa9\x1dQ\xb5\a\xbc2Q\xb3Zg\xe9Bw#K]Du\xa8\xa1\xc6n\x18\x0f\xf6\x804\xb6\xe1\xb3\x13\u015c\x10\x87*)\xd1\xd3\xd2E\xed\x88\r\v\x12\xb3nt\f^\xca\x04\xf7#\xe8\x19\xac0\x85\v<6\xba\x81\xael(\xb4\xcb2\xbelB\x1cC \x95\xbc\x9d{v\x12 \xaaR\xb2\x83I\xf0\xe8&\xbe\xf3F\x85VIuN+\x9b\xa7\xb5\x10\x153\x95\xd1[\xf0\xd6}\x05V\xf4\x18\xe8\xd8\x18\xb7*$\x13\x03\xb3CA\r\v=\x19o\xfa\xcch7\xf8\x8cEYY\xe8\xed\xf0\x83\xb2\xcd\u0317+\xcdg\x83`\u07d8\xd6\xe4\xb6\xdajTI\xed\u05acL\xab7\x01\xe9\xc0G\u01a0F3P:H#[\xc10\xe9\b\xffY0\f%0\xbeN\xfb\xf5U\xbf\xc8\x06\xc79\x82\x15\x83:x\xe7Ic\xa4)\x89\x03lZ98\x06\u03b0f\xe11V\xa6\xadJ j\xe2\xa3QU6y\\\xfc\u067f\xa3\xc3nJ;dN\u6e49\x89\xf5\x9c\xf7\xc4^\u03ae\xf2\xcb\xed\xe8\xc64\x9fg\x8a\x9eR\r\xe6\xcc7\x18y1$\u05e0D\f\xedx\x8c;\xb7\x86G+\x86\re\xf9\b\u0542\xb3\xcb2\x0f$\x8d\x10\xa6\xd4Ph1\xa0\x1e\\\xdb\x13z0\xb3A!NX\xd0\x13\xb6\x15\x1fN\xa27K\v\x80\xb6\v\x9c9\xba\xf7\x1a\x84%u\u0448\u49c1`\xd8\xd6?\x8b\xccO\xd2\xc60'?m,\x8ec7\xcc\xef\x04\"R\x18s\xac\x13\xbe\xc4`\x1d\u0231\xa9\x89 \xd7\xe0\x99N\xe6s\x89\xc0;Y\x1fC\x96\xc4\xf4\xb1\xfb\x95\x88(\xe7\xdd\x1d\xf2\x10&@\xc2\x1e!D\u00b4\x8f\f\u04d4\xe7\x90Np'I\xfb:>\x98\xd2h\xa5&\x86\xd3\xe8I\uc910\x02\xe6\b\x15Evg\xa6\xc0Y\xe65\f\x17Q\x9a\x82\x95\b0\x0fn\xfet\x1f\ub186Y(\x8da5\x86\x9f\xe9g\xff\xab\xfd\xfeHp\xc8V\xfao\xb1\b\u00c2\x961\f8\a\x92b\xfc.J\x9cWb\xf0\xdf\xea\u03cb\x86\xfe,\xa7\u01d3\u063c\x93\x8a\t\x1d\x83\n\x1e\x0e\xa0\u04ae\x035\xd32\xac0\xa3<\"\xa7\xc4c\xeen\xf8\u00f4x\xc38\x19\u007fgX\x84\xde?\xde\xf9X\x9dPL\xdcK\nlC\u0415\u58e6\xb6\xfeJ\x0e\x85=\xb1q0R\x9df\x9e\x90\xbfM\xacL\x94\xdeX\x0fa_\u0736\xf6L\x80\xff\x80\u0270\x1e\xa9\xf5\x93b\xa3\x03U\xe8?o\xb8H[\x88\xab\x10PN\xec\x87\"+\xdb<\xa7%\x11<8gBY \xb0Kr\xd8^z*\xb3\u01eeA\u007f\x03\xd0,C\xd7\x15F\x91\xfc\u00e4\x05\xfc\u0b07\xf1<\xc4\x05a\x1d\xa1\x994S\xacuQP\xdc1\xc1rp\x9d}\xcd\xf1\xfb\x9f\x89r@\x17\xe4y\xc0\xddM\xd8\xc3\"\x80\xf7\xd2\xeb\xa3\xc7c)\x15cc\xd6>\x94\x16\xd6\x11%d\x13S\x82\x1d\\\xb2%\xf7\":`\v\xb27X\xabl\x16\xb29\xb4T\x02\xba\xbc\x12\xc07\x98\xb7\x1d\xe5\xd21,l4`\x9b\x83\xdf\xd7~S*J\x89\x10\x15#W\xdc\x04#\xab\x98\xda\xf3\nf\xe5\xb3=\xfc\x12!L9\xb1\vD)\xc0\xb1O\x10\x14\x04\x1f\x05\xa9\x84\xb9\xe9\x12\u05944+\u00a1\f\x9aA\xb0\x19\xf0j\u0659l\u0440\xb1#\xe4\x14\xf2\xfb?\x1b\x9c\xb5|\xee\\k\u00ea\xde\u05f4W4od\fu\x85Y\xaa\r'\x95=2UZ\xc6`q\xf33\xab#\xb1\u6005\x1b@\u04ea\xfa\xe4\x9cN\xf5c\xf6\u040c@\v\x94\u0317M^GS\xc2\xf5=\x12\xb7\x9f\x103)\xc8@\x1c\xf6\x12r\x88\xa3\xdfQ\u072a\xacIU\x16\v\x86\xd1B5\n\x82\u036b\xc9\xfe\vaQ\x83Xq0\x91h\x05\xd0\xe5M\x18\xae+\x8ah\xe8\xe0z8\xd5g.\x98\x06\xd6\xff\f\x01\xa1j=\xbf[4\x9a\xc2gz}\xcfg\x06\x14\x86k\xa7\xa7\xf0\x05\xf1TM\xf5v\x05f\x90\xf0\x84\xc7|\xb3\xd4!\xe9\xd6.\xa4g\x8e\x0e\xd1\xfe0\xa2m\xd3\u0201\x12SR\x8d\xec\xc8*v\x1bQ\x80fU\xfa\x1c\xbd\xe6\\\x93\U000a24a9\xa7\xea5h\x92\x18\x98\x1c\xd5\x05\x0fN\x8f\\.C\xaaCF\xc1$jZ*\x9e\xcd,q\x89\xbdmR\xc7+/C+\x86\x01e\x9d\x8a\xb3\xd1\x0e\xa1\x8c\xbb\x14\xb9\x02`m\xb4\a&\x87\xba\xe2^\n\xdf\n\x9e\xd0\u046eU\x1b\xbfp\"\xa1d\xbd\xd1U\xd2\xc7g\u0457>1\xe2\xf6\t\xf0\xa9\xddG\xb2\xac\xd0\xf5\ua3be\x96\x97\xae:\x96\x00\x17\xaf\xfe\x83\"\x8b*\x9b\xc42\xaau\x8a\x84?m\xec\x9c\x18\u0293'\x1e\xc4\xe4\xe4\xaf\u04d0\x9aNA\x1dA\x18\xa4a.\xbd0\xd2F\u0164\x04kz\xa59\xed\xa71\u0160\xf6\x19\xcfo\xee\x9d\n\xf1\xab\xf9\xc3\x10r\xbe\x1cLW\x9c\xc5\xcf]\xba2\xae2+\x81\xad\xdbr\xa9\r\x11\xa8\x84\v\xe0\x97\xf1\xfeM\xda.\x9d\x80\xee\xb6\xf5\xbcW\x05\xa7\x98\x85\x02[\x94\x95\x00\xad\xe2\x15\x92\xa2\x8f\xb8Z\x05\xb6\xa0n_\x915\xc3@,\x8d\xee\xda%\x91\xa4\\\xa8@p\xdbD\xb2!\xb5\\\xdd\xee7\x93xb]u\u0582\x8a\xe7\f\xb8$n\xb5\xdc\x1d\xbd5b&\x1ch~A\xea{\x01>\x8cP\xbdO\xbe\xb7^w\x80k\xca\f\u847edr\x99\x1c\x13\u03d6C\u049cp\x9e\xe9-\xce?6E\x13\x94oj\xb9L\u0343\x03I\x995p\x05k\xd8b\u06c72\x1eJ\xa4\xb9\xdc4\xe6I\xf5\u0659w\xddXb\x0eF\u07af\xa8\xc9\xee!\x02u\xc2\r\xb5\x04\"\x88\xc1\x95o_\r\x87E\xf0f\xf4\x913\xe8\x13A@\xab\xbf\xcdvr\x84\xc9\v9%\v\xe6z\xd8$-6\xd8\xe0&?\x02\x16\x9eh\xa5:\x10\xe2\t\x10\xa2$\xe6\xa4\x02R@\x1d\xdb@\x1cV@WwH\x14hF\xf5\xb6\x89\x86\x1e\u06e7\xd6\xcbH\x14A\xd8K\fY\xde0]\xca\xf3\x1c2?\xe4\\wM(\xa2\x0e\xc0\x8a9Tp\xef@t\xe8\xfa\xa4[\xd9>t\x83\xa9PgF\u00fbCk\xc6\xd5\x1b\x98a\x8b\u0533@\xe4*\xfa\vV>\vp\t\xf1T=H*\xb7\x96\xa1\x12m4\x9b\x88Qi\x94\x8e\xf1@\x8c\xd8:\x9e\xdc\x11\xe2\xf1\xba\x00v\x9e\"\xa2\x95\xfd\xefi\xe0^h\u04aa\x04*\xba\xdb\xca'\xba=\xedB\x0e0eL\u075b\xe6\x83Y1=\b\xafn\x0e\x90G\x9d\xd0j\xc0\xdb`\xae\x11\x06\xb0\xec[\xc6:Aa\a\xeeo\x06\x01G3M\xa1a\xf6\xea\xf1/^\u0332\u01ec\x9b5\x93\xc6\xf2@$\x90Q\x80\xb9\xbd\xc9\x12\b\xf0\xcfX\x95uvT\x00\x88ih\x8f\xec\x89\b\x88j5(6x\xf6\a\x98\xe0\x06\xad\xd4c\t8ru\x98\x0e,$=<\u6dfd\x98_XE\xddo\xe7\x02F\x8b\xba\xfe{\x8b^\xf3\x90\x06\xbf\x17U\x9f\xa1`;Q\u90c8x\xe4\x87\x1bY\xfe?\a0r\xae\x9c\x10\xf9\x9b\x9aX!\xa5\xb1\x1d@M\x9c\x84\u0726dU\x81 \x1e\x1a\xae\x9cp`\xa7\x0212\xbe\xf4\x86\u04df,]_\xeb\xce6\x04\u024c\xff,\xe7L\"\tR*\xc1~\x06y&\xa7\xbc\xc5K\x16L\xc0\x130\xdb(y\xed\x13\xb1\u007f\xa9\xa30_\x85\x93RV\xee1\xbf\vF\xa0\x1d\xf4*;\x01\xa4@;\xb4`]\xbe\u3368RB\n@C\xb26\xac\x19^\x85\x9a\x9a\u0644\xc5\xd0qE\x17A\xed\xce3W\xa8\x9b<\xc5\u01d8\x05/\xcd\x16\x88x\xd7bN)r\xf9\xce\xe4\xa2E=x\xaaU\xb8\xa43\x11\x96\xc1\x15\xd3\x11>E\x8d\x81\xff\x10\x1b/4\x90\xcc\xc3\xe7K2\x88\x87]1\xce\xdfN\x1f}G\xb2X\x8c>\x99\xdcc\xf1L\xccA\xcctz\x9c\xe9F\xee\x8b\xde1G\u03c6\x04\xfc\xea\x10\xa5\xe6\x1fY\x04J\xed\x06\xda\xf3#\x96\xf3y\nQKC\xc2\xc0\xe6(\x8f~\n\xfb\xff\rhTAbr\x8e9,'=\xd0\xd2T\xd5x\xa9NT,?\xa3\xe7'\xea\xa2\xees>`0~@N\x94\xa3\x12\x9e\xed\x86\u3026H9n\x9cjJ\x1f\x1dqP\xc6\x17/\x0f\x99\x18U.%\xd0\xc9\xccH\xd0oJGd:\x18\xb2\xe7^\x88\xeb\x83\xec\x0e\x1a\xdbY#\xb0`\xad\xb8V<\xaa\x93\xb9M\xaf\x10\f\x9b\x9c\a\xe6\r\x12\x13o`\x03\xe4kdZ\xeeCX\x94a\xe4!)\x12\xeab\xc3y\x90\x82\xc3lRJ\xe9\xf2;\x16\u07eaD/\u04a3\x91-\xc7E\xb0\xb3\x94B\x18vf\xd4CZ\x88\xf4\xfc?K\xc5\r\xdb\xdcP\x0f<\x93\xce\x11\x91\x1bU\x84\xd6g\xb9\x86M\xc20\xe5\xf0\r\xc0My\xcb\x0e\x9c\xf3\x83\x18f\x87\x80ia\xfd\bE\x89\u042a!q\xb3+\u024d\xb9\xa9\x9b\xe3\x94\xd4\xf99b~\xadQ`\xea\x9b\xec\x86O\xda\xc34\u0098}T\u0546?Sh]q\x87b\x89\xa0\x80J\xb1\\Qy\x05\x17j.\x05\x13\x1f\xd6\x03\b\u007f>\xb9u\xfb\x01\xf0\xf9Lm\ufe4d\xfd\xbc\xa5T\xa4\xaf2\x1c\x02\xed\u063f\xa4/d\u067fPV\xbdJPW\x1cHX7\xdfhUr\xf1\x06\xb9\xd4i\xcd\xc1\x10\xbaT\x83\x80\n\xfbI\x12\xc3\u039bG\x1a\x84\x94\x9e\u068d\a\xa1\xdc\xd1}\u0712\xc4f\n\xb0w\xbeC\xad\xa6\xe1v'RR\xa5D\xbd\xbe0\xd5\x03\"/2\x81~\x94\t\x96PP\u0089\x8a\xca\xe8\xa0\xe0l\xab\xfc\x9cd\xf21z\x05\x1e\xa4\xb3\x1c\xc1\xf4\xe2\xdck\x1b8\xa3\xbf\xca5pB\xb3yc\xab\xa9j\x19\xe1X!\xbb\xf6\x14;'s\x8e\u01ce\x81\u0196\u0176\x1fe\x8cJy\x1b\vo\xb8@\x85I\x0f>\xe5\x19\xf0\xe37\x9f\xf6\x9e \xd8`^\x847|i\xfc\xabj\x00\xd3\xd7\x16<D\bub\x99g\f\x06H\xe3\x95\\\u007f\t<O\xb6\xb1\x99\x8fRh%K\xd2\x12\xccL8\xea\xcbwO=h\x9aq\x9d!.*5G\x18\x94A\xba\xa8a\xbb\xb5Q\xd2Z\\\xd1\xec\f\x97\xc1\xaa\xd6\x14g\x86\x12L\xaf\xd2\xee\t\u06977\u007f\xe4\x9f[D\x80\x96\xd5A\x8a\x89\nB\xbf\x170\x19\x9f\f\x92\xc3\xea\xb5\xf9{\xa5\x96\a\xae\x93+0\xb9!o\x11D\xbf\x01\bxT\xfbH\xf6<Md\x05-\xd7\xd5\xcbEv/\xa8\xe3\x99\n\x82\xabG\xd5\xd3\x1dH\x16JVo\xe9\u041de\x9aO\x8b\xfc\xe8yi\x90La\x9bMC3\x14\xda8\"#\xe1\x1e\x8a\u03de_\xff\x86\xa9\xd12\x8c\xe2 \xa0\u069e\x86~L\x8f\xc6\u007f\xe8\a\xd0vY5\xbc0PQ+\x87\xe4\xe5*\u03412\nT\x83\x1a\x04\x13H\x90\xf3\xff:O,\x1d-IC'1\x93G\xb52\x9dC\xb4\xc1O\x9f{\x10\xe0St<J\xfa.\u07ba\u05b5\xb3\x10\xb46\x1d\xd6\x1f\x83\xbc\xf0\x88|\x8b)T\uf251\x96\x89CJ\xee\x9b\t'\x82@\xb5\x06j\xda\x11-\xf2tS\xd4-\x14\xba\x12\x185\xe5\x89\u076c\xb7\v\x86\xaf\xb1BD\xb2\x18\xf8\xf6:\xa4\x03\xe8\u0398\xc3\xe6Z\xfeEO\x15\xe4\xd5\x0e\xcc\x14\xa0\vb\x01\x94E\xa9\n\x88\xd5\x0f\xe8E@\u00adVF>Q\xf9\xcf\xd59\xf5\x1e\x99\x84\x0f\xb6#\xa9\xf3\x12P`\xffq\xf4\f\xa3\x9dm\x1f6\xa8\xc1\v\x19\xf7\xeb\x8b\x00X\xfea\xa3(\xc3\xfd=\xb2\x84)D\x88\xe7\xc9#\x1d&\x87H\x1ca\te\x13G[\x18\xc5\u0281\x17\xc0\u01a6g\x94X\xdf\x1d\xc1rZ\xaf\x87a\x8ee\xcb\x10\xfcf\x14`\xb0g$\x8e\xe3D\xeeRQPG\xd4}\u00d8\x86\xc9i\x912\u0179\u04e9\"\xdd,\xd8\xeb\x95`\xd6\xea6t\xf2\xb8\x1cU\xb6\xea=o\n\x8c\xac\xfe\x1f\xfe\x8d\x85E\x06#\x0eQn\x1eH\xe3#\xc5\xec\xdeI\x1aJz\xca_\x10\xe8\b\u0706r\x92\x02]\x15\x01\xa6E\x998\xa6\x19\xf4G\x0e!\xd71D-7\xcdt\x11\xd7\x13aXj\x8ds\x1b\xf8k$\x91 q\x998R \x88\xa7eq\xac\xdb\x03\x9ae\xb5\xa6^\xc5\a4<T^\x11m\xa7aJ\x83\u02bdZ\x16%\x81FN#\xbd[\x8b\xf0\xf0~\x83\x87V7Kl2<\x16!2\x12R\x16\u007fP\u02a0B\xe8[+\x82RT*#\xd0|\r\x13\xda\xf6\x80rEIm\xf3!\x95\xf5\xacB\x85@~$\x93]\xd1\xec\xc5\xf8n\x1f\x94a\xef\xc5\xe6\xaa\fYa\xd2;\x88Ip\"\xe7\xa3HK\u02e7\xb3\xceZ\xaa\xa1V\"\xeaX\xd7r\xbefU\x82\xf6\xd6\x0f\x1b\xa3\x0e;\x01\xc1\xc8p\xe8\xc8\u0451*\x8e\x80\xa9\r\x05`x6\u3792\x18%O\xa1h\x99\xda.\xee\xb1\xeb\u0203\b\xee\xec3}\x84\xae\xa4\x8al\xab\u0674\xa0\x10\f\x82A\x96K\"\xb71\xf0\x91\xea~\xd1L;\x10c\xe3* \xab\x9c\xd9dI\xd6\u00bd\xd4\x01<\xa2\x9d\a\xcf\x17\x8f(\x94\xe8\x00~}\xec3\xae\xd3\xd4K)\xa8\x91\x8f\x06BqE\x96\n\xaa9\xe2\xcaWP&\xc9\xf6;\xd8O\u028f\x9b\x81U\xdaZ\xcep\xd6\xd2\xe3\"[l\xfa\xd9H\xab5\x90\xaeN9&\xd2*N\xd6\x1d\t\x11\xa1#\x93r\xdcz\x1c\x90\x9fZB\x96\x05\x02_\xb4\x84^L\x9eV\xe6>\r\x1e\xdet&\xfc\xf1\xb5\xaeN\x1b(\x97c=|;p\x97\"T\xd1z\xae\xe4\u0204h\xb40N\xf1\x0f\x92\tq\x19h\xe1\x85\x16\xba\xa3\xe1\x06\xd2%\xda\x13y\xa9\x0fw\x03\v\xff`(\xa4w\xa4\x88\x19\xab\xb1p^A\xac\xf5&\u05ac\tx3\xb3\x8c\x15\xbb{\b\xdc?r\x0e\xa386\x19{(/~\xa19\xf4\xc8\xc7Zr\xc9\xc7\xdc\u0aaeSi\x8f\xf85\xe9\xfdf\u02b6\x89>@jag\x13z\xe9nCv\xac\x9b\x145\x15\xe6\u05b6\x8bC\xe9\xb1}\xa0)'\xbb^8\xdbl\xa5\x82\xac\xe7\x97\x16hS\x8a\x8c\t\x99\x14$\x13e7]\x15m\xc2Mo\xe8;\xd6\xe6'\xdeQ\x16'N\xe0*\xe6\xcd6Oj\xf7\xf4\xb80\xb8j\xb8\xa7W\xd7\u05a1\xaed\xb2\x98\xb9\xc5t\x06[\x9c\x93\xbd\xba\xca\x14\xd1\x14-\xa8\x06qQ\xe8\xf0\x9eu\x13\xb9\x92v\xa4\x88\xc5\u044ee\x9b\xa9\xd8\xf8\x91\xc1\xbd\x8b\n\xd0!-\x1f\u0253o\x12Cva\xff?;!\xb4p\xe2\u007fs#\u068f\u02d8\xbdx6\x19\xe6\x82\xf7l\xd5\xf1{\xff\xc8I\x92\u0754\x95\xde\x03;\xf6\x90\xb8\xa8r\xf5+n\xbb\xb9%\a\t\xa6\x03T\f\t\x12\xb8\xec\x8aN\xca#\xb0\xaf\x92*A!\x9e'\xfc>:[!l\u05f6H\xa4LY\xd9\xeb\xb9\f\x82\x9d\xef\x18e\x9f\x8d\xad5\xb8\x19=\x96\xf4\x11\x862\u41c4\xab\x11\x9b}t\xfdz9\f\xca\x00M\"eh\xc0\xecRI\xc5d\xf1]1\x96/B\x15S@\xe7\x02\x84\r\x91\xfa\xc9\xff\rj\xec\xe3\xb8H57\x8e\xda\x0fT[\xa3\x13\xf9T>\xe9y\x05\xf5`vF\xed\xa7:\xc5^\xf5\xb5\x03\x11\x8b\a\x96\x1c\x88nXI\xdb,\xbf:\xe0\x10@\x87\xc7E\xc6\x02e\\\n\x8f\x13\u02a0\x99k\xd3cQ\xc94$\x87\xe7\x18\xfc\x92\xd9\u007f\x18'`\x92Z\xb4\xbe\xcd\xef\f8\xb4i)&\xb0[\xa9\"k\x85\xb5\xb2P\xedCy!C\xe9C\xbb\x01[\x1b\xc0\xdep\xa0\x9b\xc5wR\x0f\xa3\x83\xe9\xfbK9/\xc1D\r\xbb\xb2N\x86\xac\x9b\xad\xd41\x0f\xca\xdc\x19\xect\x15EiP\xea@T\xb1\x86\xa0\xdd\xe4\u07ed\xc1fD7\xf7\xce3\x8c\xbaP#\xa6\x89\xa8\xafJ\xcf\xee\xa5\xd7}I)Q\x8e\x89\xde\x12\xc0\x0f<\xb64\xaa\xffC\xa25\xa0\xf2\xa7M\x92\x90D\x10\x82\x17-\xa3\a\x82]\xc2Xe\x02\xef\xe8\x89\x02\xb5\xfa\u024c\x16\f\u03den\u00c3[\u0483r\xe8xw5N\u06028\x80\x81\x00\x00)\x9a\x95Wn\xbf\xc4\xc4\u0186\xe2\xae\x1c\x8c\xaeYuZ\xb9\xe2\x9b\xe6\x81\x0e\xc9)hm\x12\xfb\xb7d$s\xce\t6\x85\xe8\xfc\u191a)\x91\xea\xa1\f\xfc\xb3\x85@\x8d\b\x14\xef/\xa5\xdc\xd6^\x17\xe0\xcdn\xbc\x10\x99\x1a\xe4p\xd2\xe6\x06\xb2\xc2^>\xf4\x04;AD(\x98\xf0\xbe\x86CF\u030b^\xe7p\xcf5\x12J\xc1g\x10i\x97U\x1a\x10I\x8a\xcc\xcam\xc5\xee\xaf\xedt\fB\xfd\u007f\xcb\x14|\u0696L\xe5k\xb3\x15\x05\x8a\xbb3\xd2\xf4\xa8W\x94\xce\x11\x0fR\x11\xbdm\xc9\xc7\r\u0436J\x8cb\x10\f\xdd\xfeX\xdc`\xfd\xe5|\xa6\xfd\n\x86Y\x15\xbc\xca`\x86\xa0\b\xd4=\xa2\xcaF\x1b\xa6\xa3Ta\xf4\xd8S@\u0151%\xee\x9dI\xa0(\xe7vT\x01\xa9\xd8>d\x84qLX\xbdA+\x10\x01\xcaXY\xef\u076b\x9a7B\xd2+\xac\x92V\x94\xa4\x87\x02\xa8d\u0285i\xb0:5\x9d\x1f \xad7\x81amP\x90\x1ez[\xc1n\xfc\xc8\xd5\xe0>\x01\x8a\xcevd\xaf(\xfb\xb0\xc8\xd8F\xccS\xa6i\x85\xeac\xb2\x9anr\xa5\u0203\x8ez\u029a\xc4S\x95\xcdq\xbc6h\u00e2\x99\xb8\x9cp\x98\xeb:\xd1\x04[\x83-V\xb1Z\x94\x93\x8a\u0658\xa9,K\xef\x00K\xdb+\u038cl>8^\xd2;D\xe4\xa1\f\x98\xf2\xb0:|r\x95\xebK\x11\xb5\xe9h&\x16\xea\x1c\xe9\x1e\x90\x19\x8f\ag#\xb5\x8d\xbeM\x88\xe9\x86\xee\xb5\x10\xaeW0TL\xa9\xcd;K\xb9\x95\t\xb7\xda\a\xca.C\x0ep\x12\x15\xd7U,\xf9\x1b6\xc1\x1f\x0f\xa7\xec\xc1J\xcf\u050a\xc0\x00\xe0\xde\xc49r\x8a+\xbc\x12\"\xe6\x1dm\xe1\x1d\x8b\xa7\xd5\xc1\x8e6KF\xb5%\xab<\x90x\xfd*\xce\xf2D\xe1\xe8\xb5\xd1FY\x12Vx\xe2\x80\x1dT\xa5_|\a\x8dt\xd0a\xf4\xd0\a\u065e\x86\x183C\x0e\u02dc\xfc}\x97\u01c6=<d4\xcb;\x97\xa5e\xfc;P\x00\x8a>\x18\xa4\xdc\x1c!\xc1\x0e\x12-\\\xd2\x1b\xa0\x83\r9\x1d\x94\xc8\x14$\x8d\x10\n\xf5\x17[\x9b\xeb\xf8\x06\xfa\x14\x11&Mpp=\xb3D\xb8\xd8\"25&` ]\x1f~\x99\xc3<\xfeY\x9e\x898\xe5\xe22\xc0\x06&\x86\v\x84\xb8\x17TZ/G(^\xaf\x8b\xa0\xe1\xd8\xe2\xb8\x1f\xb2\x80\x8fG\v\xa8\x91\xff\xbb]\x9a\xb5\xe2\x98\\\x1c\x0f\x8cw\x1ei\x182x\xad\xac\xcd\xd6\xcf:\x00\u059e\xe1+\xab\xfa\xdf\x15\x04\xd6\xd7\xe2\xa2J\x90\xe6\tw\x10*M\xb8\xbe\xb4\x9171Nt\xc6DF<\x02\n\xb5\u0121U (\x13\n\x13T\xa8\x84\xb8\xf5uA\x91U\xf4UB?\xe0%\x9e\x8d7\xff|\x05\x14\tn\xc7I\xda\xe3\r\x0e\u05af\xc5j=\u051d\x87\x88\xa8\xc8a\xea\xfc\xea\xbep\xea\xd6C\xef\xe9\v\xe9\xa8\u0546b\x88U\xae2^\u048e$\x06\xec\x99\x01k\x11\xaf|\"\xeb\xd5'\xb1\x11\x13(\xb8\xfd\xac\x0fV\x10z\u02b6\xc1\xf1o*&\xb6\xec\xb52\xee\xecW4A/\xd1\f!\xc8H[\xe1[\xb5\x06\xd4\u0537\x8fs\x90\xb9\xfb1\x01\x18\x9cQ\x19\x80\xc3H+\u00e6-}\x05\x80\xe1\x02sP\x06\xd5\v\xd6_\xcf\x17\xd0r\xdeN\x11\xb6B\x8b\x02\xfef\x89}~c\x82\xf87\xb8\xad\xb0&5,\xb4>3\xdb\xeeo\x81*\xceK\xb4%e\xd2q\x17n\xff\x15\xa5\xb2\u0492\x8e\xfb\x03\xc3\xef\x9cj5\xab\xd4\xfa\xe0\xc51B\xff\xf7\xbd\x0e\x10\x90\xd4|Vf\xbb\xa8\xc1\x96}\xa0\xa7:\x9e\x8c\xc4HVF\r\xe3P\xa8\xf7 \\-\xa5J\xd5\u009b\xe5\xc8\xed\x85\u0289\xd3\x11N!R\xab\x01H\xf2\xba\x15\x1fV\xb0\xc8\u0626\x00\x1e\xbf:v7CJ\x1b\x8dS0[\x96*I\x88\x89\xbd\x04V\n\xa1\x83\x98t\xe2\xcc~|\xab\xca\xdf\xf3{H\x81H\xf5\xa7%\xb1\x1a\xd2d\xd8\x03\xb1\xd4\x05:\x02\xb4\tiw\x88\xab\xab\xbc\x84:\xa4\xb21,\x18\x06\xc6\xcf-\x81\xdf#\xec}\u01e8\x83\x9du\r\x87\xb2>\xbc\u0371\x83\xe4\xdd\xf7\x11\x94\x17\xb3\x8f7\xf6\x0e\n\x9e\x15\xde\xe2\x03\x13{A\xae_\x8e\x9ds\x10M\xb1][&&C`*pQ\xfei\x14\xf6X@\u019fM\x1c\x92&A\xc6q\x844\xbb\xc7\xeb\x14\xc8R\xcc/\xbd3\xa0\xb3\x1f\x99i\x93\xa2\xd3\r\u009d\x11I\u034bW\"\xa7\xd5\"\xd5z\xe5\xcdk\u04cc@\xf3\xd4\xf0\u04a1\xae\xf1R\xa6\x956\x10\xffX\xa9\xc2j\x8f\xa4da\xe0\xcf\u03d2A\xcc\xc8D\"K\x1c\xbf\x1e\x16E\xf4NjSU\u01aa\t\x9a8\xe7o\xe5x,\x83i\xd8\x14\x13\a\x1b\xe3,\xa9OI1{\x14T\x9a:\xbc+\xb0\xcd\x15SP\xa7\xceP\x80J\xcf\v\xc0\x12c9\xf8y\xa2\u0783m\xd4_ \xafU\xb68\x87G\x92\xb0\xc2\x1d)Y\fQ\x03\"\xb10\x85\aD\x8d\x06\xc3\xe95.\x13\x8c\xf4\xa8%\xa9\x9fY\xfa+\xf4\xd5\x10\x1e(>\xb9\xf1/-\x19\x8a\x1e'\"\r\xcdK\x8f\xaf\xa4\xc9\t\x91\x97\x8b\x1fm\x82\x9d':\xd7U\x8f\xe9\xa7\x01p\xa6{\x85`\xf2\xeaRM\x18\u007f\xb7\xc1h!\xb8|\x05\x84\x17\"\x1e\b\x1b\x1e\xc8\x04\xc9\xc0\xb8\x12\u2a82X/g\xb8\u007fw\xa42(\\\xe8\xabr\xa1\xea\x98\xf7\nf\xb2F\xc3/\x1d\xb9\x1c\x8a\aY\nQ\xc8^\u025b\xe3 6X\xa9n\xea\xb1L\xe8@A\xc7X\f\x8a\x05Ib{\u02b0E\x8d\xae0@{\xe6\xf3W\x1d\xc8^M\x00\t\xb7\xae\x82\xee\x8aQ \x92\xecw\xd9\r;\x96\x1f%M\xe1\x96\x10!\xfd'\x1c\xf2\xc2L\xbb\x83D\xdb\xd0*\xa9\u0255:K\xd6\x01\xe4XMz\u056b\xf3\x0e}\xc96\x80\x87\x84\xbcD8\xb4\\\xa2R<\"/\x17E\xc21\x00\u1a55\x1a$\xf9\xd16\xd7\xf8gI\x94\xbe\x9b\xbdc\x1d\xf9OB\xb4g\ax\u074dr\xc1\x86v\xc0\f3\r\u0289\\$f\x83\x91\xe2\x1c:lQ<\t\xcf\x00\xebF\x8fW\x11b1\xa6(\x84B\xeb\xdb\x19A\xecl(\x89\x01\x85\xb8\xae\x966w\xf6A\xc0\xd8\xc8\xc5(\u0269\xea5\xf9=\x05\xcb\xe0Q\u01f4\x9c\xfb\x17JN\xc4G\xd0e\x1c1H\u0311\x8eL\xdcF\xcec\x8c\x87790\xf6\x92C\x10\x8eM\xebZ\xcfY\xac\x12\x9cR\xd7\xe5\xe9\xf0\xb8pq\xed\x00Vy\xfdns\xb1\xc3V\x8d\xf5|F\xcd\xfbtI\xd7\xc9N0\xc8\xf9\xb4\xfd\xa6G\u0185\xab@\xd7\xd1s\x81\xc1\xd8H\xc4\xe2\xcf\x0f\x919$\x9d\x8a\xe2\x1c\x01\xe3\x9bb\v\xa2\xd7\x19 \xf2x\xa3g\x9b\u0385\xcf_]\\[\xf0\xb6\x8d\xe8\x06\xfc\x8b\x0e\xf0\aR\x1e\x94\xfa\x1bn\xdaq\x9b\xea\xbb\xf1\x1ea\xa2{\xff\xc1\x83\xd2\v4\xadJ&\x19\xae\xfc\xae\xed\x01\xa4:\xc4\xe6\xc2\t\x0e@U\xfa\xca\xfdL{\xae\xa75CxF\xc7  \x8c7\x96r\xc0\x8d\xf9\x9dh\x86\xf2\xf3N\xf0{\xe9\x9c\u07b09\f\x87\x11\xa2\\>b\x95bH\x17\x82\x01D\xd2v\\P-\x81\r\xb6\x15\uf125\xee\x01\xb6W\xa1\xf6t\xab\x15\f5\x94\n\x15#t\x91%\x8c\xc0\x8e\x12}\xc2\x0e$\xe0\x91\xe5\x10\xdeg{P\x90X\xfd&`F\xa0\xbb\x89\xb3\xba\x84\x1b.\x066\xb49\xa2'\x94'T\x81\u05e1X`\u0434\n\xf2@,\xdf}\x8f\x10\xc3z\xa8&\n\xf1\x9ak8?Z\xac\xf3\xa7\xcf\xc5\x16\xf2R\xf1\x02L\xf3k\x19\x10\xebps\x02]bY\u007f\xf6\xd6\r!\xba3-\x8fT\xaf\xad\r\x13^?\x1f\xba\xb43\u06f4|}\xe0\\\xf9\xefG\u056f&d\xf2\xce\r\xc36\xda.\xf9\xbd\xbe\x00\xf4A\xf5n9\x96lr\xcd\"*L\xeb\x86\xfe\xc7C\x1c)\xa6bf/\f\xd0\xc53\x04\x87\x81\v\x97\x11c\x1f\xa0\xe7 \xa6Uu\xdf\x05\xe5\xae\u051aM\x8fT%\xe4\x9b\xeb\u011b\x90\xc2\xe1'C\xc2\x05\x94\x01\x1bh/\bL\xbf\x83\x88w&\xff0\xea\x14?n\xda*\x95\xee\xa2\\\xd3\xffB\xb2\x12\xf1#\x05u_\t\xa2I\u8665\xc7k|\x82\x19\xd8\xe2\u0672\xc9\xcc\xcd\b\x0f\rL\x0f/t\xe6_\x86&\xbb\xf0\x04$\x1a\x88\x9dq;'\xd4\x05\x8eI\x02h\xe4<\xd0\x18\xa4lrP\xa2\x11:\xd8.\bk\xd1\xf8\xc7>p\x15\xa2^2\xf0\\\x12O\x99\xc6<\x80u\xf8\xd0%\b\x04!\xbe\xcd\x1f\x88\x94J\xd9\xfa2l\x1c\xd7\xf6\xf2\x87F0\"\xc0\xa4\x83\xe8\x90T\x9d\xc4\x15Z\xc9\xd0s\xf9\xfc\x9e\xe9B8Z\xba\x0f)2\x82h\x1b\x19\xb20H\xceFbud\xa7\x89\xa3\x83\v\x88\xf1{\xc4\\M]X\bP\xa8,o\xaae\xbfc]\xa9\x8b\x88\xab\xa2BY\xdeR$\xdeo\xda\f@p\x9c-\xf6\x02\xcf\x0e\a\x81\xaa\xb0\uf23cDg\xe2\x96\xc8<\xd1vPk\xc4T\x8b\xc8\xe1|\xed\x1a\xac\x96\xae\xfd\x0fd\xde\xd8\xd7\x02\x1av\x96\xa7Z|\b\xa8\blGF@\x10ro\xe1p\xb0\x96\f\x94y\xb1\u17a3\r\x02\xf5\xbb\xd6G\x00?6;K\x91\xa8\xa2\u02edN)(^\xcc\x1b\x16\x11!\xc3aE\xba\xdb\n\xe1J\xe2\xc2\x03\ue4ce\x89\x0e>\xa8\x8e0\f\x97\xec\x1f_\x9b\xaa0O[\xce\xe0\xc4\x15\u007f\"\xc7\xd0\a\xffU\xb0.G\xf1:Q\xa4f\U00087098s,J\xbe\xa1\xe2h\x10\xec\xf8\xb0\x88\x96\x84\x84\xa2\xff\x96\xaf\x823S\xcd#\xc4Uw:\u0396\x8a\u070b\xed\xa6\xaf\x9cD\xe38\xf3YU\xc8\xd1O\xc2\xe00H\u964ep|\x99\b\x17TK\xf4v\xa3\xb4\x88]X\xa0\x9e\xaf\x89&U\x85\xeb\nK\x91a\u0314\x84\x1b\xaa'LD}\x89\xc6\xe8\xf5\xc3\x10k/\x16\xaa\x9b\xbd\xa2+$\u0395\vV\x1c\xa8dW\x1e\x9d\u03a2REk~\x85{\v\xb9\x02\xc8\"G\x9a\x19 Y\xdb\n<Q\x8e% \xfa\x9a\x8e\u079a}-K\x97n\x9b\x8b\x9b\x1f\xf9I\xedA\x83\xe5N\xf4c1{\xa5\x14\xbe\xa2\x04\"'\x10\x92\xa5$pR\xa5\x1e\x801\x01\"\x14+\x18\x16G\xd2'\x1e$\xf6C\xda>\xac*y\x15\f\u007f\xacy^\x88}\xf8N\x82\x17D\xe8\x00\xe3N\x8a\xfe\x05\x14S\xb9\xceY\x8el\xa4\xf7\x11;c>0f\xda\xea\xbd2\x95\xb2\xb05:\xb1\xfffQ\xeft\x9d\x06\x99\x821\x97\x8c!\u05f3x&\x04\xe3\xf9JH\x1cs\xc7g\x18\xc32!X\x0f\x1a\x90\xe3\xcfu\x94\x00\x92\xa0\xd0A\u0475\xf9\x97\u0699L\xc0`\x89)\x8a(\x9bB\u007f\x91\u05cax\xd3o\xe9Q\x93\xe5x\xe8\xa4;\xde\x0fOhTag\xa4\xba\x94EH\xf5\xdfO\x12\x17Q\x03\xec\t\x11\x0f\xd5{\xac\x00\xc2\xc8<&&Ruh\xf4\xe4X\x82\xf9\x1e\x8a\x9fqf\xfa-\xd2\x16\x8cF\xbd\xfe\x1a\xfb\x9f\xeb\u06ad\x01J\\}\x9b\x9d\xdcR\x84_\xcb\u0482\x9eg\x12\x18\x9a\xaf\x16\xc5\xcbH\xbc\x17\x9d4>\x0f\xf3\xad\xb6%\x9a\x80\xe3\xee\x16\x86>m\x02\x05\x00ae\x930\x06\x800\u0684\xa5I4\u007f\xfd\xddi\xdci\xd6UW\xb4;\x17\xc8;\\A\xda\xf1i\u02cfDNkD\u03d3O\xe8\u07c7M'&#]\xb9\"\x86\xb6\r\xe2l%\xbc\x10\x83^\t\xcc\xe9_5\xb8\xee8\xab\xb0\xb0\xf4!\x95\"\xb44,ufn;\x8a\xaf\xc52\u0329\xb6\x83\u06c2\xec?'\xc6\xf7|oA\xffj\x02>\u068ey6)\x87\x13\x1aEG\x8d\xc2\xff\v\xaf\xc0\xc6\x06\xed\xbd[\xee\xf0!\xd1\xf8p\xcc\xd2*\x8f\xdf\xd5`\x83b\xeb\xf0\x94\xf1\t\xd5B\xe9\x97\xf9\n\x94\x17`sy\x82\x97\xc8\xe9\x8b\x04\u050bA\x8at\x86\xd6*Zc\x9a\x81\xb6=3\u0228\xd6F\xac\x04'#\u01c3\u0539r\xe6\xf9\x9f\xf3\x86\n\x8b\xe8@l\x12\xe5e\x06\x98\x81\x9f\xd9\xc6\vNL\x06\xff\xa4\x03Rr\x00\x1c\xea\xff0\xc7\x04b8\x83\x116,\x9f\x83\x8c\xa8-\v\x13\x98\xd1~\xdd\x15\u0363\x9ct\xc7RP\xfd\x1d\xae#g<\xc5\xd0\xf9\x82\xf5\x80\xcd\u0733#\x06\\k2\xf7>\x19\x86\xbb'^\xd8s\xf1\x05\xaf/J\u0632g\xa1\xf8P\x19\xf4YD@\xf4Ku\x89]\x84SnB\xc9e\t\u063d\xb8\x85\xe7Dd\xcf\xe8y,\xd4y\u00f5\xc6\"\b/\x1c@E\xe0\u0526\xc1\x831\x02\x02\xc1ul~\xd81\xf7\xd1\xd6'\xf5p\xcf\xe2\x17>\xe2\xe1\x83\xe5{\xa8\xcd\xf3U\x1a\xef*\xe7\u0270\x19\x06\x17\xd5\u03a3\xaf\x99\xcb1b2\xea\u0309\xee\x0e\u062a*sf\u0589\xb0\a[\xcc,\xc6\x16\xcfI\x1a\xe7\xd1\x19\xf8\xe5]\xb5&i\xd2\x1bqVT\x93\x89\xaf\xca8\xd7jY\x8d\x8d\"\\\x14\xd04b\x8c\"'\xff\xa0\x8f\xa6\x94\xfa\xfee\xf4S90\xbej\x1e\x8c\x15\x8e\x1d\u01d6\x9006\x19\xca8\x81\xeb\xf5L\xbe\x87\xf3A\x83\x9dB4\xd7x\xe9\xc1\x85\xf0\x89\x9e\x80\xc7a.a\xab\x8a\xc5\xca\xc7 \xfd\x9fw\xe5e\xdd@\xd5\x1b\x00\x03\x15xY\x16j\u02aa\x95j6\u95b4\x8c\x93T\x87\x1a\x10\x16lV\x83b\x12\u0726@7\x19\x14\rv\xcbj\x99\xccY\r\xbb/\xfcT\xa8\xeei*\x14\x82\xc6\xe9\xe67 Ilte\xb5z<q1d\xe5)\xd0F\x10\x98\x16\tN\u02b6\xc8<\x04\xbf\x18\x14\xba\x13K6\xba\xe8\u0384{g\xb3*\x95\xc8\xdb>\xe4\b&\x05\xcc%\b]?a\xbbe!P\ay\u1959F\x00F\x96\xa7eYQcH\x99~\x8aC\x83\xd5w\x99\xe92\x03|\xd5\n{\u03b4\x90\xbf\xfc\xfc\x9e\x1c\x89\xf8\x9c0S\xed\x18\xb2t\xe6\u04d2\xc4\xf0~_\f\xda\x1b\x8c\xc4\x1a\x00\x0e\xc8I\xba\x81\xca\x1e\xf1\x01\xc1\xc7\x13;bC\xb2br\xb6:\u032d\xfc$7))\xb5\xe5+\xebG`\x13\noo\x13@b\U000c1e0b\xd5\xf3\x1b\xb1'\x1f\x82(\x89\xaa\x04L\xc4_\u07c8\x1f\xc2\u01b5I\xd5{Ra\x82\xbbT\x9b\xb4\xa7\x95\x00'R\xc1\x156n\x8f\x0e4d\x9b\xbd\x9a\xb4\xe8\xea/'\xfd\u0087\xd4\x17\xe0\xac\xe3\x15F]@\x89\x975\xf1B\x84\x92\x17#\x03\xda5\x1f\xe2\ub91d\xb4&\xee\xc5\u01d8\xe5\aM\x0e\xf0>\x98,GK\x9c\xad\x84\x82Pdtv\xb6\xdbR\xe5I\xd1f$z\xa5\xe8<\xfe9\x84\xe4\xf7\x91\xe3\xc0\xf8\xd5kH\x04F\x80X\x18\x00<\u03f3\x1e\xda\x0fw@\xdb4Pz\x19\x8fG\xe1T\x86'9\xc0\x86\xb3\x82\xd6Rj\x9dW\xb1\xcf\x13: \xee1\xc7^{\x9f'&\x9e\u03e1u\xf2`$\xbb:t\xc4\x06\x949P\xe5A\x8f\xad\x9c?qm\x16@\x89\n3\x93I_\xb91\xe8\xc4`=_\x04\x98\xe4\xc0U\xa6Jl\b\x8fN:\xf8\x01C\xedk\xac\x9f\xe6\xab\xdcI\x04g\xd8'6\xee:\x00A\x1a\xc1;2\x87\x12\xee\xaeRP\xc3X\x9dg\xa2\xd2\x10v\x82R\xfa\xec\u0370\x9a\xa8\x01W\"\xf6\xfe\xc14\xd4\xdd$\xeb\xe5]C:'\f\x844\xbf\u032b1f!4Rm\x93<\x85u{\x10X\x8b\"\xbd\x1e\u00aba\x8e\x11_$\x9aI\xc1\x01\x1aO\x9f2\xc0\xd2E\x1a@\x1bF\xb8\xd0;x\x9b\x1c\x8e\xf9\xffu\xd9]\xcc@\a\xbd\xe4\xb6B\xad3\x0e\xb3\x92/3A\xb1\xfd\x14\x1c'C\xf4/\xb0\x9e\x17G\x12\xe2\x13\u0231\x05\x98`\x8d\f\x0f\x1ffv\x04L\x06\xee\x1cNa0U\xdc\u01e5\xbb\x83\u05cb\u00ac9^\x15V\xda\x16#\xab\x18Ibg\x16\xc0(L\xd1M\xd7\xe6t\xea\"T\x90\xac\xb6\xcap\u0410\x19\xdb\a+\x87\u07d7~\xe5yT\x01z\xacF\x1e\xdbr\xc6\x028\x16I\x115h6\x0f7\xffL\xe3\xf6,\xbey\xb3\xab&x=\x96!%\x99\x83\t\xee\xef-b\x89b\x94z\x82j\u007f\xed?f\x828\vl\x04\x01\xc6L~\xb8\x16\xde\xcd7\u066cbJ\xaat\a\\\xe9\xf4>\x82\xba\xb6u\x15\x98\x19\xd4\xc6vA\xde\xde9U\xb1\xfef\xd5\xd4\\\xabkgQd\xf3\aITX[\f\n \"\xb8\x17\xc6k\x9d\\\n\x85]}\xce\xc0\u04c5\xb9\xb8{y\x9f`\xa3\xd4\x0e\xa94C\xccL\x17\x90\u03b2OZP\x13\x01\xee\x03\x988\u0766s\xcd\xe9\xe2\u034e\xe1\xb1KL-\x97d\xb5~e\x035\xb1\x8a\x92\x87\x91\xa2\tz\x8d\x18{\x98`\x17\\\u02b0/\x90\u0396\xf1\x19\xd7\xeeT\u007f\xeb\xe3\xeeP\u0612Kd\xad\x99\xa5GtLy\xe9\x13\x14\x81\xe5\xe2\xca\x14TR\x81\xfeT.\x04\xcb\xc2jH\b\x89n\xeb\x0e\xf9\x8cH\x12E\xfc\u03f0q\x15\xff/J\x05\xf2'\x83Db\u0782\xf2UNEK\x8d>E\x99Jh\xd3\xf2\b\x97*\xec\x1b\xca|\xff\xd3\x122,N\xcf\xf2\t\xf39\x19PQ}\x9a\xd1M|Y`\x00E\xb1R\xe1#-\x95\x00 \xbe\xee\xf2#\x83vN\x93\x9fN#P\xb4O\xc2^\x94=i%t\xdd\xefh\x93\xbdn\x81\x80\xb9[\\\x91n/@\xb9\b\u070b\x1a\x95\u064a/\x9c\xcaN\x84\x94\xb2B\xad\xc9p\xa5<\u02969i\xbbw\x11;w\x89\x85\x1c\x9d\x1d\x8d\x15\xf0\x10\x87\xcc\u007f\xb7\x91\x87^\xdb\xfa\xfe%\xf0\u0105\xb4\xde>\xccT\x97\xf1\x1d*\xb7%\xb4\x8a\x8a\u07b3\x92&\xfd\x03\xfa-b\xe2\xa4\x0e\xb0\x87\xac[\x9e\xb5!\bc\x16\xd8xi\x107K7\b\xd4u!\x84.a4\xd8S\xc9\xc0\x82\x197\x90Cu\xe3\x99\xf2\xdcI\x04\xbb\xf3B\b\xb0D]\x14J\xb0\xee\"\xa7\x1c\xd1-|\x01\v\x1c)\xfa)l/\xe4\xff\xc3=n\x803\xfb\xe8Go\xf5\u03f9Yd~ \xd4\xf1(2IB\xb9\a{\x80~o<,\x14\xe63\xb7\t\xa3g\x0f\xa5\nd)\xf1\xf6\xf5\xff\x11\xe1B\x9f/\b\xab\xe7\xa2\x10\x82K\x17\xc8R\x8f\n\x19\xb6\xe8,\xdb1\x05\xa5\x989\xc7\u7f37\xecB\xd5?\xc2\xd7\xd8y\x8e\xa96n\xf3\xa0\u007f~n\x88\"\xad\u0185J0_\x1a\xa2v\xc7 \xe8\xcf\xca*\xbe(\xe54\xe2\xec\xc5Xe|x\u0588\n\tWF\xe0S\bke\xa1c\x06B\x8f\xf7\u49e0\u01e5\x01\x99\x81\xd8\x1bb\x04Y\x8ad\x0e\x02U`o\u058cG\x8b\x12\a\xbe\"\v\x02\x8f\x89)\xc8\xf8\xbe\x89\xb4.]\x01\xaa\x97.v\x8a/\x95\xcf\x11a\x83\x91\xa6NM\x98\xf0 \x97\u0732X\nj\x8e\xdb\"_r\xece\n\xef&.\x05\xf4\x12\xf4\xf3\xf4Q\xd4*\x80&\xfaS(\x17\xb4\x9f\xdeu *\xeaG\x12$H\xb9Y/\xda\\\xbd\x12\xe4*yrH\xaf\x01\xd4\rS\xef\xf6'(\x16\ucaaeE\xb5\xe1\x8dI\xee\xcbVN!\xc9[\vf\xe4s;\xcc\x0f)\x06r(.\xb2#\x86\x89D\xff\x99\xd5~\xb7~\xa4\xa2\x01V\x1eh\x10h\xb2E\xc8\x00\xa4\xd5\xdf\f\xb8%\x8c\x066\xe1\x94_\x97\xece\xb7c;\xcfT)t\x9a\xc8\xf0\xb1\x05\x94\xc8A\xa3\xee\xde]S\xcc3\xbe\xbd]\xeb\xd5\x0e}]@\xd1\xff\x83\xff\xd8\xf2\x85 \x9a.Qm\xc0\xf0\xa0\x04W\x8e\xcf\x03U\xb0 \x87\fF\xe4n\x82]R\x84\xc4\xc2\xf87\x89\x00\xfbJ\xf2Pq\x88\u05a9b\xa4\x9e\u027bAx#\xf6\xd8\xe3::,\xd5\b<\x021\xec\x04\xad\x18\xae\xa2\xa84\xc2~\x94\x9b,2\x92\xaer\xe8\xd6\xc0\x1e\xad\xeb\x19\x0e>\xce3\v\x01\xf3\t\x03S\x89\xc2\x06Z\x11\u02c5v\xb0w\xf4\xcf5u\xec3\xe9g\x13\xb7%\"\xe4\xf3\xdc\xc8\xfd\x0e\x1am\x18\xb8\xe6\xbaT=*\xb9\x12E\xa9r3e\x05l\xcdw+\x1f\"^*\x06e'u\xbd\x8e\x98\xb6\xe5!u\xe5\xc8\bDA2\xa8m\x18|\xd6jO\x8a\vf\xca{\x91\xeb\x9e\x1e6VX*XNX\u0130\x9b\xaf^\twa\\\xa2\xae\rj\xca\x19\xbb:\x99\n\x14\xfe,\xfc\x80p\xc6\x1a\x89z}\x84\xfa`v\xed*\xb7am<\x9b\xd8\xcb2(\xf7\xdb'\xa1$cv\x8d\x13\xf1<\x9b\x94\x15\x19\xd3\xe6\xc7e\xab\x88r\xb1\x9b\xffXM\xc7G4\x94\xea\x06\xb1\v\x12$\x8d\x8baE\x930\xbb<s\x96\u0284\xb0\x8ay\"\x15}\u22b0ta5\x16`\x83\x86t\x98$;\xb3\xd9D\x16K\xc1\x02d\x11\x80\xc6W\xde\t\xaa\rn\xf4\xf0 \xba\x1c^\x81\a\u0374\xf6\x89S\u02bb\xb5\x90\x14\x04\xb4R\xfc\xf9\xb6\x1d\x9d\xfbF\xbb\u0797]\x8e\x00gp\xf1\"~#\xee\tw\xd0%\xef\xcc\x0f\xf4\x1e\x1f<\xd6E\xf5\xbb\x1b0\xd3s\x87\x9d\xf9\xe2\xa3:N\xb0q\xd4^\xed\x9a\\\x00\x1a\x814-\xd0Z\xb4E\xf2|\x12\xdfq\xd0j\x1cPA_(\xa9\xaa\xfc\a\u00f6q\xb9\xca\u05a1C\xd4\x01\xf7\xafn\u012fWY;B\xc5\xd5_|\x1c\x80X\xa8m\xf8\u0711\x90 \u0637P\x00o\xfc\u011b<\u022d\xab\xf9\xa1;B\xbb\x9bd\x8e\xa6\xb2u\x0e\x85\v$\r\xf5\x15\xfe\u0345o,q\x97\x82\x82\xb3h\x87\x97\v@v\x85\xe64\x0e.\x86U\x8b/\xd8V\xb9\xd4\xf3\x0e\xf9\xc5_\x03\xb9}B\xb1\xcb\xd7\xd82\xbe\xbcQi\xa3\t\xbf`^Dv\x8bh\xd7e\xe3.l\xbbp*\xd9C\xcb\x04\xe9I\xba\xa1\xe4Zy]ng\xea\xf5\xcdI\xe17\x05\xfaa\x9e\f*ep\x82\xda\u00ae\xe9\xe9,\x02\xac\x98\xc7C\xa4\x8f\u0463\n\u06e81u2\xa5\n\xbb\x8a\x9c\x13RP\xe4.pe\xb8p\xde,\xd5o\x94\x18\xce\xf4\x91\x95\x94\a\xd4Jp\x89b\x18\x80\xe3\xf6:5@\xd8d\x12\xfb\x95{\x95\x05\xf3\x8b\xe9\x15\x12K\xdaJp\x94u\xa5\f\xb4\x96Vj,\r\xa4\x8b\x05\xac4HrM\xea\x98\x0e\xe0h\xaa\v\xfa\\\xd41\xb4L$3#m^\xf9\bb\x05\x8a\xa0\xa2&\xaa\x1b\xac\x91\xb9C\x86\x04\r\x88\x11~\x90D\x92-D\x80W\xca\xc8\xd5Az\xcf\x17Y\xc55!\x0e\xa24\x9aR\x83\xdc\b\x9e/\xed\xd3/T\xf8^G&\x03\xc3I1\x9a\xd3\xdb(\x15]0\x8a\xd7L\xc9E\x9aN\x8fF\xc9c\xa82Q\xf3\x83\xc3>jN\xfb\xb9\x92\xd0\nIL\u9432Z\x91!a1ka\x15\xaf\x91n\xb1\x9e\x1d\"\xccfk\x91\xd1\u007f\xf6\xa2\xa0\u0629\x84\xbd#\xbf\xfe\xc4\xceK]\x14\xd2\xeaX\xc7\xf1E\xc8,\x93\x97\xbc\xefG\x8b\xd4oiN\x02\x06t\f\xe0\x14X&\xa0@\x88\x8b|GXh\xda\xc1P\x83\xe15\x02|1\xcaZ\xf9\\\x8a&\x06~\x0e\x12\b\x9f\x04k\nV\x10\xfb\xff\xccX\x84w\x84*\x84\xe9\x04_\x05~\x03\x97\xbdF\x9e\x84\x02\x01\x81\xc5,\x95\xf4:0\xaau\xd8\xd2@\xa4\x03\xbc\n(x?\xfd\x00/\x80Bi'\xba\x90\x18\x01\xa5\xb8t\xa5=\xe3\x06\x8e\xd3h\x02\xe8\x0e\x84s!0\x02\x90q\u3b23\x8a\xf9\xfec\xf3\xa1_\x91O\xfcU\x9f\xb1\xd8UF\x01\xfc\x81C\xfa\xd8H\bc3\xfb\u007f\xcb\xfe\x9f\xf1\xbc?\xf2=\xe2<\x1a\x1e\x0e\xbe\x18z\xf5\xeeX8\xf69^V^\xd6\xfa\x15\xf6\x11\u0607h\xba\xbe\xec+\xa7\xbe\x93\x81\x8b\xa8y\xed\xcc\x14|\x806!\xb2\vP\x82\x94\xa4x\u0202\x19\xe0\x11H\b\t\x9d\xe2\x95\x04=\x9d\xc0\xa0hT\x15\xdbDQhA\xf9M\x8e\xa1G\x12\xd5?)Y+;\x88\x81\x0e,?\xb4+\xc7$\x93\xa1\x95\xb1\xa7\x0f4B'F\xb3\xd0\xc1\xd0vt\n\x81\x90\xd7b\xbcC\x04>\xf1\x0fD\xfd\xc9Z\xb3a\t\xbb\x81\xa0\x97ndk&b+\x1b\xfbq\x99\x93\xb8u\x0e\ucd48\\\xe8\xe9T\x8bH\x9f\xdf\xfe\xed\xfff2\xf19\x8c\xba\x9f\x85\u040930\x88N0r\xd9j\xf0U\xa9\xaf\xf5\x941\x1c\xf0G\x1c\xb0\x1d\xf9%_X\x19\xf5\xb2\xb9\xf3\xe6d\xdex|\x8d=9a\x8b\x83l]x\x9a\x80n\xe4\xed\x8d\xfa\xf2\x82P\xbc6\x92\xc8\x0f^|sE\x91\xb05\x85q\u25fe\xe0\xc0\xcdm}\xb3\x93*\xe2\xf9\x98\xa2\xf9\xed\xcby\xa6\x9f\xd4&\xd7\x15\x0fo\xc5w\x18[H\x95\xa1\x85\xe0\x8fr\x85+\u0540\x8b\xb7Q~\xa0q\xce\nL9>\xbbh\n\xf4\x9d\x13;\xc7\aJ\u0710\xbc\xf5\xb5P]\x19\x13r\xc0\xde\u00e9\xb9\x15h[\xa2\xad\x05\xf8\"#^D(jJ\xe0\x9dX\x9c\u04ec\xb8*\x1e\u028dT\r\x8d\x95\u069c\xfe\x962Z\xa9I\xd1i\x9b\xdd\x1d\xbaSs\xa6\u05a3(\u0253\xf1\x9d\xae;q\x14c\xdc@\x94\"Z\x01\x96df\x8c\x1dM\x04\xea\f3\x03n\u008dI\xb7N\x87\xfa\u009a$\u0561~`\xc8\f\x83~\x9e\x1f\x9a\xbf\x85\x17\xf4\x87*\u014d\xb6\xe0\xa9j]Z\xd7\xd69\xc1\x1b3\x06\xf1~9I\xcd\xd0PF\x88>\xf8Qx9x\xfc\xf1\x04\xe9\xd9\f,\xd5\u0412\xe0npV\xa2%\x05\xab\xf9\x8b\rA\xcaP#\x96`*\xe3\x8ax\x89gE\xdcnz\xf2aO\x85\x89d\x8a><:\u06d4\x04\xd2 e\xfe\xddN:\x85\x05cL\x862\x00`D\xd3\u01d0N\xfe\x06\x99u\x8duE\xae(\b\f!>\x82 >\x96A\xeeQ\xa2\x11r4:1\xd0-\xc4X\xedA\xe07\xbe\x9bF&L\x8a\x88a\xa3\xc1\xa4{\x03\xb2\u0216P;J\xfe\xea\x84\xd7N\xae\x9e\x82\x8e\x95\xc4\xed\u008e\xd5l=\x0f\x87\x01\x99=\x98\xb7s\x905)\x84\x8d\x9c\xd1\u0695\aeB^\xb1\x0e\xbc\xd6\xef\x01,D\x91\xf98\xa1J#\x9bV\bT]\xc6vB\xe32d\xb6\xce$\x12DH\x84\x18tmj\x8cS5\x01\xc0\x14\xa0\xd2*\x89\u0465\x14\xc6\\\x8f8\x01\x80\x00\x0e6\v\x04\xa6\xb2\xd9}\xcc\xf4\u02b1=\xdeX\xb0\xa9\x97\x8ayMI\x18\xe1\xad(t\x80U7s\xc6)\xadGc\x86\x98\xe1;\xecL\vP\x9cM\x9aqT\xe4V\xaa\u01dc\xa1\xad\x06\u052e*E\x02\xb2\"Ua\xccc\x15S\x80\xb8\xe6df\xb5\xcaAb\u007f#\xe2]\xc6y\u2c9a\xe8L\x87rQ\xdd<QbA\xee\ua3b4\x9a\xf3\x9b\xc6\x18\x9eU\xf4\xa4,\xa2\xf7mG\u07b1<\u0640\u0337\xaa\x98\xca\xcb\xec<\xe6!\xac\xb5\x81L;\xd0V]0`m\xce\xd5Z\xdcn\xc0y\xe3\xc0\xf9\xefxj\xd0p\x86\xcc\x14\xd5W\xd6\v\xe5\nr\x12$\x14\xce\x00\xca5S\"\x83e\xbb$?z%7\xbcm\x8f\xdfi\u007f`\xe4\xd9t~Z\xae\u0518u\xe6^\xc5[\xda\x01\xe1\x9a\x1b\xe0^\xe8\x90.cH\x16\xc2?\x1b\x18\x1c\n\x8e\xaa\x11\xae?p\x06~s\x99\xf6\x888,\xcd#\x95\xe7\x81$\xe67Xp\u07be\xf7\xacn(\xab+\xb0M#\xec\x03\xe1\x1a\xbc\ao?D\x8aw\xae\xf7}\xda\xd2(\xb0%p\xe6\x9cR\x81\x83)^\xc4um*\xda7\u02a0\x83\xff\x9f\u0458\x85\xabF\xc2,.\xbaj\xff\x0f\u05d4LD!\xa5\b*\xf8\x9f\x1c\xb6\xa8\xf8l\x05\x8b\xfc\xb4\xfb\x8b\a\xa5\xd0\u0201W\x0e\xb2\x83\xf3d\"|d\x88\xc4;\xa3\xe0\xa3\x01\x8d\xed_\x19w\x04I3\xa6g\x84\xe6t\x1e.}\xeai#\xec^\x94b\xa76\xe7E\x1d\xd7a\x13T \xbe[\x88\x90\xe1j\"\xc9\xd8M\x8c\f\xc7\xf2\xe8p\x98\xd4L\xcanHx\xec\f\xcf\ab\xbd\x83\x15\xe6\u02e8\u01a2\x1d\xa5\x1a\"\x04T\t\xc2\xf5\xfaR\xc8\u00d9)E\xf8\x02\x1a-\xe0\\Vw6\x93\x01@\xc75\xd1<\xf9S\xb5[\x0f\xcf\x0e\xf2\x06g\xc3\xe8,\xda\xd9\xdd\xf13J6\a\xb9zJ\xcci\x02\x8a8\xee\xceR\v\xd3a27Y\xf2\u02b8\xf49\xbb\xba\xe0\x94\xcc+\xd6\xeb\xf2\xbd\x1f\x1br\u0197\u062d\xc1\x98\xcf)%\xbf_{UK\x06\x8f,H\x03\x97Pj\x180Y\xe6\x17\xa5\x1b8\a{C\xfd\xa9=ZPzC\xacri\xd5)9\x84{\xd0\xe7\xde6]L\v\xfa\x9a4\x041\x04\x06\xdbZ(\x1a\xd44\x8c\xbe\xfa\xbfA\x8d\xc7\x13\u0439\x18/:\x14-\xd8\xfc\x90\x981\f\x03\xf7R\xbf\x02\xb1\xb63\x9a\xd2\xd9s \x8dN& #s\xe4\xc1\xd3uIuf\x80_x\x0e$L\x1a\"X\xf2\xf8#\xcc\xe5\xee\u0186X\xf3\x90.L\x8b8<p\b.j`:\xf3\x11=\x16j\xc6\xfb\xc3\xee_S\xc1\xfb\xa3_0\xcb\xd4\xf4\xd5\a\\\xaa $\x15f(\x89\xbe\x89\xa5\xf7\x1eP\xac\x8c\xe3\xea>a\xb3@\xd4J\xd3\x1a\x9e\rH\xa2p\xf2\x83\b\x85\x14\xe0\xde\xe2\x89n:\\\xc1\xc6\x11\xa2\xb0\xc1\xb6\x04s\xb7\xc8p\xd7#\x86\x06\x97\x9e\x13\xa5_\xee0\xed\x82\xc0&4 \xc1\xa0\x1c\xa6\xb6\x89\x1b\xf0\xdaD5\u061dN\xad\fx\xb5\xe1\xf0\xbb\xb0\xc5\x1a\xaa\xee'\xe5\xa9\x1dS\xd10\x98\\%\x19\x90G\xab!\n\xad\x89\xe1\x1by\xe5HJ\x97\x00\x9c\x8c\xba\xd7\xde\u06d0\x93N\xbf3iC\xd3\xd96)q\xc0\x1d\xc2I\xc8\xd2o\xfa\x0e\x80\xee\xd5*\xb1X\x02\x00\x04\xc0\xc1\xb8\xe4\x02CY\x91q\xd9S\x96\x19\xb4b\xf4\xde\u67c3V(d\x04Y\xcd\v\xdb*4\x8a1\xe0\b\xe1\xc1\x03E\x16\xd22-\xc0\x1f<\xa3\f^\x9c\x94\xc7\xed\u0155Q\xf07@\xa6\xb6\b+\xd2p;\xe6T\x80\x9c\xd0\u1c9cz\xa7\x9e\xaf\x86\x9eYu\x1a\xaa\xa7U\u015a\x82+C\u0086\x00\x02T\xa2\x05\r\x99S\x1d\x9f}%\x94\xa1\x12\x19\xf0\xbc\xf3\x18\xe2\x00H\x985\xfe`\xe1H'\xd1\xee\xf6c\x99\r\xd1`\x15a\xa8\x8b\x84Rg\x13\xcb\xde\x1f/p\f\u02dc$\xe2l\u061ft\xd2!\xc7F\\\x9d\x1c`|\xb9\xb3\x06\xfcD77\x16\xc7i6k\xf3\x84%1\u7323\x04T\xd0\xfd\xb8\xc8\xe8\x1f\xf1F\u06d0\xb9%~\xbd\x13\xdb{\x98\x91\xac\xa3\x02=\xe0\xa8\u00ba&\x91\xa3L\xe4N\xa7;\x05V(\x9c\x9c\xbei~\x87\f\xac\xaa]\r\x90C\xd5\x1c*U\x8f\x9ad\x99\xd7\u00c2U\xa3[\xc0\xe2\xa8Q\x89\u6514U/\x05\xdbd\x0e\x11\u0626\f?\u07e1\x05$\xa3\f\x14\x0f\x97\xe0p\xb2\t\xb7\x1a\xa0\x9e\xfaq\xa0ucFw\x04\xb8\xa1gf\xb2VO\x13\xf6ofc\x01\xdeA\x90\u02d0\xcbc\xf259%\xcdT\u06ae\x1a\xaa\xe6\x81v\xcf\xf5\x05F\x003\x92\xc6\x13\x1dn\f\xd9.\xe2\x83w\xfc\xda2;\xe0>\x93\b\xf3y\x94+\xaf\xc4\xd86X\xa8S3\xbd\x0e\xc4|\xef\xdd\xfa\x1d\xa9\xed\x90d\xa3\xba\x83\x80\xa3_\u0211N>\xc40\x89/\xaap\xd28\xc8\x1f\xee\f?\xee$\x05\x02\r\xaa\xc8\x02W7\xbee\xa8\ue942=xX3\xdd\u01f84\xc5\x0f\xbdn\x87\xe2\xe2n\f\x04\xe8\\\xad\xa2U\x86\u00e8\x94\xcb[\xe1:+\xc7\"R\x03\x13\xbfD\x9d)\xec\"M\xb1U[y\xa9\xa7\xce\x12e\x9e\x83\xdbu<\x8f\x1b\\\xc2p\x80\x9b\x90e\x97CV=\xa5\u007fN\xf2\xfc\xad\x1a\x0e\x9b\x90\xfeB\x1d\xd8!\x1dY\x11~\xc0\xfd;[68\x97\xda%c\x80a\t+\x1cT\xcaQ\xf3h\u0512\xeeE\x9a?M\xe35\x1c\xf1\x97\xeb\x16D\x91\xdc\x1b\x81\x92\xf1\u007f\x11\x1e2\xaa\x9b\x1f\x8d\x14\x1bP(\xecdp\xf81\x94{YR\xd1\x02\x83>\f\x12g\xfd\xb2\xd40Z\xe8\xff\xa7\x1e\x8f\x037B\x13\x06\tB\xbc\u01a8\x00\uc8e0\n\xb58\x00i\xa9\xbe\x1a\xfc\x8a\xd7\u04b1m\xe5x\xad\x1b$~\x81L \x10=pY\xcf\xd3^lp\xcct\xf0\x1e\v\xa8\x8d}^\xec\\X;\xa0\xa3zD\xde\xe5\xe7\xeb\xac\xcd\xf1c\x86'>$V\x91Y\xe3f\xbb\x9e\x81\xe0\xb4\xfaM\x17\xa9\x9c\xff\xd9S\x1fH#\xbf\xd6#7\x96Q\x85\xe5\x82\x0f\xff\x82D\xc3\xe0\xc8D\x0fQ\x06\xbe)\x06\xc3\u00f8\x1f'^\xa2S\x84\xbblS>X\xf7\xee\x83\x18\xb2\x81\xe71HG\uf260\xd5\xd0opm\xe9O\x05G\xf8R\xe4\x116\x97sf\x92?\xf9v\xe1\xcf\ft\x114:\xf2\aP\x120!Re\x88\xc6M\xe4\xd7\xd8\"\b\xb5I\x86\x90\x88\xf0\xa3\x17\xcf#;@0\xe9\x946\xd86\u0521\x02\x861#O\x103*\"k\x19\xa4{\xb0\x91\x1a\x92`\xa0O^\xfcg\xe7\xe3\u0209\xed,\x04$\x87\x1c\x8dE\xa2A\a\xd7u\xeec\xa4\xe7\xe3\x9eA\xf2[t&v\x94F\xc1\xaaA1]\a\xe7\xd0A\x1cx \x1b\xadz\xc0^\u0555\x82\x0623ym\x16f\xac=\x1ce(5\x91A\x92\x87fBFv^^\x8a\r\xd5\xe8#\x95(+&\xae?\xb4\x1b\r*\xe1\xa8I\xc2Bx*\x16\x84\x11\xe0l\x80Ld\n\xbc\x19\xea\x1ebj\xa2\xddP\x0e\xa7|\xbb\x95![\x96\x85\xf4\xae\u0371\xaa\xd2E\xb2\xc2\xda)xeAF+\xbc\x06\x84\x16\xb9\x1aP\xc3TQ\x13lk1\x86\xe3\x8a\xcc\xd7\xd3\bb:\v<\xda\xd0O\xf0:\xfc\x87\xb4'\xf0\xf4\x04\xdc\x18T\xe4\xf9\x00\xb8\xb9\xe1\xf3|\x18#\xf7\x9d\x00n\v3\x95\xb7\xa5\x9a\xfbP\xc0Jw\x9b\xd5\u02fd\x85\xaa\xcb4/\xfc\x85;JI\xa3\xa2\xe6\xf2f\x8e\x87\a|6`\xab\b\xb3u\xb2\xc41\xdda\xc6\x130\x1e\r\xb9\xf3.y\xa7=\xe9\xaa[6\xc3\x1d\x15!\u05fcS,\x02\xf8\xe29\xea\xe0/\xb7\xe8\xec~\x907\x13<\x86\x80\xb7D\xc8\u02c7\xfe\xaa\xbf*\xab\u0671U\xeb\xb0\xea\u0522N\x03\x85`\xbc\a\xbd\xacg-5o\x14\xa1\xdc/\xce\xd2A\xbeRn\x0eE\xff\xad,\xc9\x00%\xfcb\xe7=t\xe7\x9ak\t\x16\x1a\xf0\x0f\xceG\u5342:\xe2\x1a|7\x04\"0\x84\x0e\xb6@\xaa\x83\u007f\x19\xc2+> \u06d8\x92B\xd8\\T\xfeoB\x85\xc8g\xdcqK,\xef\xb4H\f\xeaK\x06\x01\xb5\x03\x1d&<\u0305\"\x9ah7\x85u\x8c\xa6\x02Q\xe9'\xe1\xe8/\x16\x13\xae\x1b\xd64\xd7\xd2=Bg\xcf5\x89g7\u054b\xb0Am\x1d*o\xcf\u0677\xd6W\xaf\xec\x96C\x8e\x91\xa8\x18\xc8)\xb4\xf1\x11\x92l\x1e\x84\xfe\x03\x8a4\x1c\xa2\x12~\x95\x88\x8b:\xd8$\x80\xb5z\xe6\xa9J\xdcq\x13\x82\n\xbd7\x85\x110\n\xad\x0f\xb8\xba\xa6\x9e\x06\xa1\xc1\x81\xb1l\x1b\xb6V\xa4\xa2-\x03\xb80v\xdc9\x00\v\xa4\x19\x8c\x97\xaa\xd4\x15*\xc0\xac\a\x1d\x8f\x1a\x9a\x1e:\x86\x9a;A\n\xce?\xb2\xa1\x80\xcf\xd1C\xa8\xb4Nj\xd0 4\xa5\xf3\xf2\xca\x1ak-r\xd6\xfc\\\xbe\xf2C\xe4,Et}\x17\xb8\xd5\x12\xd5e\a9\xb2\x90\xd6l\":6\x86e\x16\x01bb\xca\xff:'Ee\v\x9ch\x95\xa6\x14\x13\xe6\xb0\xc2\x14\xd4Z\f\xac\x92\bc\x9f\xa0\x89\u041f\xefiR\xd3Q\xc98[\x0e\xc7E\xf7\x12\xc1\x83\u060e\xf0\x95\x89\x14\xc1\xd0:\x01\xdcz\x83C\xb4c\\\u0756\xeeI5\xd0\xe8\x88Y\xcaZi1\xb2@z\xf8mS\xfb\xf4\xc7R\x12\u03dd\xaa\xff\xa6\xaeD\x8c\xe2\xfbJe/p\x11D\xf3l\xa7\xa8\xca\xfa)<\x03GA)Q:\u06b2\xb2\xc6\x1e\xd2]t\r\xe0osC!\x9c\x92\xf2\x87\xf4\xc5\xea!\x05P\u03b6\xd8\x10E\x88\xf2\xa5a\xa4\x00\xd2>7\x12\x80\x15\xf9\x8c\xa3W \xe2N\x04\xe2\xb4;aZ\xb0qK,\x80\\\xa2\x88\x88Ii\xa5\xc2\x1f\x97(\xd18\xaa\u04d1\xdf\xc0\xf2\x18\xb8\x1exd \x8c\x10\x0f\xb8p\xf0\x99\xfa\u056e\x94\x8c\xe4<h\xbf0O\xf6\u007fj\b>\xb5+\x19\xfdt\xb9\xe5\x01\xd1cX\x1eO\x99\x16V\x8aM{\x182\x8ab\b\x82\xd72\xaa\x86\xd4\xeb\xf0\x81r\x8b4\xb4\x87\x95P\x0fh\x03 l\xb4o`\"\xa1q.{f\xacm.\xd7RP\f\xa5\xccZ\x1d\x87m<\x00\xaf\xd8Z\x974'\x19\xe7\x9d\xf2z0$\x06A.\x82\xef\xeb\x9dr\xa2\xcb\u00c2Tp\x16\u06f5\x9f\xef\x99H\xdc'\xe8Z\x19\xab\x1e\u0678[xd\x84\xc4\xfd\xaa)zY\u0324C\u007f.\xd9\xf4\xc4\xe0!_\xf2\x05\x06\x88\u8a57qe-\u007f\u0143\xe5L\x0f\xe9\xf9\xe2y\x82\xa6\x80\xa7\x99\xfe\x01?Y\x18\x166\x800XW\xaf7\u0310v\x8b#2\x90j\x87ZK\xb6&\xb0\xbe\xffl\x9b\x87\xd0EO\x85k\x11\xc4\xfc\x06\x96\\\x01;{l\a\x1b\xf2\x91\u2b91\xfb\xa4\xcc\x18\xd6&:\x91\xb9?\f\xa2\xad\f|\xd5\x13\xed|\xd0I\u05c3\xd3\xf2 {mJ\xe0\x1eS\x8d\xe1\xc2\a\xc0\u05a8Vv#zo}\xecNO\xbb\x19\x98\xe3\xdb9\x9c\xd1<\r2V,y\xe8\x18\xfe\x98\xfd\xb3\u06b5\nO\xa4\xbbBV\xf57\xec\xae\x19;\x82''\x89.\xaf\xa1j\xadU\xef\x8bX\r\x8c\xdbo:T\u0784S\x8bhg\x06\xc8\x03\x92\xec\xd5\x04\xe3\xb2\u071eN\f\xab,\x94g\xfcyzl\xda\"V\xe8=\u02fb\b\xb6+0\x05\x85\x9bB\x04\n\x9b\xebF\xf1\x92\xf69pI\\r\xa0A\a\xf8\x9d\xe85\x98n\xc0\xe1Z\b^n\x97\xe4\x11zGzd\x1bj\x9d\xdbU!;i4 \xd6\xf1\xd5\xc3\x03\x9a\xe6S\x03\xac1\x80\xd8\xf8\u007f\xa8\t\"P)+\xa9\xb2Zb\xb0\xe2\xc5~%t\x99\xd0\t\xd9\x017\x00\x88\x12\xad'\x85r\xaco<\u0147\x00\xffL\xbf\xc9y\xe7\u0136\xc1\xb8\x04\x97 <e\xc9;\xbb\xec\xfc\xed\x14\f\xa7H\xe0)=@\x04\u06f2\x05\x11\x91w!m\xb8f\xd1\xc6\xd1\f\xfdR\fu\xbd{\x8a$J\x1a(!\xc6\xe4J\x9c\xc4|\x00\u0154A\u0783x\xa0H\x1e!!,\x91\u007fi84\u0554A\x94\xe5\xecO)O\xc0!h\xe7\x8d.$\xdaT\xd2\xdfI_\xa5:\xa5)\xa4\"\x10\x11\xb5$\xbf\x87).\xa5[\xd0|\xb1\x1e\xa8\x17\xec\xd4\xea\xf5\xa3S\x86\u05c5A\xfe\u01a3\xe0\xa2\xe3\xc8\xf5\xb1y\x80\x9a\x83S\xf0\x9d\x03\xb0d\xe3\xcb\x14,\x9f\xc1\x1d\x9c\x87+q\x9c\x80\x00g\xd0wN\xed\xca7\x80\x06G\xb8\x16Bsxe\x19\x91>\th\xaaJ\u0417\v\x16H&\x83\xb6\x12'\xb0\xe0L\xaa\v\xc0\xe7O\xc3/\x81\x06\xbbS\u04acH@\x82\a\x1f\xc3U\xb9^\xf0#\xa1\u0290\xc7T\xf3g\x84UM\xe5\xe1/\u007f>\x12\x1a\x84x\xcbs\xd3\xf0\x8f\xf04\x9c}\x88\x06\u007fI\xb1\x1b\xfeB8p\xaf\xa9x3b\xee8\xb0;/\x10\xb4A\xfex\x18\x10\x90O>i\xf0\xb7\xa2\xc1X\xceT\x9a\x01-\x16k\xbd\xef\xb16D\xef\xc2i~M\x88\x9a8HV\x1a+\fYn\x88\x01\x98x\x9e\xf7\u063d#\fI\x17V,\xb1\b\x06\x03\x1f\xcd\f\x01\xe0!\n\u03fe\x1bD{\x14\xfa\x10\xc8\xc0\x81.\x13G\xdc\xd9%k\xcbY#\xaet,1xdnA\xe2.f$\xa1\x06\u05918\x1e*Jv\xffT\x80Fgd\x1d\xa9M\xd6?\x19\b\x9d\xee\x19\x03\x9c\x8d>\xf1\xb4v8\xf1+Z3\tB.\xe4\xb2sz\xda\xfc\x01\xde!\xc4$Du\x00\x02\xf8\vo\xe1cQ\xbc\xef'(-+\xe0\x94-a0\x92V\xff\x1d\x95\u0638;\xfd\x90\x9agW\xf8B\xe3=\xd4c)\n\xa89\xad\xda\x1d%O\tx\xa2\x97\xd1\x1f\x05\x19Em9<\xeeK\xa4'\xde?Tk%\x11u\x85\\\x18\x82C\x9c\u05cbO\x13\n\xec1\xee\xccL\x13\x04\u11adF\xca\xf4\x05\b\x16\xa2\xc9\xe2N\x90L\x90-\xd6\xd1\u488f\u038d\xb6h\x15%.4\u2d8d\x18\xa7\xd2[\xe3+M\x13\x9f\xfb|I\xb1\x98w\x1b\u065fU\x06\x81\xd1\u010a;\u019d\x04$*\x96k\xc0\x1a\a\xb1r\xa6Ml\xa9J\xeb\xd2;;,P\x17\x00F\xa4\u04a6T\xc1s\x83\xbf\xc2\xfa\x81\xff\xe8\x95\xed!\r\"\x84\u04dc$1\xe1s(.\u0257\xf6\xd4E\\5\vX5}H_\x12\xa0\xaf(\x1eC\xf7d\xd8\b&\x93&\x12\x92%\xd0.\xcd\u0619B\x99{\x05\\\x06\xe7\u0401n\x01\x18(\x11\x9f\xfb\xaas#\x83d\xe2x\xf6U\xb8JG\x8c\x1d\xc9:\xc9z'3\xbc\x1e\xa1@\xf0\x17\xe5\xeb\x91\x06\xfc\x00\xf9\xa7\x9c1\x80\xdf\n\xda\x12Br5N\t\xb8\x8d\x01\xa0\u007fO\n\xa1fN\xc6\xdb9\x1e\u0769\x80v\x8b\xa0\xa60}\xa8\xb8\u01179\x18\x06\x94\u007f\xe7\"\x1bU2;\xb3)\xda\x05\xd4\x00\xf6\xd9\xf4W\x89~\xca4\x0e\xe1\xe4\x1a\x1c\xe9\xf3\xd0i\x14\xb9A\x99@\xeeP3\b\xdc7a\n\x01\x8f=\x88DW\x04\vx\xda\xcd\xc4\xce\xd5|\fK\x00p\x151\x93\x00\u0135\xe7\u05b0\xc2N\xc3g\xf8\x99@\xb3\x0f]E\x81}G \xa7\u0593\xb95\t\xc3\xec\x14tM\u043c&;\x067q\x11-jv\x84\x8czT3\xbaT\a\xb0\x8e\xd5\xd2k\xaf?\x9e\xe3\xb9n+\x88\xe1\xd1bY%\x93\aH\"&\x80\x9d\x90)\x10\xf3\x1c\xf9J\u054bq\xa4\xaa`\x0e\v\x9a`#/\x90\x00\xe5\x9eb\xc6\xd8\xd3\xf9\b\x95\x019\xe1\xefSA\xb4\xd7JwE6O(\x1d\x118NOL\xd3d\xb6#\x1f\x10a\xb8M\x93\xed\xa9\xfd\xefs\xd5@\xb5|:\xd4D\x83\xa36Zt\xdbYf\nzip\xddZ\xc7\xd0\u0620\x02\x01X\xbc\x022\x0f\ua8827\xda\xc4\x05!\xac\xc7\xe45\x00@\xf6D\r\xc6\xea\xde0\xdeD|\xa1\xb6b\xc0W\xf1\x1d\x02\\\v\xed\x19C\xdc8 vPUP\x18d\xbb\xaf\x9eL\xdf%O<\xd0\xf9\f\xeb|\x94\xd1_\u0240)\x83\xfe\x81\xf9\xb9\xe4,$,\rB\x82_OE \xfa\x814\x9d\xbe\xa4oa\n\x10y\xe1\xe0\u040e\x89\x80j\x8a\xf2\x16\xcceX\x06SN\x9d\x85C\xfb\xeb\x06\xcdr\x83\x06O+\xa6\x8f\xbb\x16\xeb`H\x9e\x1a\x84`\u070b\xbc\x06bIg\x96\xc9P\xf1:n\xec\x83)\x8b\xd8$\xaf\f\xd2\xed\xecfYr\xee\x17\r\u0d68`\xf8M\u05c2\x15\x0f\u0262\xc1R\r&\x14\xe2_I\x0eZ\xd0\xdb-\xd2@$\xe6-\xf3>\x18\x83W.\xde\x1c\x14\xb9@\xbc\"m\xa0{\x987r\xe5\xf8&\xfc\xa0\xc4\xe2^\x10\xad\xac\x8a.\a\x1a\xf3h\b|\x8a\xb5,s\x1b\xf7\xb6\x89<\xa3\xa96\x14Q\xa8\xa1\"\x8b\x99M\t<K\x13\xebHo\x05\xf2\x9f<\xe1\xc2I\u02dc\xa0\xe3@\xd0\xcc\x05K\xda\xe7\x92^\xb80\x04\x8aB\u03b8\x193:\x9cj\u0239L\x16\xc84A\x99?&\xa6D)/\x91_\xa5.\x8e\x1c\x00c\x1f\xe1*\xab\x03\b\x19\xfa\xb2$\b\x89\"\x05\x89h\v\x80*9\a\xf3}\v\x8dv\x86\xbfxV\x9ao\xef\xf8\xb8\x8d\xe4d\x16\xac\xad\u0720\xad\x1a\x8a\x99\x1c\x90\x14\xad\x88\r4?\xb0\x164\xd6\\\xb4\xd4\x1a.m\x17z\xed\xd1:\x9a\xd6\f\xb9'\xae\x9f\xf0\xd15\xe3G[\x85\xde\xe2\xbf\rU\xf6\x184\u007f/g\x9b\x9d\x03^<n\xfa\xb5$\x92\x88\xfc\u03e6#\x12\xc4\x0f\v\x93Z0\u07d3j|\x8c\xc4Jw\x19|\x99j[\x19\xb2\xda\xd9\x1ee!HQsk\xc3\r\xab^\xad\xe0\x19\xe8\xc0\xcf\xcb\xe8\t2\x89\xa8\x97\n\xd0\xf9s\xafA\x8d\u0734:D\x83\x10\xefj\xe9\xf0\a\xc1n!\x1a\xb9\xe8Y\x16\xf54\x89=\x10\xdd\x1bT\xc45\xf7C\x8e\xbd\xc2\xfcd\xcd\x04*w\xa8h\x04F\x13x8\xa6\x91\x94\xccFB\x9d\xd53\x800@\x00\aB\xf5\x95y\x1e\xeb\xcftg\x91\x17d\r\xb6J\x13\x8d\xf7\xa4\x85\x1d\x17~\xf3]r\x8f\u007f\xcb\xe1/\xe4\x90o\x15\xed\x0e\xfb)\xab)g\x1a\xf1,\u010dI\xa1\xa3\xbe.w\x15.\x8bU\x12\xa4\x93\x067nW\x84\xba\b\xe6\u024e\xd9o\x96\xecM'K\x16\xb6\x0f\xdf\x1fCR[\xa3\xf3\u330b\xb5\xba\x91\x8e\a\xec\x86 \x14\x16\xdc\xf7K<\xee!$\xa9\xd8_\x92\xddke\xae\x19J\x01\xce\xc0l\x96\xbc\x99\f#\xeb\u020aS\xca\xfb!\xa2\x92\x17\x10\x90\x9dA\x8c\xec\xab\xd1Fi%\xbc\xfaV\x01T\x81y3\xe1\x1a{hn\xc0'\x00\xb3\xe0\xc9'aP\xba\xd6\t)1\x88\x9347\xb7\xaf\xdd.\x942=\x9b\u06f3\x01\n\x9c\xa2I\xaaD\x87\x87\xb0a\x8f\xa1\x93VnH!5\xb1\xc8>\xc8\"LX\x0e\xf0\x15\rc\xf7\x90bD\xf4n\xa7\xad& 4\x91ec\xc4 \x92qA\xebJ\x98SE\x87\x10\x9a\"\x80\x10\xec\x02\x14\x05\x15n\"@S\x85\xdf\x05\xa8\xa8\r\xe6i\xeem\xf9\xae\x142\xfdy\xbd6\x15\xe7\xe8\xcde4\x91d\x1d\xc28J\x1a\x93\xbc\xe8\x16I\xb1\xb8\xe5\u05ad\u0243\x8f\xc3\xf1\x1a\v\xf6\r\x83\xe7\xcaZ\u07c3\xbe\xf5\b3\x15A\xf8\u0739\xa6\xd0\x10,\x15g\xc0\xf8,x\xfb\xc9B\u0705\xfe\x9bC\xbcX\x82\u0165\x80u\x0f\xd3d\xaa\xef\x04\xc1<\x83-\xb4\x05\x15\x1a\xf2\x925\xb5\x93\xd7m\xd7\x03\x85g\xad\x06s\xc6D\xf7u\xb1\xec\xc0\xa2\x10ll\xe8],eZ\xd1e\x84O\xe4\x85N2\n{\xe4\xc2#b\x8aL\x0ezH/\xa0B\xf0\x12,s\xc3\xef\x15\a\x9b\xfe\x932cf\x9ec\x84\x94\x17\xbdLL\xb3H\xf4\xea^h\xb1v\xd70\u011b\x98\x00\x9bK>\xac\x03f\x17;6U\x82PpM\x81\xa3u\x1d\xbe\x10\x10\xd1\x1b1\xc2!\x8e?\xc1\xaaQ\xadF\xd2r\x11\xe5\u048c\x87z\xe0^\xd0>$\xe1\xa0b\xf8\xbb\xf4IF\u075a\xe0c~\xd4}pT\xa8\xa3\x01\xba\xf4\x1c\x06EQ\x8f\x97\f\xd1\xfe4D\xacY\xf9[f^\xac\xb6\x03\tZ\xd0\x0e6&\xfe\x8ap\x06DD\x8e!\x041p}g\u0160\x1a\x91\xb7c\xb8\u02b7\xa2\v\x02\xc5R'\f\xa9h~\v\x88\xa5(B1\x18\xd4\xda\u0474\x89\u007f\f\x88B\xc7a\xc2\xf9\x96n\u0607\xb1\xd1\x1aV\x04F\xbd\xe9\x1cF.N\xfb\xa1\x91N\x8a4\xf5\u06c5nZ\xc97\x14\x02O\u0354\x1d\xdf\xdf\xd8w\x18/b\u00e8m\xdf\xf8\x00\x91@l\x81\u02d4\xc6\xdbB/\xea\xcc)\xed\x80\xfd\x90\xc9!s\x1a\xa8`0\t\xbb]\xc2\xff\xbd\xa5Rr[e\xf8\n\bs$\x88\xf0^\x00q\xb4\u007f\x83]\xa1 }H\xc1\t\xeb\x1a\x99/\x8e1l\x97\x01)\xf8\xaf$\x1e\xac@\xae\xe9\x80*R\xf4\xf0\u0647\xf0\x93u\xb9\xfc9,\x1d\x03!\xb8\xa0G\x94\xbe<7O\xa4\xf9\x86\xb7\xc9\xe2V\xea0\xe0\xc0TZ|\xb1\x0e\xe5\x01?9\xe5]\x04z\xb3\x02wK\x8d\x84\xf6\x11g\xf2\xcb<L\x80\xaeTu\u01b1\xf8F\xe8\xea\xd75\x9a\xb2\xc2\ue8fb+\xf6\x83`\nY\xcd\xf5~\x90\x02\xa3\x85\ub4e6&-\x15\xaa\xae\xe01\x839\xa3\xfc\x92\xbe\x97\u253e\xc9\x15\xa9\xb9\x90E\xcd\x04\xd5\xca\x16&\xa6\u06a8\xa1\x8e`\xc3\rn1\xb9\b\xbb\xf8bof\x8e\xb9\xb0\xc6\f\xb1\xad\x1f\x00\x13\xaeT\r\xa4\x89\xbah\xc2BG\xa1\xd8d\xac\x17\xdd\xc1\xddd\xe1I\x15\xc1\x80\xff\"\xa6\xc1\x80\xb7\x1a\x89\u0598?\u007fB^\xad\xc7\"\xe7\x97\x01X\xafz2W\x9d\x00\x02\x1a\xe6\xaf \x8c\x11\xb0;j\xa0J\x91\x12A\x9fl@\xf1g\x86\xda\u00fbEJz\x06\xae\xee%\x16\xfc\xd24\xfa\x8a\xf8\xd97\x98\\\u5176l\xe4\xcd\xceI\x81\n\x1a%\x03\xd15e\u1f32AI\x98p\x868L`k@\x00\bQ\n\u0696\x84\x1f\"\xc3\u0557\x8eM\xa0\xc5\u0605\u0174\x11\x99\xe8J\u04e9%tdE-\x19\xb2&*\xafH\u0754\xab@l\x96\xbd}M\xb6\xd8\xd0\x01\x14\\\xa7+&(cS\xddD0x\xd1EV(.(\xb2lZK\x03\x02re\xee\xdf;R\xccS\b)\xd8\u0646b6 <$\xa1\x13\xdb\xd0\a\xd0J8\xb4\xac`\x16D\xab$\xbb\x91 {\x8a\xe7\a\x83;\x94*\xcc\xe2\xb0\xfe0\x91\xf3\xed\x03M[\x9c\t,\xef\xc7\xc2j:\u8aebj\x99\n\xc5\x1bT/\xd4\u007f\x1cIMyM&\x1e\x9c\xe9\xde\xfc\x96\xf2 ;\xb4m\xba;\xe7\x9a-\xb7/\u061b\xbde \u0513\xeb\xea\xfb\u0477\x06\xa0a\xdfD\x13\x13\xef\t\x1c7*\x04\xae\xc0\xc5\xe4\rf\xb7U,\x97\x9d\x9e\x06\x1d\xdf\xfd\x0f\xe4\x86\xd5\x00\x0e\xd9i\x84\x00\xa8\x91\x84~\xb6<KN\x05A\x86\x14\x14\xf5\xe7\xe5\x11\x8f\xadJ\x1fC\xfbAAa\xf8\b\x13\xb3>\x89\xc6;\x88pD5\x83/.L\x18\x8a-gX\x03\x0e\xe0\xa0Y\x98D^\x0e\x94\xe8\x85\f\x87_\"\x1c$>\x01\xd0\xc15\xe6\xc2\xcc\xe3l\x1fz!\x81\x041>\x1a\x03/\x15\x90\x89!%\x99\xcd\bj\xe3\xb2=\x1a \xe1k\x17\xca\xd3\x05qq\x1fD%\x8bif\x96\x00\x94\x8f\xd4$\f\xc4\xf5`\x1d\x04 A\xb2P\n\xf3\x12\xe6\xa2)*Oj\n3\xc0NL\x8aR\x8e*\xcab`\x8c\x94@C\x05\x12]\xc1o\x8d!\xc9h\xa2\u00d5a\x00\x844vx\u06e0\xb6#\xc0s$\xe2\x10\xdb\x02<~\xe8\x02s^6U^Ld\x91\x8a\u00ae \xe1\xfe%\x14\xbf\x0409.\x98w\b\xea\xb9\x1d\xb6m\x14\xe1\x16f1\x84\xda~\xa4s\r\xa4\t\xe8\n*\x86\u007fI\x13\xb6\x1aV\u028aZJ_\xc6Z\u00aa\"tf\x90~\x15m\xd8`G\xca?\xa4M\xc1\xa8\x8b\xb2v\x05\x92 \xa3I\xa4\x98\x93\x8d\xb7\xb4\x989t\x8dV@\x15\x98\x1c\a\xcb<=\x87\x19\xa4\xf4\xda=\x9cj\xeeHy\x8cNau\x89vI\x8d\x90\x1c\xe3;\x96\x17\x87G[$\x98\x97k*\xcd\xdd\x1d\x97D\xbeIH\xdd3\x9bbb\x14\x19\x199!\xa7l\x8a\xd1\xf1\x0f\xabo\xa7w\x9b\x9d\xab\b\r\xd3\xfd\xa9\f@\u05e0(\xa9J\x97OS\x8f9\x04\xb5\xa4\xd8\xff(\xf3C\xdc\xc4\u0305\xb4\xc4|\aP\nC\x91\x9e\u007fwUk\x1e*\xd4\xc6\x14`\xf4\xf0\x16\xfbo\x11\xfa-`n\xaeASZ\xeab\xa4\xe1b\x9dmX\xa3\x14\u05d6\xd5\xcew\xae\n_\xbe\xc9\xe9~\x15\xf9e\xa6\xf4\xc1}\x80\x9d\xf0\xe0\x1e\x99{\xdf\x15Q\xc7h\x80\x1f\u0090\x00\x15\xbf\xa2\xaa\xb6\xee\u0126\x04\u0336a*\x19\b2\x00\x93\xe3\xc6\t\x98\x01_\fu\xc2x\xaaFw\x12\x89\u0523@n \xe9\xf3\xaa\n\xb3\x0f`\xb1\xa01\xb4\u01c34\x8d\u074a\"\x85q\xa8\x1b\xee\x1f\x85\xd88\xff\u0091\xdd\x1c-{\u0205\xb1\xd6_\x02\x91\x9b'\x1fX\xe3d\xb9\u007f1\x9fA\xfes\x8b!;%0\x89q\x80\x1f\xc8\x12\r\x8a^&\x91t4w\xacX$\x02\x96\xbf \xba\n\x06\x83\xb9z\"\xc0\x85-\x8c\x885\x10\xadu\xd3\xd0\xcf&\xda\xef^\xf4\xf9s0\x10j7o\xc2;;^\xb7\xd2\x13r\xb3\x91g\v\x81\x90\xc0B\u025b\xe7\xdd\"\xb0\xf7f\xf3\x0f\x10\xa5B.QH\x8e\xe7=\xe0HO\xb1\x96\x06\x8c\xfc\"5`\x81\r\xf7`\x16\x88J\x8d\xa7\x0e\x814D\xf6\x1c\xe10\xda\x1a9K\xdcJ\f)\x00\xaa\u0460md\xe3I\xa8\u057a\a6Z\rJ;\xa7\x013QF\x023\xcfk\x1f\x88\x16r\x8a 1\u02a0\xd4\u05ac\xa6\xddZ8\x80r\xc45C\n\xfb\xc9\xf6\xef\xcc\xd6\n\tQq\x93\x99ZNQ\x83\x80\xa6@z\x81\xa7\xe2\x85\xc0\xaa[\xf3\u04660u\xe0\xe6\xccp\xac\x9c\xd8j+^])\x86\xa8\xa5\x86\xaea\xe8F\x8a\xb57\xc8aW\xac\xe8\x12\u01b2\x19AM]s0\"\xc0\x15)\x16\xa4\xbc\xc7`[\xf2\x8c3\xf0,\xaf\x17\x8d\x95\x98\x0e\x1a\x82\u007f)l\\A'@.\xf4\xd1,f\x01\xc5,I\x8f\xa9l\xe3\xe1/5\xeen\n\u0132\u0290\x97\xc7r\xb4f6|\x873\xb9\xb7\u0703k\x17\xec\xd6\x05]\x0f\xd2H\xbd]\xa3\xf5!1|\"J\x94\x0e\xb4E\xfd\x8b\x8a^W\x00\x1b4&\xb1\x1e\x8fN\x12\x0ej\xf2zt\u0261}\u05f6\x00\xdepp\xe1\xa5w\xb0Z\xc3HAI\\\x06\xea\x1e\x12,f8\xc6K\x9f\xb6\x11\x81l\u03b3\xf0\xc9eM>F/\xee\xec`\xa2\xe0\x03L\xeb\xdb(\xa4;\b\xc0\xa5\x1c\xe0\x15\xcd\x0f;\x139\x06\xd0@U=\x85o\xfe\xc7\x01]\x98\vX\xd7s=X\x82\xeea\x8d\x03`F8\x10\xab8\xb0\x1f8\x89\xe2\xc9\xc5rh}u\x12\xb2G6\x87\x1f:\x8e\x16\x99\xb1\x14X\xaa\x80\xf1Q\v\x9c\x1aV`\x86\f\x94%\x10\xef\xf00\xfcAFUL\xc0\x99\xda,\xae\x04\xb8\xfep<[\xb6 ;\xbe\xa7\xcfa\x84:\x037P\x92\n\x12u\x80\x85)3\x8f\x84\xc1\x83\x18\x84~\x84\x04\x96\x9f\xfd:(\x927\u0352\xd9K\b\x00\xd5N:\x18=(\xa7\u06e6\x14\xd0\b\x1a\x9d\u042b\xa1\xd3\u0468\xc8T\xa9\bP\xc0*\x01{/\f\xb3\x9e\u053f\"\xcbK\x15\xb6\xdb\x0e\x96\x8e[l\x93\xb0\x1a\x11\xee0\u02a7U\x01y\x92K\xf1\x1a\xf2Z2\xbcC\xf8&V0\xb6\xd8\x15\x96\xbe\"1B\xe6.!\x96lWsa%ra\x10\xea\x8e\x0e\u0206\xd0e\xb8\x86(T\xb1FV\xda\xd7Mzfr\x14\x85\x9d\xc1X\xbe\f\xb08\xf4\xa8\xe1\x01\x90\f\u0256\b\xf24R9V\xcc396P(\xbd\xd4\x1f\x00\a\xf2\x9a\xaeY\f\x91\x87a\xec\x17\xc1\xd5\u0464th0\u02f7\xb6jUk\xf2\x88s\xdc?D\xfcR\xa8H\xddd\v\r\xb8\xb9s\xc0\xb0\x89\xc6\xea\xb5Ld\xeb\x1f\xce]\x8c\x19B\xe0Up8U\x1e\x1c\xf1\xc9\xc09\x17T\xcd\x0eY\xf4\x10\x8eD\xb2'&\xa0\x87\x14\u013c\x9f;\xe8\xabZ\x94\x8f\rv\xee\xc1\x83[\u0109RiWH\xf4@\x97\xe5\xca:\xc3*\x1e]\xb2\u05b1\a\x05\xba\x951\x11\xac\xc2h\xceOn\x8d\xe1\xa2\x1a\x8a\xfb\u0682\\\xf2}`d\xd7\x16.)\x81E\xb5\u039bKVM\u00d4l7P\xa7\x1a\xef\xdaW\x04\x9d\x80\x82\xc4\xe6\u0775a\x1e\U000107c7\xb4$\xa4\xc1$\xdb\x1d\xees\xb3K\x9f\x1a0L\xd7\x17\x91\n\xad|<\\\xa2\xe0$/7\x1e\x0e\xe6h\x91n\x0fL\x8av[\xa6\x1ab\x96\xabL'\v\xae\\1aER->\u00f0\x8dc\x9c\xc7h\xf5\xb1\nP\x00\xd7Y(\xffe\x80Y\xb7\u0563\x84in\u01de\x89\x0e\x99O\xe3e\x8d4I\xd0")
+
+func third_partySwaggerUiFontsDroidSansV6LatinRegularEotBytes() ([]byte, error) {
+	return _third_partySwaggerUiFontsDroidSansV6LatinRegularEot, nil
+}
+
+func third_partySwaggerUiFontsDroidSansV6LatinRegularEot() (*asset, error) {
+	bytes, err := third_partySwaggerUiFontsDroidSansV6LatinRegularEotBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/fonts/droid-sans-v6-latin-regular.eot", size: 22008, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiFontsDroidSansV6LatinRegularSvg = []byte(`<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg">
+<defs >
+<font id="DroidSans" horiz-adv-x="1062" ><font-face
+    font-family="Droid Sans"
+    units-per-em="2048"
+    panose-1="2 11 6 6 3 8 4 2 2 4"
+    ascent="1907"
+    descent="-492"
+    alphabetic="0" />
+<glyph unicode=" " glyph-name="space" horiz-adv-x="532" />
+<glyph unicode="!" glyph-name="exclam" horiz-adv-x="551" d="M336 414H215L164 1462H387L336 414ZM147 111Q147 149 157 175T184 218T224 242T274 250Q300 250 323 243T364 219T391 176T401 111Q401 74 391 48T364 4T324 -21T274 -29Q247 -29 224 -21T184 4T157
+47T147 111Z" />
+<glyph unicode="&quot;" glyph-name="quotedbl" horiz-adv-x="823" d="M330 1462L289 934H174L133 1462H330ZM690 1462L649 934H535L494 1462H690Z" />
+<glyph unicode="#" glyph-name="numbersign" horiz-adv-x="1323" d="M983 893L920 565H1200V428H893L811 0H664L748 428H457L375 0H231L309 428H51V565H336L401 893H127V1030H426L508 1462H655L573 1030H866L950 1462H1094L1010 1030H1272V893H983ZM483 565H774L838
+893H547L483 565Z" />
+<glyph unicode="$" glyph-name="dollar" horiz-adv-x="1128" d="M985 446Q985 376 960 319T889 220T776 151T625 111V-119H487V102Q437 102 386 106T287 120T197 142T123 172V344Q156 328 199 312T291 282T389 261T487 252V686Q398 716 333 749T224 824T160 922T139
+1051Q139 1118 163 1173T233 1270T343 1338T487 1374V1554H625V1378Q725 1373 809 1352T961 1300L895 1155Q839 1180 769 1200T625 1227V805Q713 774 780 741T893 667T962 572T985 446ZM809 446Q809 479 799 506T768 556T711 598T625 635V262Q718 276 763 325T809
+446ZM315 1049Q315 1013 323 985T352 933T405 890T487 854V1223Q398 1207 357 1163T315 1049Z" />
+<glyph unicode="%" glyph-name="percent" horiz-adv-x="1690" d="M250 1026Q250 861 285 779T401 696Q557 696 557 1026Q557 1354 401 1354Q321 1354 286 1273T250 1026ZM705 1026Q705 918 687 832T632 687T538 597T401 565Q328 565 272 596T178 687T121 832T102
+1026Q102 1134 119 1219T173 1362T266 1452T401 1483Q476 1483 532 1452T627 1363T685 1219T705 1026ZM1133 440Q1133 275 1168 193T1284 111Q1440 111 1440 440Q1440 768 1284 768Q1204 768 1169 687T1133 440ZM1587 440Q1587 332 1570 247T1515 102T1421 12T1284
+-20Q1210 -20 1154 11T1061 102T1004 246T985 440Q985 548 1002 633T1056 776T1149 866T1284 897Q1359 897 1415 866T1510 777T1567 633T1587 440ZM1331 1462L520 0H362L1174 1462H1331Z" />
+<glyph unicode="&amp;" glyph-name="ampersand" horiz-adv-x="1438" d="M422 1165Q422 1131 430 1099T454 1034T497 968T559 897Q618 932 661 963T732 1026T774 1093T788 1169Q788 1205 776 1235T740 1288T683 1322T608 1335Q522 1335 472 1291T422 1165ZM557
+141Q615 141 664 152T755 184T833 231T901 289L514 696Q462 663 422 632T355 564T313 486T299 387Q299 333 316 288T367 210T448 159T557 141ZM109 381Q109 459 129 520T187 631T281 724T408 809Q377 845 347 883T295 965T258 1058T244 1165Q244 1240 269 1299T341
+1400T457 1463T614 1485Q697 1485 762 1464T873 1401T943 1300T967 1165Q967 1101 942 1047T875 946T779 860T664 784L1016 412Q1043 441 1064 471T1103 535T1133 608T1157 694H1341Q1326 628 1306 573T1259 468T1200 377T1128 293L1405 0H1180L1012 172Q963 127
+915 92T813 32T697 -6T557 -20Q452 -20 369 6T228 84T140 210T109 381Z" />
+<glyph unicode="&apos;" glyph-name="quotesingle" horiz-adv-x="463" d="M330 1462L289 934H174L133 1462H330Z" />
+<glyph unicode="(" glyph-name="parenleft" horiz-adv-x="616" d="M82 561Q82 686 100 807T155 1043T248 1263T383 1462H555Q415 1269 343 1038T270 563Q270 444 288 326T342 95T431 -124T553 -324H383Q305 -234 249 -131T155 84T100 317T82 561Z" />
+<glyph unicode=")" glyph-name="parenright" horiz-adv-x="616" d="M535 561Q535 437 517 317T462 85T368 -131T233 -324H63Q132 -230 185 -124T274 95T328 326T346 563Q346 807 274 1038T61 1462H233Q311 1369 367 1264T461 1044T517 808T535 561Z" />
+<glyph unicode="*" glyph-name="asterisk" horiz-adv-x="1128" d="M664 1556L621 1163L1018 1274L1044 1081L666 1053L911 727L733 631L557 989L399 631L215 727L457 1053L82 1081L111 1274L502 1163L459 1556H664Z" />
+<glyph unicode="+" glyph-name="plus" horiz-adv-x="1128" d="M489 647H102V797H489V1186H639V797H1026V647H639V262H489V647Z" />
+<glyph unicode="," glyph-name="comma" horiz-adv-x="512" d="M362 238L377 215Q363 161 344 100T301 -23T252 -146T201 -264H63Q78 -203 92 -137T120 -6T145 122T164 238H362Z" />
+<glyph unicode="-" glyph-name="hyphen" horiz-adv-x="659" d="M82 465V633H578V465H82Z" />
+<glyph unicode="." glyph-name="period" horiz-adv-x="549" d="M147 111Q147 149 157 175T184 218T224 242T274 250Q300 250 323 243T364 219T391 176T401 111Q401 74 391 48T364 4T324 -21T274 -29Q247 -29 224 -21T184 4T157 47T147 111Z" />
+<glyph unicode="/" glyph-name="slash" horiz-adv-x="764" d="M743 1462L199 0H20L565 1462H743Z" />
+<glyph unicode="0" glyph-name="zero" horiz-adv-x="1128" d="M1032 733Q1032 556 1007 416T925 179T779 31T563 -20Q445 -20 358 31T213 179T127 416T98 733Q98 910 123 1050T204 1286T348 1434T563 1485Q682 1485 770 1435T916 1288T1003 1051T1032 733ZM283
+733Q283 583 298 471T346 285T432 173T563 135Q640 135 694 172T782 283T832 469T848 733Q848 883 833 995T783 1181T694 1292T563 1329Q486 1329 433 1292T346 1181T298 995T283 733Z" />
+<glyph unicode="1" glyph-name="one" horiz-adv-x="1128" d="M711 0H535V913Q535 956 535 1005T537 1102T540 1195T543 1274Q526 1256 513 1243T487 1218T458 1193T422 1161L274 1040L178 1163L561 1462H711V0Z" />
+<glyph unicode="2" glyph-name="two" horiz-adv-x="1128" d="M1008 0H96V156L446 537Q521 618 580 685T680 816T744 944T766 1085Q766 1144 749 1189T701 1265T626 1313T530 1329Q435 1329 359 1291T213 1192L111 1311Q151 1347 197 1378T296 1433T408 1469T532
+1483Q628 1483 705 1456T837 1379T920 1256T950 1092Q950 1007 924 930T851 779T740 629T600 473L319 174V166H1008V0Z" />
+<glyph unicode="3" glyph-name="three" horiz-adv-x="1128" d="M961 1120Q961 1047 938 987T874 883T774 811T645 770V764Q822 742 914 652T1006 416Q1006 320 974 240T875 102T708 12T469 -20Q360 -20 264 -3T82 59V229Q169 183 270 158T465 133Q557 133 624
+153T734 210T798 301T819 422Q819 490 793 538T717 618T598 665T438 680H305V831H438Q519 831 582 851T687 908T752 996T774 1108Q774 1160 756 1201T705 1270T626 1314T524 1329Q417 1329 336 1296T180 1208L88 1333Q126 1364 172 1391T274 1438T391 1471T524
+1483Q632 1483 713 1456T850 1381T933 1266T961 1120Z" />
+<glyph unicode="4" glyph-name="four" horiz-adv-x="1128" d="M1087 328H874V0H698V328H23V487L686 1470H874V494H1087V328ZM698 494V850Q698 906 699 967T703 1087T707 1197T711 1282H702Q695 1262 685 1238T662 1189T636 1141T612 1102L201 494H698Z" />
+<glyph unicode="5" glyph-name="five" horiz-adv-x="1128" d="M545 897Q644 897 729 870T878 788T978 654T1014 469Q1014 355 980 264T879 110T714 14T487 -20Q436 -20 387 -15T292 -1T205 24T131 59V231Q164 208 208 190T302 160T400 142T492 135Q571 135 633
+153T738 211T804 309T827 449Q827 592 739 667T483 743Q456 743 425 741T362 734T302 726T252 717L162 774L217 1462H907V1296H375L336 877Q368 883 420 890T545 897Z" />
+<glyph unicode="6" glyph-name="six" horiz-adv-x="1128" d="M113 625Q113 730 123 834T160 1033T233 1211T350 1353T520 1448T752 1483Q771 1483 794 1482T840 1479T885 1473T924 1464V1309Q889 1321 845 1327T758 1333Q668 1333 600 1312T481 1251T398 1158T343
+1039T312 899T299 745H311Q331 781 359 812T426 866T511 902T618 915Q713 915 790 886T921 799T1004 660T1034 471Q1034 357 1003 266T914 112T774 14T590 -20Q490 -20 403 19T251 138T150 339T113 625ZM588 133Q648 133 697 153T783 215T838 320T858 471Q858 541
+842 596T792 691T710 751T594 772Q527 772 472 749T377 688T317 602T295 506Q295 439 313 373T368 253T460 167T588 133Z" />
+<glyph unicode="7" glyph-name="seven" horiz-adv-x="1128" d="M281 0L844 1296H90V1462H1030V1317L475 0H281Z" />
+<glyph unicode="8" glyph-name="eight" horiz-adv-x="1128" d="M565 1485Q649 1485 723 1463T854 1397T944 1287T977 1133Q977 1066 957 1012T902 915T819 837T715 774Q773 743 828 705T927 620T997 513T1024 381Q1024 289 991 215T897 88T752 8T565 -20Q455 -20
+370 7T226 84T137 208T106 373Q106 448 128 508T189 616T279 701T389 766Q340 797 297 833T223 915T173 1014T154 1135Q154 1222 187 1287T278 1397T409 1463T565 1485ZM285 371Q285 318 301 274T351 198T437 149T561 131Q631 131 684 148T774 198T828 277T846
+379Q846 431 827 473T771 551T683 619T569 682L539 696Q413 636 349 559T285 371ZM563 1333Q457 1333 395 1280T332 1126Q332 1069 349 1028T398 955T472 898T567 848Q615 870 657 896T731 955T781 1030T799 1126Q799 1227 736 1280T563 1333Z" />
+<glyph unicode="9" glyph-name="nine" horiz-adv-x="1128" d="M1028 838Q1028 733 1018 629T981 429T908 252T791 109T621 15T389 -20Q370 -20 347 -19T301 -16T256 -10T217 -2V154Q252 141 296 135T383 129Q518 129 605 176T743 303T815 491T842 717H829Q809
+681 781 650T715 596T629 560T522 547Q427 547 350 576T219 663T136 802T106 991Q106 1105 137 1196T226 1351T366 1449T551 1483Q652 1483 739 1444T890 1325T991 1124T1028 838ZM553 1329Q493 1329 444 1309T358 1247T303 1142T283 991Q283 921 299 866T349 771T431
+711T547 690Q615 690 670 713T764 774T824 860T846 956Q846 1023 828 1089T773 1209T681 1296T553 1329Z" />
+<glyph unicode=":" glyph-name="colon" horiz-adv-x="549" d="M147 111Q147 149 157 175T184 218T224 242T274 250Q300 250 323 243T364 219T391 176T401 111Q401 74 391 48T364 4T324 -21T274 -29Q247 -29 224 -21T184 4T157 47T147 111ZM147 987Q147 1026 157
+1052T184 1095T224 1119T274 1126Q300 1126 323 1119T364 1096T391 1053T401 987Q401 950 391 924T364 881T324 856T274 848Q247 848 224 856T184 881T157 924T147 987Z" />
+<glyph unicode=";" glyph-name="semicolon" horiz-adv-x="549" d="M362 238L377 215Q363 161 344 100T301 -23T252 -146T201 -264H63Q78 -203 92 -137T120 -6T145 122T164 238H362ZM147 987Q147 1026 157 1052T184 1095T224 1119T274 1126Q300 1126 323 1119T364
+1096T391 1053T401 987Q401 950 391 924T364 881T324 856T274 848Q247 848 224 856T184 881T157 924T147 987Z" />
+<glyph unicode="&lt;" glyph-name="less" horiz-adv-x="1128" d="M1026 238L102 662V764L1026 1245V1085L291 721L1026 399V238Z" />
+<glyph unicode="=" glyph-name="equal" horiz-adv-x="1128" d="M102 852V1001H1026V852H102ZM102 442V592H1026V442H102Z" />
+<glyph unicode="&gt;" glyph-name="greater" horiz-adv-x="1128" d="M102 399L838 721L102 1085V1245L1026 764V662L102 238V399Z" />
+<glyph unicode="?" glyph-name="question" horiz-adv-x="872" d="M281 414V451Q281 508 288 554T315 640T368 718T451 799Q499 840 533 873T588 941T620 1015T631 1108Q631 1156 616 1195T573 1263T502 1307T403 1323Q320 1323 245 1297T100 1237L37 1382Q118
+1424 212 1453T403 1483Q496 1483 570 1458T697 1384T777 1267T805 1110Q805 1043 792 991T751 893T684 806T590 717Q538 672 505 639T453 574T427 509T420 432V414H281ZM233 111Q233 149 243 175T270 218T310 242T360 250Q386 250 409 243T450 219T477 176T487
+111Q487 74 477 48T450 4T410 -21T360 -29Q333 -29 310 -21T270 4T243 47T233 111Z" />
+<glyph unicode="@" glyph-name="at" horiz-adv-x="1774" d="M1665 731Q1665 669 1656 607T1628 488T1581 383T1514 298T1428 242T1321 221Q1276 221 1240 236T1177 276T1135 333T1112 401H1108Q1090 364 1063 331T1001 274T921 235T823 221Q746 221 687 249T586
+327T524 449T502 606Q502 707 531 791T616 936T751 1031T928 1065Q973 1065 1018 1061T1104 1050T1179 1035T1237 1018L1214 602Q1213 580 1213 567T1212 545T1212 533T1212 526Q1212 473 1222 439T1250 385T1288 358T1333 350Q1379 350 1414 380T1472 463T1508
+585T1520 733Q1520 875 1477 985T1358 1172T1178 1287T950 1327Q781 1327 652 1272T436 1117T303 881T258 582Q258 431 297 314T413 117T603 -4T864 -45Q925 -45 984 -38T1099 -19T1205 8T1298 41V-100Q1212 -138 1104 -160T866 -182Q687 -182 547 -131T309 17T160
+255T109 575Q109 763 168 925T336 1207T601 1394T950 1462Q1106 1462 1237 1412T1463 1267T1612 1037T1665 731ZM662 602Q662 469 712 410T848 350Q903 350 942 372T1006 436T1044 535T1061 662L1075 915Q1047 923 1009 929T928 936Q854 936 804 907T722 831T676
+724T662 602Z" />
+<glyph unicode="A" glyph-name="A" horiz-adv-x="1245" d="M1055 0L895 453H350L188 0H0L537 1468H707L1245 0H1055ZM836 618L688 1042Q682 1060 674 1086T656 1142T638 1204T621 1268Q614 1237 605 1204T587 1141T570 1085T555 1042L410 618H836Z" />
+<glyph unicode="B" glyph-name="B" horiz-adv-x="1272" d="M199 1462H598Q726 1462 823 1443T986 1380T1085 1266T1118 1092Q1118 1030 1099 976T1042 881T951 813T827 776V766Q896 754 956 732T1062 670T1133 570T1159 424Q1159 324 1127 246T1033 113T883 29T684
+0H199V1462ZM385 842H629Q713 842 770 857T862 901T912 975T928 1079Q928 1199 851 1251T608 1303H385V842ZM385 686V158H651Q739 158 798 178T894 234T947 320T963 432Q963 488 947 535T893 615T793 667T639 686H385Z" />
+<glyph unicode="C" glyph-name="C" horiz-adv-x="1235" d="M793 1319Q686 1319 599 1279T451 1162T356 977T322 731Q322 590 351 481T440 296T587 182T793 143Q882 143 962 160T1120 201V39Q1081 24 1042 13T961 -6T870 -16T762 -20Q598 -20 478 34T280 187T163
+425T125 733Q125 899 168 1037T296 1274T506 1428T793 1483Q901 1483 999 1461T1176 1397L1098 1241Q1035 1273 961 1296T793 1319Z" />
+<glyph unicode="D" glyph-name="D" horiz-adv-x="1401" d="M1276 745Q1276 560 1228 421T1089 188T866 47T565 0H199V1462H606Q759 1462 883 1416T1094 1280T1228 1055T1276 745ZM1079 739Q1079 885 1046 991T950 1167T795 1269T586 1303H385V160H547Q811 160
+945 306T1079 739Z" />
+<glyph unicode="E" glyph-name="E" horiz-adv-x="1081" d="M958 0H199V1462H958V1298H385V846H920V684H385V164H958V0Z" />
+<glyph unicode="F" glyph-name="F" horiz-adv-x="1006" d="M385 0H199V1462H958V1298H385V782H920V618H385V0Z" />
+<glyph unicode="G" glyph-name="G" horiz-adv-x="1413" d="M782 772H1266V55Q1211 37 1155 23T1040 0T916 -15T776 -20Q619 -20 498 32T294 182T168 419T125 733Q125 905 172 1044T311 1280T535 1430T840 1483Q951 1483 1053 1461T1243 1397L1171 1235Q1135 1252
+1094 1267T1008 1293T918 1312T825 1319Q703 1319 609 1279T452 1162T355 977T322 731Q322 601 349 493T437 307T592 186T821 143Q865 143 901 145T969 152T1027 161T1081 172V608H782V772Z" />
+<glyph unicode="H" glyph-name="H" horiz-adv-x="1436" d="M1237 0H1051V682H385V0H199V1462H385V846H1051V1462H1237V0Z" />
+<glyph unicode="I" glyph-name="I" horiz-adv-x="694" d="M612 0H82V102L254 143V1319L82 1360V1462H612V1360L440 1319V143L612 102V0Z" />
+<glyph unicode="J" glyph-name="J" horiz-adv-x="555" d="M-29 -389Q-80 -389 -118 -383T-184 -365V-205Q-150 -214 -111 -219T-27 -225Q10 -225 47 -216T115 -181T165 -112T184 0V1462H371V20Q371 -85 342 -162T260 -289T134 -364T-29 -389Z" />
+<glyph unicode="K" glyph-name="K" horiz-adv-x="1186" d="M1186 0H975L524 698L385 584V0H199V1462H385V731L506 899L958 1462H1167L647 825L1186 0Z" />
+<glyph unicode="L" glyph-name="L" horiz-adv-x="1006" d="M199 0V1462H385V166H958V0H199Z" />
+<glyph unicode="M" glyph-name="M" horiz-adv-x="1782" d="M803 0L360 1280H352Q358 1206 362 1133Q366 1070 368 1001T371 874V0H199V1462H475L887 270H893L1307 1462H1583V0H1397V887Q1397 939 1399 1006T1404 1134Q1408 1205 1411 1278H1403L956 0H803Z" />
+<glyph unicode="N" glyph-name="N" horiz-adv-x="1493" d="M1294 0H1079L360 1210H352Q358 1133 362 1057Q366 992 368 921T371 793V0H199V1462H412L1128 258H1135Q1132 334 1128 408Q1127 440 1126 473T1123 540T1121 605T1120 662V1462H1294V0Z" />
+<glyph unicode="O" glyph-name="O" horiz-adv-x="1520" d="M1393 733Q1393 564 1353 425T1232 187T1034 34T760 -20Q597 -20 478 34T280 187T163 425T125 735Q125 905 163 1043T280 1280T479 1431T762 1485Q917 1485 1034 1432T1232 1280T1352 1043T1393 733ZM322
+733Q322 596 348 487T427 301T563 184T760 143Q874 143 956 183T1092 300T1171 486T1196 733Q1196 871 1171 980T1093 1164T958 1280T762 1321Q648 1321 565 1281T428 1165T348 980T322 733Z" />
+<glyph unicode="P" glyph-name="P" horiz-adv-x="1180" d="M1075 1034Q1075 943 1048 859T957 711T791 608T535 569H385V0H199V1462H561Q695 1462 792 1434T952 1351T1045 1216T1075 1034ZM385 727H514Q607 727 676 743T791 794T860 886T883 1024Q883 1166 801
+1234T545 1303H385V727Z" />
+<glyph unicode="Q" glyph-name="Q" horiz-adv-x="1518" d="M1393 733Q1393 602 1369 489T1297 286T1178 129T1014 25Q1057 -69 1125 -140T1284 -272L1163 -414Q1060 -341 974 -242T836 -16Q819 -18 799 -19T760 -20Q597 -20 478 34T280 187T163 425T125 735Q125
+905 163 1043T280 1280T479 1431T762 1485Q917 1485 1034 1432T1232 1280T1352 1043T1393 733ZM322 733Q322 596 348 487T427 301T563 184T760 143Q874 143 956 183T1092 300T1171 486T1196 733Q1196 871 1171 980T1093 1164T958 1280T762 1321Q648 1321 565 1281T428
+1165T348 980T322 733Z" />
+<glyph unicode="R" glyph-name="R" horiz-adv-x="1208" d="M385 604V0H199V1462H555Q821 1462 948 1359T1075 1047Q1075 960 1051 895T986 784T893 706T786 655L1184 0H965L614 604H385ZM385 762H549Q639 762 702 779T805 831T864 917T883 1038Q883 1110 863 1160T801
+1242T696 1288T545 1303H385V762Z" />
+<glyph unicode="S" glyph-name="S" horiz-adv-x="1063" d="M969 391Q969 294 935 218T836 88T680 8T473 -20Q362 -20 266 -3T104 49V227Q138 211 181 196T273 168T372 149T473 141Q633 141 709 201T786 373Q786 427 772 467T721 540T623 605T469 674Q380 709 315
+750T207 844T144 962T123 1112Q123 1200 155 1269T245 1385T383 1458T561 1483Q680 1483 775 1461T944 1403L877 1247Q812 1276 730 1297T559 1319Q437 1319 370 1263T303 1110Q303 1053 318 1012T368 937T460 874T602 811Q693 775 761 737T876 651T945 540T969
+391Z" />
+<glyph unicode="T" glyph-name="T" horiz-adv-x="1063" d="M625 0H438V1298H20V1462H1042V1298H625V0Z" />
+<glyph unicode="U" glyph-name="U" horiz-adv-x="1430" d="M1245 1464V516Q1245 402 1212 304T1113 134T946 21T709 -20Q581 -20 483 18T319 128T218 298T184 520V1462H371V510Q371 335 457 239T719 143Q808 143 872 170T977 246T1038 363T1059 512V1464H1245Z" />
+<glyph unicode="V" glyph-name="V" horiz-adv-x="1163" d="M965 1462H1163L674 0H487L0 1462H197L492 535Q521 444 542 360T580 201Q595 275 618 359T672 541L965 1462Z" />
+<glyph unicode="W" glyph-name="W" horiz-adv-x="1810" d="M809 1462H1006L1235 606Q1250 550 1264 494T1291 386T1313 286T1329 201Q1333 239 1339 284T1353 378T1370 479T1391 580L1591 1462H1790L1423 0H1235L981 938Q967 989 954 1043T930 1144Q918 1199 907
+1251Q896 1200 885 1145Q875 1098 863 1042T836 932L594 0H406L20 1462H217L440 573Q452 527 462 478T480 379T496 285T508 201Q513 238 520 287T538 390T559 499T584 604L809 1462Z" />
+<glyph unicode="X" glyph-name="X" horiz-adv-x="1120" d="M1120 0H909L555 635L188 0H0L453 764L31 1462H229L561 903L895 1462H1085L664 770L1120 0Z" />
+<glyph unicode="Y" glyph-name="Y" horiz-adv-x="1079" d="M539 723L879 1462H1079L633 569V0H446V559L0 1462H203L539 723Z" />
+<glyph unicode="Z" glyph-name="Z" horiz-adv-x="1104" d="M1022 0H82V145L793 1296H102V1462H1001V1317L291 166H1022V0Z" />
+<glyph unicode="[" glyph-name="bracketleft" horiz-adv-x="621" d="M569 -324H164V1462H569V1313H346V-174H569V-324Z" />
+<glyph unicode="\" glyph-name="backslash" horiz-adv-x="764" d="M201 1462L745 0H567L23 1462H201Z" />
+<glyph unicode="]" glyph-name="bracketright" horiz-adv-x="621" d="M51 -174H274V1313H51V1462H457V-324H51V-174Z" />
+<glyph unicode="^" glyph-name="asciicircum" horiz-adv-x="1090" d="M41 549L500 1473H602L1049 549H888L551 1284L202 549H41Z" />
+<glyph unicode="_" glyph-name="underscore" horiz-adv-x="842" d="M846 -324H-4V-184H846V-324Z" />
+<glyph unicode="` + "`" + `" glyph-name="grave" horiz-adv-x="1182" d="M786 1241H666Q631 1269 590 1310T511 1396T441 1480T393 1548V1569H612Q628 1535 649 1495T694 1414T741 1335T786 1268V1241Z" />
+<glyph unicode="a" glyph-name="a" horiz-adv-x="1087" d="M793 0L756 152H748Q715 107 682 75T610 21T523 -10T412 -20Q343 -20 285 -1T185 59T118 161T94 307Q94 471 209 559T561 655L745 662V731Q745 798 731 843T689 915T621 955T528 967Q445 967 374 943T236
+885L172 1022Q246 1062 337 1090T528 1118Q630 1118 704 1098T827 1033T900 919T924 752V0H793ZM459 127Q520 127 572 146T662 203T721 300T743 438V537L600 530Q510 526 449 510T352 466T299 397T283 305Q283 213 331 170T459 127Z" />
+<glyph unicode="b" glyph-name="b" horiz-adv-x="1200" d="M670 1118Q764 1118 841 1082T972 975T1057 797T1087 551Q1087 410 1057 304T973 125T841 17T670 -20Q611 -20 563 -7T477 27T409 78T356 139H344L307 0H174V1556H356V1180Q356 1145 355 1106T352 1032Q350
+992 348 954H356Q379 989 408 1019T475 1071T562 1105T670 1118ZM635 967Q555 967 502 942T416 864T370 734T356 551Q356 450 369 372T415 240T502 159T637 131Q772 131 835 240T899 553Q899 761 836 864T635 967Z" />
+<glyph unicode="c" glyph-name="c" horiz-adv-x="948" d="M594 -20Q493 -20 405 11T252 111T150 286T113 543Q113 700 151 809T255 987T411 1087T602 1118Q680 1118 754 1101T879 1059L825 905Q802 915 774 924T716 941T657 953T602 958Q445 958 373 858T301 545Q301
+334 373 237T594 139Q675 139 740 157T860 201V39Q806 10 745 -5T594 -20Z" />
+<glyph unicode="d" glyph-name="d" horiz-adv-x="1200" d="M852 147H844Q822 113 793 83T725 29T638 -7T530 -20Q437 -20 360 16T228 123T143 301T113 547Q113 688 143 794T228 973T360 1081T530 1118Q589 1118 637 1105T723 1070T792 1019T844 958H856Q853 992
+850 1023Q848 1049 846 1076T844 1120V1556H1026V0H879L852 147ZM565 131Q641 131 693 154T778 224T826 341T844 506V547Q844 648 831 726T785 858T698 939T563 967Q428 967 365 858T301 545Q301 336 364 234T565 131Z" />
+<glyph unicode="e" glyph-name="e" horiz-adv-x="1096" d="M608 -20Q498 -20 407 17T251 125T149 301T113 541Q113 677 146 784T239 965T382 1079T567 1118Q666 1118 745 1083T879 983T963 828T993 627V514H301Q306 321 382 230T610 139Q661 139 704 144T788 158T867
+182T944 215V53Q904 34 866 20T787 -3T703 -16T608 -20ZM563 967Q449 967 383 889T305 662H797Q797 730 784 786T742 883T669 945T563 967Z" />
+<glyph unicode="f" glyph-name="f" horiz-adv-x="674" d="M651 961H406V0H223V961H29V1036L223 1104V1200Q223 1307 245 1377T310 1490T415 1549T555 1567Q614 1567 663 1556T752 1530L705 1389Q674 1400 638 1408T561 1417Q521 1417 492 1408T444 1374T416 1309T406
+1202V1098H651V961Z" />
+<glyph unicode="g" glyph-name="g" horiz-adv-x="1061" d="M1020 1098V985L823 958Q851 923 870 869T889 745Q889 669 866 605T795 493T677 420T514 393Q492 393 470 393T434 397Q417 387 401 375T371 346T349 310T340 266Q340 239 352 223T384 197T433 185T492
+182H668Q761 182 825 159T929 95T988 1T1006 -115Q1006 -203 974 -273T874 -391T705 -466T463 -492Q356 -492 276 -471T143 -410T64 -314T37 -186Q37 -126 56 -81T109 -2T185 52T276 84Q234 103 207 144T180 238Q180 299 212 343T313 430Q270 448 235 479T175 551T137
+640T123 739Q123 828 148 898T222 1017T344 1092T514 1118Q551 1118 590 1113T657 1098H1020ZM209 -180Q209 -217 222 -249T264 -304T342 -340T463 -354Q649 -354 741 -297T834 -131Q834 -85 822 -56T783 -11T710 12T600 18H424Q389 18 351 10T282 -20T230 -80T209
+-180ZM301 745Q301 630 355 574T508 518Q608 518 659 573T711 748Q711 871 659 929T506 987Q407 987 354 927T301 745Z" />
+<glyph unicode="h" glyph-name="h" horiz-adv-x="1206" d="M860 0V707Q860 837 808 902T643 967Q562 967 507 941T419 864T371 739T356 569V0H174V1556H356V1094L348 950H358Q383 993 417 1024T493 1077T580 1108T674 1118Q857 1118 949 1023T1042 717V0H860Z" />
+<glyph unicode="i" glyph-name="i" horiz-adv-x="530" d="M356 0H174V1098H356V0ZM160 1395Q160 1455 190 1482T266 1509Q288 1509 307 1503T341 1482T364 1447T373 1395Q373 1337 342 1309T266 1280Q221 1280 191 1308T160 1395Z" />
+<glyph unicode="j" glyph-name="j" horiz-adv-x="530" d="M66 -492Q18 -492 -13 -485T-68 -467V-319Q-42 -329 -15 -334T47 -340Q74 -340 97 -333T137 -306T164 -254T174 -170V1098H356V-158Q356 -235 339 -296T286 -401T196 -468T66 -492ZM160 1395Q160 1455
+190 1482T266 1509Q288 1509 307 1503T341 1482T364 1447T373 1395Q373 1337 342 1309T266 1280Q221 1280 191 1308T160 1395Z" />
+<glyph unicode="k" glyph-name="k" horiz-adv-x="1016" d="M342 567L477 737L770 1098H981L580 623L1008 0H799L463 504L354 422V0H174V1556H354V842L338 567H342Z" />
+<glyph unicode="l" glyph-name="l" horiz-adv-x="530" d="M356 0H174V1556H356V0Z" />
+<glyph unicode="m" glyph-name="m" horiz-adv-x="1835" d="M1489 0V707Q1489 837 1439 902T1284 967Q1211 967 1160 944T1077 875T1029 762T1014 606V0H831V707Q831 837 782 902T627 967Q550 967 498 941T415 864T370 739T356 569V0H174V1098H322L348 950H358Q382
+993 415 1024T487 1077T571 1108T662 1118Q782 1118 861 1074T979 936H987Q1013 983 1049 1017T1129 1073T1221 1107T1319 1118Q1494 1118 1582 1023T1671 717V0H1489Z" />
+<glyph unicode="n" glyph-name="n" horiz-adv-x="1206" d="M860 0V707Q860 837 808 902T643 967Q562 967 507 941T419 864T371 739T356 569V0H174V1098H322L348 950H358Q383 993 417 1024T493 1077T580 1108T674 1118Q857 1118 949 1023T1042 717V0H860Z" />
+<glyph unicode="o" glyph-name="o" horiz-adv-x="1182" d="M1069 551Q1069 414 1036 308T940 129T788 18T588 -20Q485 -20 398 18T248 128T149 307T113 551Q113 687 146 792T242 970T393 1080T594 1118Q697 1118 784 1081T934 971T1033 793T1069 551ZM301 551Q301
+342 369 237T592 131Q746 131 813 236T881 551Q881 760 813 863T590 967Q436 967 369 864T301 551Z" />
+<glyph unicode="p" glyph-name="p" horiz-adv-x="1200" d="M670 -20Q611 -20 563 -7T477 27T409 78T356 139H344Q347 105 350 74Q352 48 354 21T356 -23V-492H174V1098H322L348 950H356Q379 985 408 1015T475 1068T562 1104T670 1118Q764 1118 841 1082T972 975T1057
+797T1087 551Q1087 410 1057 304T973 125T841 17T670 -20ZM635 967Q559 967 507 944T422 874T374 757T356 592V551Q356 450 369 372T415 240T502 159T637 131Q772 131 835 240T899 553Q899 761 836 864T635 967Z" />
+<glyph unicode="q" glyph-name="q" horiz-adv-x="1200" d="M565 131Q641 131 693 154T778 224T826 341T844 506V547Q844 648 831 726T785 858T698 939T563 967Q428 967 365 858T301 545Q301 336 364 234T565 131ZM530 -20Q437 -20 360 16T228 123T143 301T113
+547Q113 688 143 794T228 973T360 1081T530 1118Q589 1118 637 1105T723 1069T791 1016T844 950H852L879 1098H1026V-492H844V-23Q844 -4 846 25T850 81Q853 113 856 147H844Q822 113 793 83T725 29T638 -7T530 -20Z" />
+<glyph unicode="r" glyph-name="r" horiz-adv-x="817" d="M649 1118Q678 1118 714 1116T776 1108L752 940Q724 945 695 948T639 952Q576 952 524 927T435 854T377 740T356 592V0H174V1098H322L344 897H352Q377 940 405 980T469 1050T549 1099T649 1118Z" />
+<glyph unicode="s" glyph-name="s" horiz-adv-x="924" d="M831 301Q831 221 802 161T719 61T587 0T414 -20Q305 -20 227 -3T90 49V215Q121 199 159 184T239 156T325 137T414 129Q479 129 524 140T598 171T640 221T653 287Q653 318 643 343T607 392T534 442T416
+498Q344 529 287 559T189 626T128 711T106 827Q106 897 133 951T211 1043T331 1099T487 1118Q584 1118 664 1097T817 1042L754 895Q689 924 621 945T481 967Q379 967 330 934T281 838Q281 803 292 777T332 728T407 682T524 629Q596 599 652 569T749 502T810 416T831
+301Z" />
+<glyph unicode="t" glyph-name="t" horiz-adv-x="694" d="M506 129Q524 129 546 131T590 136T628 143T655 150V12Q642 6 622 0T578 -10T528 -17T477 -20Q415 -20 362 -4T271 51T210 156T188 324V961H33V1042L188 1120L266 1350H371V1098H647V961H371V324Q371 227
+402 178T506 129Z" />
+<glyph unicode="u" glyph-name="u" horiz-adv-x="1206" d="M885 0L858 147H848Q823 104 789 73T713 21T626 -10T532 -20Q441 -20 372 3T257 75T188 200T164 381V1098H346V391Q346 261 399 196T563 131Q644 131 699 157T787 233T835 358T850 528V1098H1032V0H885Z" />
+<glyph unicode="v" glyph-name="v" horiz-adv-x="981" d="M375 0L0 1098H188L387 487Q398 454 413 402T443 296T470 194T487 121H494Q499 146 511 194T538 296T568 402T594 487L793 1098H981L606 0H375Z" />
+<glyph unicode="w" glyph-name="w" horiz-adv-x="1528" d="M1008 0L840 616Q836 634 830 656T818 704T806 755T793 806Q779 864 764 926H758Q744 863 731 805Q720 755 708 702T684 612L512 0H301L20 1098H211L342 514Q352 469 362 417T381 313T397 216T408 141H414Q419
+167 427 210T446 302T468 398T489 479L668 1098H864L1036 479Q1045 445 1056 399T1079 306T1099 214T1112 141H1118Q1121 167 1127 210T1143 306T1162 412T1184 514L1321 1098H1507L1223 0H1008Z" />
+<glyph unicode="x" glyph-name="x" horiz-adv-x="1024" d="M408 563L55 1098H262L512 688L762 1098H969L614 563L987 0H780L512 436L242 0H35L408 563Z" />
+<glyph unicode="y" glyph-name="y" horiz-adv-x="1001" d="M10 1098H199L414 485Q428 445 442 401T469 313T491 228T504 152H510Q515 177 526 220T550 311T578 407T604 487L803 1098H991L557 -143Q529 -224 497 -288T421 -398T320 -467T182 -492Q130 -492 92 -487T27
+-475V-330Q48 -335 80 -338T147 -342Q195 -342 230 -331T291 -297T335 -243T369 -170L426 -10L10 1098Z" />
+<glyph unicode="z" glyph-name="z" horiz-adv-x="903" d="M821 0H82V125L618 961H115V1098H803V952L279 137H821V0Z" />
+<glyph unicode="{" glyph-name="braceleft" horiz-adv-x="725" d="M500 -16Q500 -64 512 -94T546 -142T601 -166T674 -174V-324Q597 -323 532 -307T419 -255T344 -164T317 -31V303Q317 406 252 449T61 492V647Q186 647 251 690T317 836V1169Q317 1247 344 1302T418
+1392T531 1444T674 1462V1313Q634 1312 602 1306T547 1282T512 1234T500 1155V823Q500 718 441 657T266 575V563Q381 543 440 482T500 315V-16Z" />
+<glyph unicode="|" glyph-name="bar" horiz-adv-x="1128" d="M489 1556H639V-492H489V1556Z" />
+<glyph unicode="}" glyph-name="braceright" horiz-adv-x="725" d="M225 315Q225 421 284 482T459 563V575Q344 595 285 656T225 823V1155Q225 1203 213 1233T179 1281T124 1305T51 1313V1462Q128 1461 193 1445T306 1393T381 1302T408 1169V836Q408 784 424 748T473
+690T554 657T664 647V492Q539 492 474 449T408 303V-31Q408 -109 381 -164T307 -254T194 -306T51 -324V-174Q91 -173 123 -167T178 -143T213 -95T225 -16V315Z" />
+<glyph unicode="~" glyph-name="asciitilde" horiz-adv-x="1128" d="M530 651Q493 667 466 678T416 695T373 704T330 707Q302 707 272 698T213 672T155 633T102 586V748Q202 856 350 856Q379 856 404 854T456 845T517 826T598 793Q635 777 662 766T713 749T757
+740T799 737Q827 737 857 746T916 772T974 811T1026 858V696Q927 588 778 588Q749 588 724 590T672 599T611 618T530 651Z" />
+<glyph unicode="&#xa0;" glyph-name="nbspace" horiz-adv-x="532" />
+<glyph unicode="&#xa1;" glyph-name="exclamdown" horiz-adv-x="551" d="M213 676H334L385 -373H162L213 676ZM401 979Q401 941 392 915T365 872T324 848T274 840Q248 840 225 847T185 871T157 914T147 979Q147 1016 157 1042T184 1085T225 1110T274 1118Q301
+1118 324 1110T364 1085T391 1042T401 979Z" />
+<glyph unicode="&#xa2;" glyph-name="cent" horiz-adv-x="1128" d="M886 212T831 197T700 180V-20H563V186Q476 199 407 236T289 340T214 506T188 743Q188 884 214 985T289 1155T407 1260T563 1311V1483H700V1319Q772 1316 840 1300T954 1260L901 1106Q878 1116
+850 1125T792 1142T733 1154T678 1159Q521 1159 449 1058T377 745Q377 535 449 438T670 340Q751 340 816 358T936 401V240Q886 212 831 197Z" />
+<glyph unicode="&#xa3;" glyph-name="sterling" horiz-adv-x="1128" d="M666 1481Q772 1481 859 1459T1012 1401L946 1257Q890 1286 820 1307T674 1329Q626 1329 585 1316T514 1273T468 1196T451 1083V788H827V651H451V440Q451 378 440 334T409 257T364 204T311
+166H1059V0H68V154Q112 165 148 185T211 240T253 322T268 438V651H70V788H268V1112Q268 1199 297 1267T379 1383T505 1456T666 1481Z" />
+<glyph unicode="&#xa4;" glyph-name="currency" horiz-adv-x="1128" d="M186 723Q186 782 203 835T252 936L123 1065L221 1163L348 1034Q395 1066 449 1084T563 1102Q623 1102 676 1084T776 1034L905 1163L1004 1067L874 938Q905 892 923 838T942 723Q942 663
+925 608T874 508L1001 381L905 285L776 412Q730 381 677 364T563 346Q503 346 448 364T348 414L221 287L125 383L252 510Q221 555 204 609T186 723ZM324 723Q324 673 342 630T393 554T469 502T563 483Q614 483 658 502T736 553T788 629T807 723Q807 774 788 818T736
+896T659 948T563 967Q513 967 470 948T394 896T343 819T324 723Z" />
+<glyph unicode="&#xa5;" glyph-name="yen" horiz-adv-x="1128" d="M563 723L909 1462H1100L715 694H954V557H653V399H954V262H653V0H475V262H174V399H475V557H174V694H408L29 1462H221L563 723Z" />
+<glyph unicode="&#xa6;" glyph-name="brokenbar" horiz-adv-x="1128" d="M489 1556H639V776H489V1556ZM489 289H639V-492H489V289Z" />
+<glyph unicode="&#xa7;" glyph-name="section" horiz-adv-x="995" d="M137 809Q137 860 150 901T185 975T237 1029T297 1067Q222 1105 180 1162T137 1303Q137 1364 164 1413T242 1496T362 1548T518 1567Q615 1567 693 1547T844 1495L788 1356Q723 1384 653 1403T512
+1423Q413 1423 362 1394T311 1307Q311 1280 323 1257T363 1212T439 1167T557 1114Q629 1086 685 1054T781 982T841 895T862 784Q862 732 850 690T818 613T771 555T717 514Q786 476 824 422T862 289Q862 218 833 163T749 69T618 10T444 -10Q336 -10 258 6T121 55V213Q152
+198 190 183T270 157T356 138T444 131Q513 131 559 143T633 174T672 219T684 272Q684 301 676 323T642 368T569 415T446 471Q373 502 316 533T218 603T158 692T137 809ZM291 831Q291 794 305 763T350 702T432 646T555 588L590 573Q610 586 630 604T667 645T694
+696T705 758Q705 796 692 828T647 889T560 947T424 1006Q399 998 376 983T333 945T303 893T291 831Z" />
+<glyph unicode="&#xa8;" glyph-name="dieresis" horiz-adv-x="1182" d="M307 1395Q307 1449 335 1473T403 1497Q442 1497 471 1473T500 1395Q500 1342 471 1317T403 1292Q363 1292 335 1317T307 1395ZM682 1395Q682 1449 710 1473T778 1497Q797 1497 814 1491T845
+1473T866 1441T874 1395Q874 1342 845 1317T778 1292Q738 1292 710 1317T682 1395Z" />
+<glyph unicode="&#xa9;" glyph-name="copyright" horiz-adv-x="1704" d="M891 1053Q830 1053 783 1031T704 968T656 866T639 731Q639 653 653 593T698 492T776 430T891 408Q914 408 941 411T996 421T1053 435T1106 453V322Q1082 311 1058 302T1007 286T950 276T885
+272Q783 272 707 305T581 399T505 545T479 733Q479 834 506 917T585 1061T714 1154T891 1188Q954 1188 1020 1172T1145 1126L1083 999Q1031 1025 983 1039T891 1053ZM100 731Q100 835 127 931T202 1110T320 1263T472 1380T652 1456T852 1483Q956 1483 1052 1456T1231
+1381T1384 1263T1501 1111T1577 931T1604 731Q1604 627 1577 531T1502 352T1384 200T1232 82T1052 7T852 -20Q748 -20 652 6T473 82T320 199T203 351T127 531T100 731ZM209 731Q209 598 259 481T397 277T602 139T852 88Q985 88 1102 138T1306 276T1444 481T1495
+731Q1495 864 1445 981T1307 1185T1102 1323T852 1374Q719 1374 602 1324T398 1186T260 981T209 731Z" />
+<glyph unicode="&#xaa;" glyph-name="ordfeminine" horiz-adv-x="678" d="M487 797L459 879Q441 857 422 840T379 810T327 791T264 784Q221 784 185 797T123 835T83 899T68 989Q68 1091 138 1145T352 1204L451 1208V1239Q451 1311 421 1339T334 1368Q286 1368
+241 1354T154 1317L106 1417Q157 1443 215 1461T334 1479Q459 1479 518 1426T578 1251V797H487ZM377 1110Q326 1107 292 1098T238 1074T208 1038T199 987Q199 936 224 914T291 891Q325 891 354 901T404 934T438 988T451 1065V1114L377 1110Z" />
+<glyph unicode="&#xab;" glyph-name="guillemotleft" horiz-adv-x="997" d="M82 553L391 967L508 889L270 541L508 193L391 115L82 526V553ZM489 553L799 967L915 889L678 541L915 193L799 115L489 526V553Z" />
+<glyph unicode="&#xac;" glyph-name="logicalnot" horiz-adv-x="1128" d="M1026 797V262H877V647H102V797H1026Z" />
+<glyph unicode="&#xad;" glyph-name="uni00AD" horiz-adv-x="659" d="M82 465V633H578V465H82Z" />
+<glyph unicode="&#xae;" glyph-name="registered" horiz-adv-x="1704" d="M743 768H815Q906 768 945 804T985 909Q985 983 944 1012T813 1042H743V768ZM1145 913Q1145 865 1132 828T1096 762T1045 713T985 680Q1052 570 1105 483Q1128 446 1149 411T1186 347T1213
+302L1223 285H1044L838 637H743V285H586V1178H819Q987 1178 1066 1113T1145 913ZM100 731Q100 835 127 931T202 1110T320 1263T472 1380T652 1456T852 1483Q956 1483 1052 1456T1231 1381T1384 1263T1501 1111T1577 931T1604 731Q1604 627 1577 531T1502 352T1384
+200T1232 82T1052 7T852 -20Q748 -20 652 6T473 82T320 199T203 351T127 531T100 731ZM209 731Q209 598 259 481T397 277T602 139T852 88Q985 88 1102 138T1306 276T1444 481T1495 731Q1495 864 1445 981T1307 1185T1102 1323T852 1374Q719 1374 602 1324T398 1186T260
+981T209 731Z" />
+<glyph unicode="&#xaf;" glyph-name="overscore" horiz-adv-x="1024" d="M1030 1556H-6V1696H1030V1556Z" />
+<glyph unicode="&#xb0;" glyph-name="degree" horiz-adv-x="877" d="M123 1167Q123 1232 148 1289T215 1390T315 1458T438 1483Q503 1483 560 1458T661 1390T729 1290T754 1167Q754 1102 729 1045T661 946T561 879T438 854Q373 854 316 878T216 945T148 1045T123
+1167ZM246 1167Q246 1128 261 1094T302 1033T363 992T438 977Q478 977 513 992T574 1033T616 1093T631 1167Q631 1207 616 1242T575 1304T513 1346T438 1362Q398 1362 363 1347T302 1305T261 1243T246 1167Z" />
+<glyph unicode="&#xb1;" glyph-name="plusminus" horiz-adv-x="1128" d="M489 647H102V797H489V1186H639V797H1026V647H639V262H489V647ZM102 0V150H1026V0H102Z" />
+<glyph unicode="&#xb2;" glyph-name="twosuperior" horiz-adv-x="678" d="M621 586H49V698L258 926Q315 988 351 1030T407 1106T434 1169T442 1233Q442 1298 409 1330T322 1362Q271 1362 225 1337T133 1274L55 1368Q109 1416 175 1448T324 1481Q384 1481 432 1465T515
+1417T567 1340T586 1237Q586 1187 572 1144T530 1059T464 971T373 870L225 713H621V586Z" />
+<glyph unicode="&#xb3;" glyph-name="threesuperior" horiz-adv-x="678" d="M590 1255Q590 1177 550 1124T440 1047Q528 1024 572 971T616 840Q616 780 596 730T535 645T430 589T281 569Q211 569 150 581T31 625V758Q94 724 160 705T279 686Q377 686 421 727T465
+842Q465 916 412 949T262 983H164V1096H262Q354 1096 396 1135T438 1239Q438 1271 428 1294T401 1333T360 1355T309 1362Q250 1362 202 1342T102 1284L33 1380Q62 1403 92 1421T157 1453T229 1473T311 1481Q380 1481 432 1464T520 1417T572 1346T590 1255Z" />
+<glyph unicode="&#xb4;" glyph-name="acute" horiz-adv-x="1182" d="M393 1268Q415 1297 438 1335T485 1413T530 1494T567 1569H786V1548Q770 1521 739 1481T669 1396T590 1311T514 1241H393V1268Z" />
+<glyph unicode="&#xb5;" glyph-name="mu" horiz-adv-x="1217" d="M356 391Q356 261 409 196T573 131Q655 131 710 157T798 233T846 358T860 528V1098H1042V0H895L868 147H858Q810 64 738 22T563 -20Q491 -20 438 3T350 68Q351 30 353 -10Q355 -45 355 -87T356
+-172V-492H174V1098H356V391Z" />
+<glyph unicode="&#xb6;" glyph-name="paragraph" horiz-adv-x="1341" d="M1126 -260H1006V1397H799V-260H678V559Q617 541 532 541Q437 541 360 566T228 651T143 806T113 1042Q113 1189 145 1287T237 1446T380 1531T563 1556H1126V-260Z" />
+<glyph unicode="&#xb7;" glyph-name="middot" horiz-adv-x="549" d="M147 723Q147 761 157 787T184 830T224 854T274 862Q300 862 323 855T364 831T391 788T401 723Q401 686 391 660T364 617T324 592T274 584Q247 584 224 592T184 617T157 660T147 723Z" />
+<glyph unicode="&#xb8;" glyph-name="cedilla" horiz-adv-x="420" d="M408 -287Q408 -384 338 -438T117 -492Q95 -492 73 -489T35 -483V-375Q50 -378 74 -379T115 -381Q186 -381 226 -360T266 -289Q266 -265 253 -248T217 -217T163 -195T94 -176L184 0H305L248
+-115Q282 -123 311 -136T361 -169T395 -219T408 -287Z" />
+<glyph unicode="&#xb9;" glyph-name="onesuperior" horiz-adv-x="678" d="M307 1462H442V586H297V1102Q297 1127 297 1157T299 1217T302 1275T305 1325Q291 1308 272 1288T231 1251L137 1178L63 1274L307 1462Z" />
+<glyph unicode="&#xba;" glyph-name="ordmasculine" horiz-adv-x="717" d="M651 1133Q651 1050 631 985T572 876T479 808T356 784Q293 784 240 807T148 875T88 985T66 1133Q66 1216 86 1280T145 1389T237 1456T360 1479Q422 1479 475 1456T568 1389T629 1281T651
+1133ZM197 1133Q197 1014 234 954T358 893Q443 893 480 953T518 1133Q518 1253 481 1310T358 1368Q272 1368 235 1311T197 1133Z" />
+<glyph unicode="&#xbb;" glyph-name="guillemotright" horiz-adv-x="997" d="M918 526L608 115L492 193L729 541L492 889L608 967L918 553V526ZM510 526L201 115L84 193L322 541L84 889L201 967L510 553V526Z" />
+<glyph unicode="&#xbc;" glyph-name="onequarter" horiz-adv-x="1509" d="M307 1462H442V586H297V1102Q297 1127 297 1157T299 1217T302 1275T305 1325Q291 1308 272 1288T231 1251L137 1178L63 1274L307 1462ZM1202 1462L391 0H234L1045 1462H1202ZM1419 193H1294V1H1151V193H776V304L1153
+883H1294V320H1419V193ZM1151 320V515Q1151 557 1152 606T1157 705Q1152 694 1142 676T1121 636T1098 595T1077 560L922 320H1151Z" />
+<glyph unicode="&#xbd;" glyph-name="onehalf" horiz-adv-x="1509" d="M544 1462H679V586H534V1102Q534 1127 534 1157T536 1217T539 1275T542 1325Q528 1308 509 1288T468 1251L374 1178L300 1274L544 1462ZM1181 1462L370 0H213L1024 1462H1181ZM1440 1H868V113L1077
+341Q1134 403 1170 445T1226 521T1253 584T1261 648Q1261 713 1228 745T1141 777Q1090 777 1044 752T952 689L874 783Q928 831 994 863T1143 896Q1203 896 1251 880T1334 832T1386 755T1405 652Q1405 602 1391 559T1349 474T1283 386T1192 285L1044 128H1440V1Z"
+/>
+<glyph unicode="&#xbe;" glyph-name="threequarters" horiz-adv-x="1509" d="M590 1255Q590 1177 550 1124T440 1047Q528 1024 572 971T616 840Q616 780 596 730T535 645T430 589T281 569Q211 569 150 581T31 625V758Q94 724 160 705T279 686Q377 686 421 727T465
+842Q465 916 412 949T262 983H164V1096H262Q354 1096 396 1135T438 1239Q438 1271 428 1294T401 1333T360 1355T309 1362Q250 1362 202 1342T102 1284L33 1380Q62 1403 92 1421T157 1453T229 1473T311 1481Q380 1481 432 1464T520 1417T572 1346T590 1255ZM1296
+1462L485 0H328L1139 1462H1296ZM1486 193H1361V1H1218V193H843V304L1220 883H1361V320H1486V193ZM1218 320V515Q1218 557 1219 606T1224 705Q1219 694 1209 676T1188 636T1165 595T1144 560L989 320H1218Z" />
+<glyph unicode="&#xbf;" glyph-name="questiondown" horiz-adv-x="872" d="M592 676V639Q592 581 584 536T557 450T505 371T422 291Q374 250 340 217T285 149T253 75T242 -18Q242 -66 257 -105T300 -173T371 -217T469 -233Q553 -233 628 -208T772 -147L836 -293Q754
+-335 660 -364T469 -393Q376 -393 302 -368T176 -294T96 -177T68 -20Q68 48 81 100T121 197T188 284T283 373Q335 418 368 451T420 516T446 580T453 657V676H592ZM639 979Q639 941 630 915T603 872T562 848T512 840Q486 840 463 847T423 871T395 914T385 979Q385
+1016 395 1042T422 1085T463 1110T512 1118Q539 1118 562 1110T602 1085T629 1042T639 979Z" />
+<glyph unicode="&#xc0;" glyph-name="Agrave" horiz-adv-x="1245" d="M1055 0L895 453H350L188 0H0L537 1468H707L1245 0H1055ZM836 618L688 1042Q682 1060 674 1086T656 1142T638 1204T621 1268Q614 1237 605 1204T587 1141T570 1085T555 1042L410 618H836ZM719
+1579H599Q564 1607 523 1648T444 1734T374 1818T326 1886V1907H545Q561 1873 582 1833T627 1752T674 1673T719 1606V1579Z" />
+<glyph unicode="&#xc1;" glyph-name="Aacute" horiz-adv-x="1245" d="M1055 0L895 453H350L188 0H0L537 1468H707L1245 0H1055ZM836 618L688 1042Q682 1060 674 1086T656 1142T638 1204T621 1268Q614 1237 605 1204T587 1141T570 1085T555 1042L410 618H836ZM534
+1606Q556 1635 579 1673T626 1751T671 1832T708 1907H927V1886Q911 1859 880 1819T810 1734T731 1649T655 1579H534V1606Z" />
+<glyph unicode="&#xc2;" glyph-name="Acircumflex" horiz-adv-x="1245" d="M1055 0L895 453H350L188 0H0L537 1468H707L1245 0H1055ZM836 618L688 1042Q682 1060 674 1086T656 1142T638 1204T621 1268Q614 1237 605 1204T587 1141T570 1085T555 1042L410 618H836ZM953
+1579H832Q781 1613 727 1661T621 1765Q567 1710 514 1662T410 1579H289V1606Q315 1635 349 1673T416 1751T479 1832T525 1907H717Q733 1873 762 1833T825 1752T893 1673T953 1606V1579Z" />
+<glyph unicode="&#xc3;" glyph-name="Atilde" horiz-adv-x="1245" d="M1055 0L895 453H350L188 0H0L537 1468H707L1245 0H1055ZM836 618L688 1042Q682 1060 674 1086T656 1142T638 1204T621 1268Q614 1237 605 1204T587 1141T570 1085T555 1042L410 618H836ZM772
+1581Q732 1581 693 1598T615 1637T542 1676T475 1694Q430 1694 406 1668T368 1579H264Q269 1639 285 1688T328 1771T392 1824T475 1843Q517 1843 557 1826T636 1787T708 1749T772 1731Q817 1731 840 1757T878 1845H983Q978 1785 962 1737T919 1654T855 1600T772
+1581Z" />
+<glyph unicode="&#xc4;" glyph-name="Adieresis" horiz-adv-x="1245" d="M1055 0L895 453H350L188 0H0L537 1468H707L1245 0H1055ZM836 618L688 1042Q682 1060 674 1086T656 1142T638 1204T621 1268Q614 1237 605 1204T587 1141T570 1085T555 1042L410 618H836ZM340
+1733Q340 1787 368 1811T436 1835Q475 1835 504 1811T533 1733Q533 1680 504 1655T436 1630Q396 1630 368 1655T340 1733ZM715 1733Q715 1787 743 1811T811 1835Q830 1835 847 1829T878 1811T899 1779T907 1733Q907 1680 878 1655T811 1630Q771 1630 743 1655T715
+1733Z" />
+<glyph unicode="&#xc5;" glyph-name="Aring" horiz-adv-x="1245" d="M1055 0L895 453H350L188 0H0L537 1468H707L1245 0H1055ZM836 618L688 1042Q682 1060 674 1086T656 1142T638 1204T621 1268Q614 1237 605 1204T587 1141T570 1085T555 1042L410 618H836ZM848
+1583Q848 1532 831 1492T783 1423T710 1381T619 1366Q569 1366 528 1380T458 1423T412 1490T396 1581Q396 1632 412 1671T457 1739T528 1781T619 1796Q667 1796 709 1782T782 1740T830 1673T848 1583ZM731 1581Q731 1634 700 1664T619 1694Q569 1694 538 1664T506
+1581Q506 1528 534 1498T619 1468Q668 1468 699 1498T731 1581Z" />
+<glyph unicode="&#xc6;" glyph-name="AE" horiz-adv-x="1745" d="M1622 0H862V453H387L184 0H-2L653 1462H1622V1298H1049V846H1583V684H1049V164H1622V0ZM459 618H862V1298H754L459 618Z" />
+<glyph unicode="&#xc7;" glyph-name="Ccedilla" horiz-adv-x="1235" d="M793 1319Q686 1319 599 1279T451 1162T356 977T322 731Q322 590 351 481T440 296T587 182T793 143Q882 143 962 160T1120 201V39Q1081 24 1042 13T961 -6T870 -16T762 -20Q598 -20 478 34T280
+187T163 425T125 733Q125 899 168 1037T296 1274T506 1428T793 1483Q901 1483 999 1461T1176 1397L1098 1241Q1035 1273 961 1296T793 1319ZM916 -287Q916 -384 846 -438T625 -492Q603 -492 581 -489T543 -483V-375Q558 -378 582 -379T623 -381Q694 -381 734 -360T774
+-289Q774 -265 761 -248T725 -217T671 -195T602 -176L692 0H813L756 -115Q790 -123 819 -136T869 -169T903 -219T916 -287Z" />
+<glyph unicode="&#xc8;" glyph-name="Egrave" horiz-adv-x="1081" d="M958 0H199V1462H958V1298H385V846H920V684H385V164H958V0ZM713 1579H593Q558 1607 517 1648T438 1734T368 1818T320 1886V1907H539Q555 1873 576 1833T621 1752T668 1673T713 1606V1579Z" />
+<glyph unicode="&#xc9;" glyph-name="Eacute" horiz-adv-x="1081" d="M958 0H199V1462H958V1298H385V846H920V684H385V164H958V0ZM456 1606Q478 1635 501 1673T548 1751T593 1832T630 1907H849V1886Q833 1859 802 1819T732 1734T653 1649T577 1579H456V1606Z" />
+<glyph unicode="&#xca;" glyph-name="Ecircumflex" horiz-adv-x="1081" d="M958 0H199V1462H958V1298H385V846H920V684H385V164H958V0ZM907 1579H786Q735 1613 681 1661T575 1765Q521 1710 468 1662T364 1579H243V1606Q269 1635 303 1673T370 1751T433 1832T479
+1907H671Q687 1873 716 1833T779 1752T847 1673T907 1606V1579Z" />
+<glyph unicode="&#xcb;" glyph-name="Edieresis" horiz-adv-x="1081" d="M958 0H199V1462H958V1298H385V846H920V684H385V164H958V0ZM296 1733Q296 1787 324 1811T392 1835Q431 1835 460 1811T489 1733Q489 1680 460 1655T392 1630Q352 1630 324 1655T296 1733ZM671
+1733Q671 1787 699 1811T767 1835Q786 1835 803 1829T834 1811T855 1779T863 1733Q863 1680 834 1655T767 1630Q727 1630 699 1655T671 1733Z" />
+<glyph unicode="&#xcc;" glyph-name="Igrave" horiz-adv-x="694" d="M612 0H82V102L254 143V1319L82 1360V1462H612V1360L440 1319V143L612 102V0ZM455 1579H335Q300 1607 259 1648T180 1734T110 1818T62 1886V1907H281Q297 1873 318 1833T363 1752T410 1673T455
+1606V1579Z" />
+<glyph unicode="&#xcd;" glyph-name="Iacute" horiz-adv-x="694" d="M612 0H82V102L254 143V1319L82 1360V1462H612V1360L440 1319V143L612 102V0ZM257 1606Q279 1635 302 1673T349 1751T394 1832T431 1907H650V1886Q634 1859 603 1819T533 1734T454 1649T378
+1579H257V1606Z" />
+<glyph unicode="&#xce;" glyph-name="Icircumflex" horiz-adv-x="694" d="M612 0H82V102L254 143V1319L82 1360V1462H612V1360L440 1319V143L612 102V0ZM681 1579H560Q509 1613 455 1661T349 1765Q295 1710 242 1662T138 1579H17V1606Q43 1635 77 1673T144 1751T207
+1832T253 1907H445Q461 1873 490 1833T553 1752T621 1673T681 1606V1579Z" />
+<glyph unicode="&#xcf;" glyph-name="Idieresis" horiz-adv-x="694" d="M612 0H82V102L254 143V1319L82 1360V1462H612V1360L440 1319V143L612 102V0ZM64 1733Q64 1787 92 1811T160 1835Q199 1835 228 1811T257 1733Q257 1680 228 1655T160 1630Q120 1630 92 1655T64
+1733ZM439 1733Q439 1787 467 1811T535 1835Q554 1835 571 1829T602 1811T623 1779T631 1733Q631 1680 602 1655T535 1630Q495 1630 467 1655T439 1733Z" />
+<glyph unicode="&#xd0;" glyph-name="Eth" horiz-adv-x="1401" d="M47 805H199V1462H606Q759 1462 883 1416T1094 1280T1228 1055T1276 745Q1276 560 1228 421T1089 188T866 47T565 0H199V643H47V805ZM1079 739Q1079 885 1046 991T950 1167T795 1269T586 1303H385V805H721V643H385V160H547Q811
+160 945 306T1079 739Z" />
+<glyph unicode="&#xd1;" glyph-name="Ntilde" horiz-adv-x="1493" d="M1294 0H1079L360 1210H352Q358 1133 362 1057Q366 992 368 921T371 793V0H199V1462H412L1128 258H1135Q1132 334 1128 408Q1127 440 1126 473T1123 540T1121 605T1120 662V1462H1294V0ZM905
+1581Q865 1581 826 1598T748 1637T675 1676T608 1694Q563 1694 539 1668T501 1579H397Q402 1639 418 1688T461 1771T525 1824T608 1843Q650 1843 690 1826T769 1787T841 1749T905 1731Q950 1731 973 1757T1011 1845H1116Q1111 1785 1095 1737T1052 1654T988 1600T905
+1581Z" />
+<glyph unicode="&#xd2;" glyph-name="Ograve" horiz-adv-x="1520" d="M1393 733Q1393 564 1353 425T1232 187T1034 34T760 -20Q597 -20 478 34T280 187T163 425T125 735Q125 905 163 1043T280 1280T479 1431T762 1485Q917 1485 1034 1432T1232 1280T1352 1043T1393
+733ZM322 733Q322 596 348 487T427 301T563 184T760 143Q874 143 956 183T1092 300T1171 486T1196 733Q1196 871 1171 980T1093 1164T958 1280T762 1321Q648 1321 565 1281T428 1165T348 980T322 733ZM870 1579H750Q715 1607 674 1648T595 1734T525 1818T477 1886V1907H696Q712
+1873 733 1833T778 1752T825 1673T870 1606V1579Z" />
+<glyph unicode="&#xd3;" glyph-name="Oacute" horiz-adv-x="1520" d="M1393 733Q1393 564 1353 425T1232 187T1034 34T760 -20Q597 -20 478 34T280 187T163 425T125 735Q125 905 163 1043T280 1280T479 1431T762 1485Q917 1485 1034 1432T1232 1280T1352 1043T1393
+733ZM322 733Q322 596 348 487T427 301T563 184T760 143Q874 143 956 183T1092 300T1171 486T1196 733Q1196 871 1171 980T1093 1164T958 1280T762 1321Q648 1321 565 1281T428 1165T348 980T322 733ZM651 1606Q673 1635 696 1673T743 1751T788 1832T825 1907H1044V1886Q1028
+1859 997 1819T927 1734T848 1649T772 1579H651V1606Z" />
+<glyph unicode="&#xd4;" glyph-name="Ocircumflex" horiz-adv-x="1520" d="M1393 733Q1393 564 1353 425T1232 187T1034 34T760 -20Q597 -20 478 34T280 187T163 425T125 735Q125 905 163 1043T280 1280T479 1431T762 1485Q917 1485 1034 1432T1232 1280T1352
+1043T1393 733ZM322 733Q322 596 348 487T427 301T563 184T760 143Q874 143 956 183T1092 300T1171 486T1196 733Q1196 871 1171 980T1093 1164T958 1280T762 1321Q648 1321 565 1281T428 1165T348 980T322 733ZM1096 1579H975Q924 1613 870 1661T764 1765Q710
+1710 657 1662T553 1579H432V1606Q458 1635 492 1673T559 1751T622 1832T668 1907H860Q876 1873 905 1833T968 1752T1036 1673T1096 1606V1579Z" />
+<glyph unicode="&#xd5;" glyph-name="Otilde" horiz-adv-x="1520" d="M1393 733Q1393 564 1353 425T1232 187T1034 34T760 -20Q597 -20 478 34T280 187T163 425T125 735Q125 905 163 1043T280 1280T479 1431T762 1485Q917 1485 1034 1432T1232 1280T1352 1043T1393
+733ZM322 733Q322 596 348 487T427 301T563 184T760 143Q874 143 956 183T1092 300T1171 486T1196 733Q1196 871 1171 980T1093 1164T958 1280T762 1321Q648 1321 565 1281T428 1165T348 980T322 733ZM891 1581Q851 1581 812 1598T734 1637T661 1676T594 1694Q549
+1694 525 1668T487 1579H383Q388 1639 404 1688T447 1771T511 1824T594 1843Q636 1843 676 1826T755 1787T827 1749T891 1731Q936 1731 959 1757T997 1845H1102Q1097 1785 1081 1737T1038 1654T974 1600T891 1581Z" />
+<glyph unicode="&#xd6;" glyph-name="Odieresis" horiz-adv-x="1520" d="M1393 733Q1393 564 1353 425T1232 187T1034 34T760 -20Q597 -20 478 34T280 187T163 425T125 735Q125 905 163 1043T280 1280T479 1431T762 1485Q917 1485 1034 1432T1232 1280T1352 1043T1393
+733ZM322 733Q322 596 348 487T427 301T563 184T760 143Q874 143 956 183T1092 300T1171 486T1196 733Q1196 871 1171 980T1093 1164T958 1280T762 1321Q648 1321 565 1281T428 1165T348 980T322 733ZM477 1733Q477 1787 505 1811T573 1835Q612 1835 641 1811T670
+1733Q670 1680 641 1655T573 1630Q533 1630 505 1655T477 1733ZM852 1733Q852 1787 880 1811T948 1835Q967 1835 984 1829T1015 1811T1036 1779T1044 1733Q1044 1680 1015 1655T948 1630Q908 1630 880 1655T852 1733Z" />
+<glyph unicode="&#xd7;" glyph-name="multiply" horiz-adv-x="1128" d="M459 723L141 1042L246 1147L563 829L885 1147L989 1044L668 723L987 403L885 301L563 618L246 303L143 406L459 723Z" />
+<glyph unicode="&#xd8;" glyph-name="Oslash" horiz-adv-x="1520" d="M1300 1454L1208 1305Q1299 1206 1346 1061T1393 733Q1393 564 1353 425T1232 187T1034 34T760 -20Q571 -20 438 51L360 -76L223 2L313 147Q216 247 171 396T125 735Q125 905 163 1043T280
+1280T479 1431T762 1485Q856 1485 936 1464T1083 1405L1163 1532L1300 1454ZM322 733Q322 602 345 498T416 315L995 1260Q947 1289 890 1305T762 1321Q648 1321 565 1281T428 1165T348 980T322 733ZM1196 733Q1196 990 1108 1141L530 201Q577 173 634 158T760 143Q874
+143 956 183T1092 300T1171 486T1196 733Z" />
+<glyph unicode="&#xd9;" glyph-name="Ugrave" horiz-adv-x="1430" d="M1245 1464V516Q1245 402 1212 304T1113 134T946 21T709 -20Q581 -20 483 18T319 128T218 298T184 520V1462H371V510Q371 335 457 239T719 143Q808 143 872 170T977 246T1038 363T1059 512V1464H1245ZM847
+1579H727Q692 1607 651 1648T572 1734T502 1818T454 1886V1907H673Q689 1873 710 1833T755 1752T802 1673T847 1606V1579Z" />
+<glyph unicode="&#xda;" glyph-name="Uacute" horiz-adv-x="1430" d="M1245 1464V516Q1245 402 1212 304T1113 134T946 21T709 -20Q581 -20 483 18T319 128T218 298T184 520V1462H371V510Q371 335 457 239T719 143Q808 143 872 170T977 246T1038 363T1059 512V1464H1245ZM590
+1606Q612 1635 635 1673T682 1751T727 1832T764 1907H983V1886Q967 1859 936 1819T866 1734T787 1649T711 1579H590V1606Z" />
+<glyph unicode="&#xdb;" glyph-name="Ucircumflex" horiz-adv-x="1430" d="M1245 1464V516Q1245 402 1212 304T1113 134T946 21T709 -20Q581 -20 483 18T319 128T218 298T184 520V1462H371V510Q371 335 457 239T719 143Q808 143 872 170T977 246T1038 363T1059
+512V1464H1245ZM1043 1579H922Q871 1613 817 1661T711 1765Q657 1710 604 1662T500 1579H379V1606Q405 1635 439 1673T506 1751T569 1832T615 1907H807Q823 1873 852 1833T915 1752T983 1673T1043 1606V1579Z" />
+<glyph unicode="&#xdc;" glyph-name="Udieresis" horiz-adv-x="1430" d="M1245 1464V516Q1245 402 1212 304T1113 134T946 21T709 -20Q581 -20 483 18T319 128T218 298T184 520V1462H371V510Q371 335 457 239T719 143Q808 143 872 170T977 246T1038 363T1059 512V1464H1245ZM432
+1733Q432 1787 460 1811T528 1835Q567 1835 596 1811T625 1733Q625 1680 596 1655T528 1630Q488 1630 460 1655T432 1733ZM807 1733Q807 1787 835 1811T903 1835Q922 1835 939 1829T970 1811T991 1779T999 1733Q999 1680 970 1655T903 1630Q863 1630 835 1655T807
+1733Z" />
+<glyph unicode="&#xdd;" glyph-name="Yacute" horiz-adv-x="1079" d="M539 723L879 1462H1079L633 569V0H446V559L0 1462H203L539 723ZM442 1606Q464 1635 487 1673T534 1751T579 1832T616 1907H835V1886Q819 1859 788 1819T718 1734T639 1649T563 1579H442V1606Z" />
+<glyph unicode="&#xde;" glyph-name="Thorn" horiz-adv-x="1180" d="M1075 782Q1075 691 1048 607T957 459T791 356T535 317H385V0H199V1462H385V1210H561Q695 1210 792 1182T952 1099T1045 964T1075 782ZM385 475H514Q607 475 676 491T791 542T860 634T883 772Q883
+915 801 983T545 1051H385V475Z" />
+<glyph unicode="&#xdf;" glyph-name="germandbls" horiz-adv-x="1233" d="M1010 1260Q1010 1203 989 1159T936 1078T867 1011T798 954T745 899T723 842Q723 821 730 805T756 769T811 725T903 662Q959 625 1003 589T1077 512T1124 423T1141 313Q1141 226 1113 163T1035
+60T914 0T758 -20Q661 -20 592 -3T469 49V215Q495 199 527 184T596 156T670 137T745 129Q801 129 841 141T908 176T946 231T958 303Q958 339 950 368T920 426T862 483T770 547Q707 587 665 621T596 688T558 757T547 834Q547 888 567 927T619 998T686 1057T753 1113T804
+1175T825 1253Q825 1295 809 1326T762 1377T691 1407T598 1417Q549 1417 505 1408T428 1374T376 1309T356 1202V0H174V1200Q174 1304 205 1374T293 1487T428 1548T598 1567Q690 1567 766 1548T896 1491T980 1395T1010 1260Z" />
+<glyph unicode="&#xe0;" glyph-name="agrave" horiz-adv-x="1087" d="M793 0L756 152H748Q715 107 682 75T610 21T523 -10T412 -20Q343 -20 285 -1T185 59T118 161T94 307Q94 471 209 559T561 655L745 662V731Q745 798 731 843T689 915T621 955T528 967Q445 967
+374 943T236 885L172 1022Q246 1062 337 1090T528 1118Q630 1118 704 1098T827 1033T900 919T924 752V0H793ZM459 127Q520 127 572 146T662 203T721 300T743 438V537L600 530Q510 526 449 510T352 466T299 397T283 305Q283 213 331 170T459 127ZM934 1241H814Q779
+1269 738 1310T659 1396T589 1480T541 1548V1569H760Q776 1535 797 1495T842 1414T889 1335T934 1268V1241Z" />
+<glyph unicode="&#xe1;" glyph-name="aacute" horiz-adv-x="1087" d="M793 0L756 152H748Q715 107 682 75T610 21T523 -10T412 -20Q343 -20 285 -1T185 59T118 161T94 307Q94 471 209 559T561 655L745 662V731Q745 798 731 843T689 915T621 955T528 967Q445 967
+374 943T236 885L172 1022Q246 1062 337 1090T528 1118Q630 1118 704 1098T827 1033T900 919T924 752V0H793ZM459 127Q520 127 572 146T662 203T721 300T743 438V537L600 530Q510 526 449 510T352 466T299 397T283 305Q283 213 331 170T459 127ZM446 1268Q468 1297
+491 1335T538 1413T583 1494T620 1569H839V1548Q823 1521 792 1481T722 1396T643 1311T567 1241H446V1268Z" />
+<glyph unicode="&#xe2;" glyph-name="acircumflex" horiz-adv-x="1087" d="M793 0L756 152H748Q715 107 682 75T610 21T523 -10T412 -20Q343 -20 285 -1T185 59T118 161T94 307Q94 471 209 559T561 655L745 662V731Q745 798 731 843T689 915T621 955T528 967Q445
+967 374 943T236 885L172 1022Q246 1062 337 1090T528 1118Q630 1118 704 1098T827 1033T900 919T924 752V0H793ZM459 127Q520 127 572 146T662 203T721 300T743 438V537L600 530Q510 526 449 510T352 466T299 397T283 305Q283 213 331 170T459 127ZM1148 1241H1027Q976
+1275 922 1323T816 1427Q762 1372 709 1324T605 1241H484V1268Q510 1297 544 1335T611 1413T674 1494T720 1569H912Q928 1535 957 1495T1020 1414T1088 1335T1148 1268V1241Z" />
+<glyph unicode="&#xe3;" glyph-name="atilde" horiz-adv-x="1087" d="M793 0L756 152H748Q715 107 682 75T610 21T523 -10T412 -20Q343 -20 285 -1T185 59T118 161T94 307Q94 471 209 559T561 655L745 662V731Q745 798 731 843T689 915T621 955T528 967Q445 967
+374 943T236 885L172 1022Q246 1062 337 1090T528 1118Q630 1118 704 1098T827 1033T900 919T924 752V0H793ZM459 127Q520 127 572 146T662 203T721 300T743 438V537L600 530Q510 526 449 510T352 466T299 397T283 305Q283 213 331 170T459 127ZM955 1243Q915 1243
+876 1260T798 1299T725 1338T658 1356Q613 1356 589 1330T551 1241H447Q452 1301 468 1350T511 1433T575 1486T658 1505Q700 1505 740 1488T819 1449T891 1411T955 1393Q1000 1393 1023 1419T1061 1507H1166Q1161 1447 1145 1399T1102 1316T1038 1262T955 1243Z"
+/>
+<glyph unicode="&#xe4;" glyph-name="adieresis" horiz-adv-x="1087" d="M793 0L756 152H748Q715 107 682 75T610 21T523 -10T412 -20Q343 -20 285 -1T185 59T118 161T94 307Q94 471 209 559T561 655L745 662V731Q745 798 731 843T689 915T621 955T528 967Q445
+967 374 943T236 885L172 1022Q246 1062 337 1090T528 1118Q630 1118 704 1098T827 1033T900 919T924 752V0H793ZM459 127Q520 127 572 146T662 203T721 300T743 438V537L600 530Q510 526 449 510T352 466T299 397T283 305Q283 213 331 170T459 127ZM529 1395Q529
+1449 557 1473T625 1497Q664 1497 693 1473T722 1395Q722 1342 693 1317T625 1292Q585 1292 557 1317T529 1395ZM904 1395Q904 1449 932 1473T1000 1497Q1019 1497 1036 1491T1067 1473T1088 1441T1096 1395Q1096 1342 1067 1317T1000 1292Q960 1292 932 1317T904
+1395Z" />
+<glyph unicode="&#xe5;" glyph-name="aring" horiz-adv-x="1087" d="M793 0L756 152H748Q715 107 682 75T610 21T523 -10T412 -20Q343 -20 285 -1T185 59T118 161T94 307Q94 471 209 559T561 655L745 662V731Q745 798 731 843T689 915T621 955T528 967Q445 967
+374 943T236 885L172 1022Q246 1062 337 1090T528 1118Q630 1118 704 1098T827 1033T900 919T924 752V0H793ZM459 127Q520 127 572 146T662 203T721 300T743 438V537L600 530Q510 526 449 510T352 466T299 397T283 305Q283 213 331 170T459 127ZM1039 1458Q1039
+1407 1022 1367T974 1298T901 1256T810 1241Q760 1241 719 1255T649 1298T603 1365T587 1456Q587 1507 603 1546T648 1614T719 1656T810 1671Q858 1671 900 1657T973 1615T1021 1548T1039 1458ZM922 1456Q922 1509 891 1539T810 1569Q760 1569 729 1539T697 1456Q697
+1403 725 1373T810 1343Q859 1343 890 1373T922 1456Z" />
+<glyph unicode="&#xe6;" glyph-name="ae" horiz-adv-x="1706" d="M94 307Q94 471 209 559T561 655L745 662V731Q745 798 731 843T689 915T621 955T528 967Q445 967 374 943T236 885L172 1022Q246 1062 337 1090T528 1118Q659 1118 742 1076T868 940Q919 1025 1002
+1071T1188 1118Q1285 1118 1362 1083T1493 983T1575 828T1604 627V514H932Q937 321 1010 230T1231 139Q1280 139 1322 144T1404 158T1480 182T1554 215V53Q1515 34 1478 20T1401 -3T1319 -16T1227 -20Q1089 -20 988 37T825 209Q791 155 753 113T668 41T562 -4T430
+-20Q359 -20 298 -1T191 59T120 161T94 307ZM283 305Q283 213 331 170T459 127Q520 127 572 146T662 203T721 300T743 438V537L600 530Q510 526 449 510T352 466T299 397T283 305ZM1184 967Q1074 967 1011 889T936 662H1407Q1407 730 1394 786T1354 883T1284 945T1184
+967Z" />
+<glyph unicode="&#xe7;" glyph-name="ccedilla" horiz-adv-x="948" d="M594 -20Q493 -20 405 11T252 111T150 286T113 543Q113 700 151 809T255 987T411 1087T602 1118Q680 1118 754 1101T879 1059L825 905Q802 915 774 924T716 941T657 953T602 958Q445 958 373
+858T301 545Q301 334 373 237T594 139Q675 139 740 157T860 201V39Q806 10 745 -5T594 -20ZM730 -287Q730 -384 660 -438T439 -492Q417 -492 395 -489T357 -483V-375Q372 -378 396 -379T437 -381Q508 -381 548 -360T588 -289Q588 -265 575 -248T539 -217T485 -195T416
+-176L506 0H627L570 -115Q604 -123 633 -136T683 -169T717 -219T730 -287Z" />
+<glyph unicode="&#xe8;" glyph-name="egrave" horiz-adv-x="1096" d="M608 -20Q498 -20 407 17T251 125T149 301T113 541Q113 677 146 784T239 965T382 1079T567 1118Q666 1118 745 1083T879 983T963 828T993 627V514H301Q306 321 382 230T610 139Q661 139 704
+144T788 158T867 182T944 215V53Q904 34 866 20T787 -3T703 -16T608 -20ZM563 967Q449 967 383 889T305 662H797Q797 730 784 786T742 883T669 945T563 967ZM934 1241H814Q779 1269 738 1310T659 1396T589 1480T541 1548V1569H760Q776 1535 797 1495T842 1414T889
+1335T934 1268V1241Z" />
+<glyph unicode="&#xe9;" glyph-name="eacute" horiz-adv-x="1096" d="M608 -20Q498 -20 407 17T251 125T149 301T113 541Q113 677 146 784T239 965T382 1079T567 1118Q666 1118 745 1083T879 983T963 828T993 627V514H301Q306 321 382 230T610 139Q661 139 704
+144T788 158T867 182T944 215V53Q904 34 866 20T787 -3T703 -16T608 -20ZM563 967Q449 967 383 889T305 662H797Q797 730 784 786T742 883T669 945T563 967ZM475 1268Q497 1297 520 1335T567 1413T612 1494T649 1569H868V1548Q852 1521 821 1481T751 1396T672 1311T596
+1241H475V1268Z" />
+<glyph unicode="&#xea;" glyph-name="ecircumflex" horiz-adv-x="1096" d="M608 -20Q498 -20 407 17T251 125T149 301T113 541Q113 677 146 784T239 965T382 1079T567 1118Q666 1118 745 1083T879 983T963 828T993 627V514H301Q306 321 382 230T610 139Q661 139
+704 144T788 158T867 182T944 215V53Q904 34 866 20T787 -3T703 -16T608 -20ZM563 967Q449 967 383 889T305 662H797Q797 730 784 786T742 883T669 945T563 967ZM1144 1241H1023Q972 1275 918 1323T812 1427Q758 1372 705 1324T601 1241H480V1268Q506 1297 540
+1335T607 1413T670 1494T716 1569H908Q924 1535 953 1495T1016 1414T1084 1335T1144 1268V1241Z" />
+<glyph unicode="&#xeb;" glyph-name="edieresis" horiz-adv-x="1096" d="M608 -20Q498 -20 407 17T251 125T149 301T113 541Q113 677 146 784T239 965T382 1079T567 1118Q666 1118 745 1083T879 983T963 828T993 627V514H301Q306 321 382 230T610 139Q661 139
+704 144T788 158T867 182T944 215V53Q904 34 866 20T787 -3T703 -16T608 -20ZM563 967Q449 967 383 889T305 662H797Q797 730 784 786T742 883T669 945T563 967ZM525 1395Q525 1449 553 1473T621 1497Q660 1497 689 1473T718 1395Q718 1342 689 1317T621 1292Q581
+1292 553 1317T525 1395ZM900 1395Q900 1449 928 1473T996 1497Q1015 1497 1032 1491T1063 1473T1084 1441T1092 1395Q1092 1342 1063 1317T996 1292Q956 1292 928 1317T900 1395Z" />
+<glyph unicode="&#xec;" glyph-name="igrave" horiz-adv-x="530" d="M356 0H174V1098H356V0ZM359 1241H239Q204 1269 163 1310T84 1396T14 1480T-34 1548V1569H185Q201 1535 222 1495T267 1414T314 1335T359 1268V1241Z" />
+<glyph unicode="&#xed;" glyph-name="iacute" horiz-adv-x="530" d="M356 0H174V1098H356V0ZM185 1268Q207 1297 230 1335T277 1413T322 1494T359 1569H578V1548Q562 1521 531 1481T461 1396T382 1311T306 1241H185V1268Z" />
+<glyph unicode="&#xee;" glyph-name="icircumflex" horiz-adv-x="530" d="M356 0H174V1098H356V0ZM597 1241H476Q425 1275 371 1323T265 1427Q211 1372 158 1324T54 1241H-67V1268Q-41 1297 -7 1335T60 1413T123 1494T169 1569H361Q377 1535 406 1495T469 1414T537
+1335T597 1268V1241Z" />
+<glyph unicode="&#xef;" glyph-name="idieresis" horiz-adv-x="530" d="M356 0H174V1098H356V0ZM-18 1395Q-18 1449 10 1473T78 1497Q117 1497 146 1473T175 1395Q175 1342 146 1317T78 1292Q38 1292 10 1317T-18 1395ZM357 1395Q357 1449 385 1473T453 1497Q472
+1497 489 1491T520 1473T541 1441T549 1395Q549 1342 520 1317T453 1292Q413 1292 385 1317T357 1395Z" />
+<glyph unicode="&#xf0;" glyph-name="eth" horiz-adv-x="1182" d="M1069 573Q1069 431 1036 321T940 135T788 20T588 -20Q484 -20 397 13T246 109T147 265T111 477Q111 596 142 688T233 843T376 938T565 971Q667 971 744 942T864 852L872 856Q841 974 781 1070T631
+1247L375 1094L301 1208L518 1339Q478 1367 436 1394T346 1448L416 1571Q481 1539 542 1503T662 1423L889 1561L963 1448L768 1331Q835 1266 890 1188T985 1017T1047 813T1069 573ZM881 526Q881 582 864 635T812 730T722 796T592 821Q515 821 461 798T371 731T320
+622T303 471Q303 395 319 333T371 225T461 156T592 131Q746 131 813 230T881 526Z" />
+<glyph unicode="&#xf1;" glyph-name="ntilde" horiz-adv-x="1206" d="M860 0V707Q860 837 808 902T643 967Q562 967 507 941T419 864T371 739T356 569V0H174V1098H322L348 950H358Q383 993 417 1024T493 1077T580 1108T674 1118Q857 1118 949 1023T1042 717V0H860ZM1015
+1243Q975 1243 936 1260T858 1299T785 1338T718 1356Q673 1356 649 1330T611 1241H507Q512 1301 528 1350T571 1433T635 1486T718 1505Q760 1505 800 1488T879 1449T951 1411T1015 1393Q1060 1393 1083 1419T1121 1507H1226Q1221 1447 1205 1399T1162 1316T1098
+1262T1015 1243Z" />
+<glyph unicode="&#xf2;" glyph-name="ograve" horiz-adv-x="1182" d="M1069 551Q1069 414 1036 308T940 129T788 18T588 -20Q485 -20 398 18T248 128T149 307T113 551Q113 687 146 792T242 970T393 1080T594 1118Q697 1118 784 1081T934 971T1033 793T1069 551ZM301
+551Q301 342 369 237T592 131Q746 131 813 236T881 551Q881 760 813 863T590 967Q436 967 369 864T301 551ZM1002 1241H882Q847 1269 806 1310T727 1396T657 1480T609 1548V1569H828Q844 1535 865 1495T910 1414T957 1335T1002 1268V1241Z" />
+<glyph unicode="&#xf3;" glyph-name="oacute" horiz-adv-x="1182" d="M1069 551Q1069 414 1036 308T940 129T788 18T588 -20Q485 -20 398 18T248 128T149 307T113 551Q113 687 146 792T242 970T393 1080T594 1118Q697 1118 784 1081T934 971T1033 793T1069 551ZM301
+551Q301 342 369 237T592 131Q746 131 813 236T881 551Q881 760 813 863T590 967Q436 967 369 864T301 551ZM473 1268Q495 1297 518 1335T565 1413T610 1494T647 1569H866V1548Q850 1521 819 1481T749 1396T670 1311T594 1241H473V1268Z" />
+<glyph unicode="&#xf4;" glyph-name="ocircumflex" horiz-adv-x="1182" d="M1069 551Q1069 414 1036 308T940 129T788 18T588 -20Q485 -20 398 18T248 128T149 307T113 551Q113 687 146 792T242 970T393 1080T594 1118Q697 1118 784 1081T934 971T1033 793T1069
+551ZM301 551Q301 342 369 237T592 131Q746 131 813 236T881 551Q881 760 813 863T590 967Q436 967 369 864T301 551ZM1173 1241H1052Q1001 1275 947 1323T841 1427Q787 1372 734 1324T630 1241H509V1268Q535 1297 569 1335T636 1413T699 1494T745 1569H937Q953
+1535 982 1495T1045 1414T1113 1335T1173 1268V1241Z" />
+<glyph unicode="&#xf5;" glyph-name="otilde" horiz-adv-x="1182" d="M1069 551Q1069 414 1036 308T940 129T788 18T588 -20Q485 -20 398 18T248 128T149 307T113 551Q113 687 146 792T242 970T393 1080T594 1118Q697 1118 784 1081T934 971T1033 793T1069 551ZM301
+551Q301 342 369 237T592 131Q746 131 813 236T881 551Q881 760 813 863T590 967Q436 967 369 864T301 551ZM992 1243Q952 1243 913 1260T835 1299T762 1338T695 1356Q650 1356 626 1330T588 1241H484Q489 1301 505 1350T548 1433T612 1486T695 1505Q737 1505 777
+1488T856 1449T928 1411T992 1393Q1037 1393 1060 1419T1098 1507H1203Q1198 1447 1182 1399T1139 1316T1075 1262T992 1243Z" />
+<glyph unicode="&#xf6;" glyph-name="odieresis" horiz-adv-x="1182" d="M1069 551Q1069 414 1036 308T940 129T788 18T588 -20Q485 -20 398 18T248 128T149 307T113 551Q113 687 146 792T242 970T393 1080T594 1118Q697 1118 784 1081T934 971T1033 793T1069
+551ZM301 551Q301 342 369 237T592 131Q746 131 813 236T881 551Q881 760 813 863T590 967Q436 967 369 864T301 551ZM556 1395Q556 1449 584 1473T652 1497Q691 1497 720 1473T749 1395Q749 1342 720 1317T652 1292Q612 1292 584 1317T556 1395ZM931 1395Q931
+1449 959 1473T1027 1497Q1046 1497 1063 1491T1094 1473T1115 1441T1123 1395Q1123 1342 1094 1317T1027 1292Q987 1292 959 1317T931 1395Z" />
+<glyph unicode="&#xf7;" glyph-name="divide" horiz-adv-x="1128" d="M102 647V797H1026V647H102ZM449 373Q449 408 458 431T482 470T518 491T563 498Q586 498 607 492T644 470T669 432T678 373Q678 340 669 317T644 278T607 255T563 248Q539 248 519 255T483
+277T458 316T449 373ZM449 1071Q449 1106 458 1129T482 1168T518 1189T563 1196Q586 1196 607 1190T644 1168T669 1130T678 1071Q678 1038 669 1015T644 976T607 953T563 946Q539 946 519 953T483 975T458 1014T449 1071Z" />
+<glyph unicode="&#xf8;" glyph-name="oslash" horiz-adv-x="1182" d="M1071 551Q1071 414 1038 308T942 129T790 18T590 -20Q465 -20 367 33L299 -76L168 -2L248 129Q185 201 150 307T115 551Q115 687 148 792T244 970T395 1080T596 1118Q659 1118 715 1104T821
+1061L889 1169L1020 1096L940 967Q1002 894 1036 790T1071 551ZM303 551Q303 467 312 402T344 285L741 932Q712 949 675 958T592 967Q438 967 371 864T303 551ZM883 551Q883 710 844 809L446 164Q477 147 513 139T594 131Q748 131 815 236T883 551Z" />
+<glyph unicode="&#xf9;" glyph-name="ugrave" horiz-adv-x="1206" d="M885 0L858 147H848Q823 104 789 73T713 21T626 -10T532 -20Q441 -20 372 3T257 75T188 200T164 381V1098H346V391Q346 261 399 196T563 131Q644 131 699 157T787 233T835 358T850 528V1098H1032V0H885ZM949
+1241H829Q794 1269 753 1310T674 1396T604 1480T556 1548V1569H775Q791 1535 812 1495T857 1414T904 1335T949 1268V1241Z" />
+<glyph unicode="&#xfa;" glyph-name="uacute" horiz-adv-x="1206" d="M885 0L858 147H848Q823 104 789 73T713 21T626 -10T532 -20Q441 -20 372 3T257 75T188 200T164 381V1098H346V391Q346 261 399 196T563 131Q644 131 699 157T787 233T835 358T850 528V1098H1032V0H885ZM489
+1268Q511 1297 534 1335T581 1413T626 1494T663 1569H882V1548Q866 1521 835 1481T765 1396T686 1311T610 1241H489V1268Z" />
+<glyph unicode="&#xfb;" glyph-name="ucircumflex" horiz-adv-x="1206" d="M885 0L858 147H848Q823 104 789 73T713 21T626 -10T532 -20Q441 -20 372 3T257 75T188 200T164 381V1098H346V391Q346 261 399 196T563 131Q644 131 699 157T787 233T835 358T850 528V1098H1032V0H885ZM930
+1241H809Q758 1275 704 1323T598 1427Q544 1372 491 1324T387 1241H266V1268Q292 1297 326 1335T393 1413T456 1494T502 1569H694Q710 1535 739 1495T802 1414T870 1335T930 1268V1241Z" />
+<glyph unicode="&#xfc;" glyph-name="udieresis" horiz-adv-x="1206" d="M885 0L858 147H848Q823 104 789 73T713 21T626 -10T532 -20Q441 -20 372 3T257 75T188 200T164 381V1098H346V391Q346 261 399 196T563 131Q644 131 699 157T787 233T835 358T850 528V1098H1032V0H885ZM309
+1395Q309 1449 337 1473T405 1497Q444 1497 473 1473T502 1395Q502 1342 473 1317T405 1292Q365 1292 337 1317T309 1395ZM684 1395Q684 1449 712 1473T780 1497Q799 1497 816 1491T847 1473T868 1441T876 1395Q876 1342 847 1317T780 1292Q740 1292 712 1317T684
+1395Z" />
+<glyph unicode="&#xfd;" glyph-name="yacute" horiz-adv-x="1001" d="M10 1098H199L414 485Q428 445 442 401T469 313T491 228T504 152H510Q515 177 526 220T550 311T578 407T604 487L803 1098H991L557 -143Q529 -224 497 -288T421 -398T320 -467T182 -492Q130
+-492 92 -487T27 -475V-330Q48 -335 80 -338T147 -342Q195 -342 230 -331T291 -297T335 -243T369 -170L426 -10L10 1098ZM407 1268Q429 1297 452 1335T499 1413T544 1494T581 1569H800V1548Q784 1521 753 1481T683 1396T604 1311T528 1241H407V1268Z" />
+<glyph unicode="&#xfe;" glyph-name="thorn" horiz-adv-x="1200" d="M356 950Q379 985 408 1015T475 1068T562 1104T670 1118Q764 1118 841 1082T972 975T1057 797T1087 551Q1087 410 1057 304T973 125T841 17T670 -20Q611 -20 563 -7T477 27T409 78T356 139H344Q347
+105 350 74Q352 48 354 21T356 -23V-492H174V1556H356V1098L348 950H356ZM635 967Q559 967 507 944T422 874T374 757T356 592V551Q356 450 369 372T415 240T502 159T637 131Q772 131 835 240T899 553Q899 761 836 864T635 967Z" />
+<glyph unicode="&#xff;" glyph-name="ydieresis" horiz-adv-x="1001" d="M10 1098H199L414 485Q428 445 442 401T469 313T491 228T504 152H510Q515 177 526 220T550 311T578 407T604 487L803 1098H991L557 -143Q529 -224 497 -288T421 -398T320 -467T182 -492Q130
+-492 92 -487T27 -475V-330Q48 -335 80 -338T147 -342Q195 -342 230 -331T291 -297T335 -243T369 -170L426 -10L10 1098ZM484 1395Q484 1449 512 1473T580 1497Q619 1497 648 1473T677 1395Q677 1342 648 1317T580 1292Q540 1292 512 1317T484 1395ZM859 1395Q859
+1449 887 1473T955 1497Q974 1497 991 1491T1022 1473T1043 1441T1051 1395Q1051 1342 1022 1317T955 1292Q915 1292 887 1317T859 1395Z" />
+<glyph unicode="&#x2013;" glyph-name="endash" horiz-adv-x="1024" d="M82 465V633H942V465H82Z" />
+<glyph unicode="&#x2014;" glyph-name="emdash" horiz-adv-x="2048" d="M82 465V633H1966V465H82Z" />
+<glyph unicode="&#x2018;" glyph-name="quoteleft" horiz-adv-x="358" d="M37 961L23 983Q37 1037 56 1098T99 1221T148 1344T199 1462H336Q321 1401 307 1335T279 1204T255 1076T236 961H37Z" />
+<glyph unicode="&#x2019;" glyph-name="quoteright" horiz-adv-x="358" d="M322 1462L336 1440Q322 1385 303 1325T260 1202T211 1078T160 961H23Q37 1021 51 1087T79 1219T104 1347T123 1462H322Z" />
+<glyph unicode="&#x201a;" glyph-name="quotesinglbase" horiz-adv-x="512" d="M362 238L377 215Q363 161 344 100T301 -23T252 -146T201 -264H63Q78 -203 92 -137T120 -6T145 122T164 238H362Z" />
+<glyph unicode="&#x201c;" glyph-name="quotedblleft" horiz-adv-x="743" d="M422 961L408 983Q422 1037 441 1098T484 1221T533 1344T584 1462H721Q706 1401 692 1335T664 1204T640 1076T621 961H422ZM37 961L23 983Q37 1037 56 1098T99 1221T148 1344T199 1462H336Q321
+1401 307 1335T279 1204T255 1076T236 961H37Z" />
+<glyph unicode="&#x201d;" glyph-name="quotedblright" horiz-adv-x="743" d="M322 1462L336 1440Q322 1385 303 1325T260 1202T211 1078T160 961H23Q37 1021 51 1087T79 1219T104 1347T123 1462H322ZM707 1462L721 1440Q707 1385 688 1325T645 1202T596 1078T545
+961H408Q422 1021 436 1087T464 1219T489 1347T508 1462H707Z" />
+<glyph unicode="&#x201e;" glyph-name="quotedblbase" horiz-adv-x="897" d="M362 238L377 215Q363 161 344 100T301 -23T252 -146T201 -264H63Q78 -203 92 -137T120 -6T145 122T164 238H362ZM748 238L762 215Q748 161 729 100T686 -23T637 -146T586 -264H449Q463
+-203 477 -137T505 -6T530 122T549 238H748Z" />
+<glyph unicode="&#x2022;" glyph-name="bullet" horiz-adv-x="770" d="M150 748Q150 819 168 869T217 950T292 996T385 1010Q434 1010 477 996T552 951T602 869T621 748Q621 678 603 628T552 547T477 500T385 485Q335 485 292 500T218 546T168 628T150 748Z" />
+<glyph unicode="&#x2039;" glyph-name="guilsinglleft" horiz-adv-x="590" d="M82 553L391 967L508 889L270 541L508 193L391 115L82 526V553Z" />
+<glyph unicode="&#x203a;" glyph-name="guilsinglright" horiz-adv-x="590" d="M508 526L199 115L82 193L319 541L82 889L199 967L508 553V526Z" />
+</font>
+</defs>
+</svg>
+`)
+
+func third_partySwaggerUiFontsDroidSansV6LatinRegularSvgBytes() ([]byte, error) {
+	return _third_partySwaggerUiFontsDroidSansV6LatinRegularSvg, nil
+}
+
+func third_partySwaggerUiFontsDroidSansV6LatinRegularSvg() (*asset, error) {
+	bytes, err := third_partySwaggerUiFontsDroidSansV6LatinRegularSvgBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/fonts/droid-sans-v6-latin-regular.svg", size: 72148, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiFontsDroidSansV6LatinRegularTtf = []byte("\x00\x01\x00\x00\x00\x11\x01\x00\x00\x04\x00\x10GDEF\x00\x10\x00\xd2\x00\x00\x85\xbc\x00\x00\x00\x16GPOS\xf2ZM^\x00\x00\x85\xd4\x00\x00\x12\xc0GSUB\x00\x15\x00\n\x00\x00\x98\x94\x00\x00\x00\fOS/2\xa0\u04f5e\x00\x00u\xb4\x00\x00\x00`cmapmag\xda\x00\x00v\x14\x00\x00\x00\x8ccvt 9~>L\x00\x00\x80\x94\x00\x00\x01\xfcfpgms\xd3#\xb0\x00\x00v\xa0\x00\x00\a\x05gasp\x00\x04\x00\a\x00\x00\x85\xb0\x00\x00\x00\fglyfI;\f|\x00\x00\x01\x1c\x00\x00o(head\xf5\xf5 \xd3\x00\x00r\f\x00\x00\x006hhea\r\xc4\x05\x8a\x00\x00u\x90\x00\x00\x00$hmtxmsT\xd3\x00\x00rD\x00\x00\x03Lloca\xbe\x8a\u06c8\x00\x00pd\x00\x00\x01\xa8maxp\x03i\x01\xd3\x00\x00pD\x00\x00\x00 name\x14\x910\xde\x00\x00\x82\x90\x00\x00\x018post\xa2\xc2\x0f;\x00\x00\x83\xc8\x00\x00\x01\xe7prep\x82\xdc!\x13\x00\x00}\xa8\x00\x00\x02\xec\x00\x02\x00\x93\xff\xe3\x01\x91\x05\xb6\x00\x03\x00\x17\x00:\xb9\x00\x01\xff\xf0@\x13\n\x14H\x10\x19\x80\x19\x90\x19\xa0\x19\x04\x03\x0e\x9a\x04\x02\x02\x04\xb8\xff\xc0@\n\a\nH\x04\x01\t\x9b\x13\x02\x03\x00?/\xf5\xce\x01/+3/\x10\xe12]10+\x01#\x033\x034>\x0232\x1e\x02\x15\x14\x0e\x02#\".\x02\x01Py3\xdf\xf0\x14\".\x1b\x1a/\"\x14\x14\"/\x1a\x1b.\"\x14\x01\x9e\x04\x18\xfa\xb9&5!\x0f\x0f!5&%5\"\x10\x10\"5\x00\x00\x00\x00\x02\x00\x85\x03\xa6\x02\xb2\x05\xb6\x00\x03\x00\a\x007@#\x04\x98\a\a\t\xd0\t\xe0\t\x02/\to\t\u007f\t\x03\x00\x98\x00\x03\x10\x03\xe0\x03\xf0\x03\x04\x03\x06\x02\x02\a\x03\x03\x00?33/3\x01/]\xe1]]\x129/\xe110\x01\x03#\x03!\x03#\x03\x01J)s)\x02-)r)\x05\xb6\xfd\xf0\x02\x10\xfd\xf0\x02\x10\x00\x00\x02\x003\x00\x00\x04\xf8\x05\xb6\x00\x1b\x00\x1f\x00\x99@X\x03\x03\x1a\x1a\x18\x16\x1e\x1d\a\x04\x06\x17\x17\x06\x19\x00\x01\x04\x04\x05\xb1\x18\x18!\x15\x1f\x1c\b\x04\t\x14\x14\x12\x0f\x0e\v\x04\x13\xb1\nP\x10\x01\x10\x10\f\f\tP\n\x01\n\x1c\x01H\r\x01\r\xae\f\b\x04\f\x1f\x00\x10\xae\x11\x19\x15\x11?\x11O\x11\xdf\x11\x03\f\x11\f\x11\x05\x17\x13\x06\n\x05\x00/3?3\x1299//]\x1133\x10\xe122\x1133\x10\xe1]22\x01/]33/3/]\x10\xe4\x1792\x11\x12\x179\x113/\xe4\x17923\x11\x12\x179\x113/3/10\x01\x03!\x15!\x03#\x13!\x03#\x13!5!\x13!5!\x133\x03!\x133\x03!\x15\x01!\x13!\x03\xd7?\x01\x18\xfe\xcdR\x93T\xfe\xddR\x90N\xfe\xfe\x01\x1dA\xfe\xee\x01+R\x93R\x01%T\x90T\x01\x06\xfc\xeb\x01#@\xfe\xdd\x03}\xfe\xb8\x89\xfeT\x01\xac\xfeT\x01\xac\x89\x01H\x89\x01\xb0\xfeP\x01\xb0\xfeP\x89\xfe\xb8\x01H\x00\x03\x00{\xff\x89\x03\xd9\x06\x12\x00-\x006\x00?\x00\xb4@34/)\x01)/!\x01!\x06p/<\x01</\x1e\x01\x1e\x13 \a\x01\a\a\r.n$\x0f\x00\x1f\x00\x02\xff\x00\x01\x00\x00\x01\a\x00A\r\r7n\xe0\x19\x01\x19\xb8\xff\xc0@0\b\vH\x193\x14\x14)<<\x13.7\b=(s!%!\x1f@\x0e\x11H\x1f\x1f\x1eP!\x01\x0f!\x1f!\x02\b!4\x13s\b\x0e\b\x06\x06\x05\b\xb8\xff\xc0\xb3\n\rH\b\x00/+33/\x113\x10\xe12/^]]33/+\x113\x10\xe12\x1299\x129\x1133\x113\x01/+]\xe13/\x10\xd6^]]q2\xe1\x119/]33]3]\xe12]2]210\x01\x14\x0e\x02\a\x15#5\".\x02'5\x1e\x033\x11.\x0354>\x02753\x15\x1e\x01\x17\a.\x01'\x11\x1e\x03\a4.\x02'\x11>\x01\x01\x14\x1e\x02\x17\x11\x0e\x01\x03\xd92]\x85T\x8a2f`T !W`e/Y\x83V*1[\x81O\x8ad\xa9CB8\x8cJX\x87[.\xb0\x14+F3][\xfe\x12\x11(B1YS\x01\xbeFrT7\f\xe6\xdd\t\x12\x1a\x11\xac\x10!\x1a\x11\x01\xb2\x1eBUnJCoS5\t\xb4\xb0\x05*\x1f\x91\x19)\x06\xfeZ\x1fBSkH!7-&\x12\xfe\x8b\x0eb\x02\xa3$9/&\x11\x01q\x10Y\x00\x00\x00\x00\x05\x00f\xff\xec\x063\x05\xcb\x00\t\x00\x1d\x00'\x00;\x00?\x00]\xb2<\x10>\xb8\xff\xf0@3<><>(\x14\x1e\xb42\xb5#\xb4(A\x0fA\x01\x05\xb4\n\xb5\x00\xb4\x10\x14 \x140\x14\x03\x14?\x06>\x18%\xb67\xb7!\xb6-\x19\x03\xb6\x0f\xb7\a\xb6\x19\a\x00?\xe1\xf4\xe1?\xe1\xf4\xe1??\x01/]\xe1\xf4\xe1]\x10\xde\xe1\xf4\xe1\x11\x1299//8810\x13\x14\x1632\x11\x10#\"\x06\x05\x14\x0e\x02#\".\x0254>\x0232\x1e\x02\x01\x14\x1632\x11\x10#\"\x06\x05\x14\x0e\x02#\".\x0254>\x0232\x1e\x02\t\x01#\x01\xfaGP\x9c\x9cPG\x01\xc7$JsOIpL&#IqNKqM'\x01\xacGP\x9c\x9cPG\x01\xc6#JsOJpK&#IqNKqL'\xff\x00\xfc\u055e\x03,\x04\x02\xa5\xa5\x01J\x01H\xa3\xa5l\xacv??v\xacll\xaau>>u\xaa\xfdJ\xa5\xa4\x01I\x01H\xa3\xa5l\xabv??v\xabll\xaau>>u\xaa\x03\x92\xfaJ\x05\xb6\x00\x00\x00\x00\x03\x00m\xff\xec\x05}\x05\xcd\x00\x11\x00!\x00S\x00\x80@M'\x18\x17J\x04I,IH\nG6AGB B\x016B6B\x1d\x05;<G\x04H\x00G\x00,\x10,\x02\b,,\" H\x01HU\x1dH\x10\" \"\x02\"AA1\x12QO\x16'\x18\x17J\x04\x0fG<;\x05\x041I\x15\x0fP1\x00/\xe1?\x12\x179\x12\x179?\xe1\x119/\x01/]\xe1\x10\xc6]\x119/^]\xe1\x11\x179\x1299//]\x10\xe1\x10\xe1\x113\x11\x12\x17910\x01\x14\x1e\x02\x17>\x0354.\x02#\"\x06\x132>\x027\x01\x0e\x03\x15\x14\x1e\x02%4>\x027.\x0354>\x0232\x1e\x02\x15\x14\x0e\x02\a\x01>\x0373\x0e\x03\a\x01#'\x0e\x03#\".\x02\x01\xa6\x10!4$;V8\x1c\x19/B*Vd\x87:bTH \xfe}4P7\x1c#B`\xfe}(MoG\x1f<-\x1c2^\x8aXS\x83[02Tm<\x01`\x1b+\"\x1b\n\xb8\x0f)5A'\x01\x15\xe1\xa81`l|Ni\xa7s=\x04\x8d\"AAC%#>@F)$=,\x19Y\xfb\xaf\x17(6\x1f\x01\x97!?HU86[A$\xf0NzdV*$MWc9KwS++SwK@m]O$\xfe\x8c\x1d<DN/BobU)\xfe\u06ec-G1\x1b5g\x95\x00\x01\x00\x85\x03\xa6\x01J\x05\xb6\x00\x03\x00*@\x1c\xc0\x05\xd0\x05\xe0\x05\x03/\x05o\x05\x02\x00\x98\x00\x03\x10\x03\xe0\x03\xf0\x03\x04\x03\x02\x02\x03\x03\x00?3/\x01/]\xe1]]10\x01\x03#\x03\x01J)s)\x05\xb6\xfd\xf0\x02\x10\x00\x00\x01\x00R\xfe\xbc\x02+\x05\xb6\x00\x13\x00\x1a@\r\x06\x0e\xf2\t\xf0?\x00\x01\x00\x0e\xf9\x05\xf8\x00??\x01/]\xe1\xe4210\x134>\x0273\x06\x02\x15\x14\x1e\x02\x17#.\x03R$JqN\xac\x8c\x91%GjE\xaaNqJ$\x021}\xf3\xe5\xd3]\xc1\xfe2\xf4w\xec\xe2\xd4^Z\xce\xe1\xf0\x00\x00\x00\x00\x01\x00=\xfe\xbc\x02\x17\x05\xb6\x00\x13\x00\x1c@\x0e\x06\x0e\xf2\v\xf0\xb0\x00\x01\x00\x15\x0e\xf8\x05\xf9\x00??\x01\x10\xde]\xe1\xe4210\x01\x14\x0e\x02\a#>\x0354\x02'3\x1e\x03\x02\x17$KqN\xaaEjH$\x90\x8d\xacNqK$\x021|\xf0\xe1\xceZ^\xd4\xe2\xecw\xf4\x01\xce\xc1]\xd3\xe5\xf3\x00\x00\x01\x00R\x02w\x04\x14\x06\x14\x00\x0e\x00$@\x15\x1f\x10\x01\x00\x98\x00\x0e\x80\x0e\x90\x0e\x03\b\x0e\x1f\x06\x01\x06\x06\x00\x00\x00?2/]\x01/^]\xe5]10\x01\x03%\x17\x05\x13\a\v\x01'\x13%7\x05\x03\x02\x98+\x01\x8d\x1a\xfe\x86\xf5\xb2\xb0\x9e\xb8\xf2\xfe\x89\x1d\x01\x87+\x06\x14\xfewo\xc1\x1c\xfe\xba`\x01f\xfe\x9a`\x01F\x1c\xc1o\x01\x89\x00\x00\x01\x00f\x01\x06\x04\x02\x04\xa2\x00\v\x00)@\x18\x10\r\x01\x06\t\xaa\x03\xef\x00\x01 \x00`\x00\xa0\x00\x03\x00\t\x00\xad\x06\x03\xb3\x00?3\xe12\x01/]]2\xe12]10\x01!5!\x113\x11!\x15!\x11#\x01\xe9\xfe}\x01\x83\x96\x01\x83\xfe}\x96\x02\x87\x96\x01\x85\xfe{\x96\xfe\u007f\x00\x00\x00\x00\x01\x00?\xfe\xf8\x01y\x00\xee\x00\f\x008@\x14\xcf\x0e\x01\x10\x0e\x90\x0e\xa0\x0e\x03\x1b\f+\f\x02\f\x01\x97\x06\a\xb8\xff\xc0@\r\x10\x14H_\a\x01\x10\a\x01\a\x06\x9c\f\x00/\xed\x01/]]+3\xed2]]]10%\x17\x0e\x03\a#>\x037\x01j\x0f\x0e'/3\x19\x8a\x0f\x1d\x1b\x16\b\xee\x176z|{8=\x84\x83}5\x00\x00\x00\x00\x01\x00R\x01\xd1\x02B\x02y\x00\x03\x00\x15@\t\x02\x05@\x00\x01\x00\x00\xb9\x01\x00/\xe1\x01/]\x10\xce10\x135!\x15R\x01\xf0\x01\u0468\xa8\x00\x00\x00\x01\x00\x93\xff\xe3\x01\x91\x00\xfa\x00\x13\x005@\x1b\x80\x15\x90\x15\xa0\x15\x03\x11\x15\x01\n\x96\xc0\x00\xd0\x00\x024\x00D\x00d\x00t\x00\x04\x00\xb8\xff\xc0\xb6\a\nH\x00\x05\x9b\x0f\x00/\xed\x01/+]]\xed]]1074>\x0232\x1e\x02\x15\x14\x0e\x02#\".\x02\x93\x14\".\x1b\x1a/\"\x14\x14\"/\x1a\x1b.\"\x14o&5!\x0f\x0f!5&%5\"\x10\x10\"5\x00\x01\x00\x14\x00\x00\x02\xe7\x05\xb6\x00\x03\x00\x1e\xb1\x01\x02\xb8\xff\xf0@\t\x02\x03\x00\x10\x00\x05\x01\x00\x03\x00?/\x11\x01382/8310\t\x01#\x01\x02\xe7\xfd\xe0\xb3\x02!\x05\xb6\xfaJ\x05\xb6\x00\x00\x00\x00\x02\x00b\xff\xec\x04\b\x05\xcd\x00\x13\x00'\x00&@\x15\x1eo\x00)\x10)\x01\x14o \n\x01\n#s\x0f\a\x19s\x05\x19\x00?\xe1?\xe1\x01/]\xe1]\x10\xde\xe110\x01\x14\x02\x0e\x01#\".\x01\x0254\x12>\x0132\x1e\x01\x12\x05\x14\x1e\x0232>\x0254.\x02#\"\x0e\x02\x04\b3q\xb2\u007fv\xafs93o\xb1~w\xb0t:\xfd\x13\x1eBkMMlE\x1f\x1fElMMkB\x1e\x02\u0771\xfe\xe8\xc2ff\xc2\x01\x18\xb1\xb1\x01\x18\xc1fe\xc1\xfe\u8c96\xe0\x95KJ\x94\u15d6\xe0\x94JJ\x94\xe0\x00\x00\x01\x00\xb2\x00\x00\x02\xc7\x05\xb6\x00\x10\x005@!@\x12\x01\x0f\x01\x0e\x0e\x00n\xbf\x01\xff\x01\x02~\x01\x01\x00\x01\x10\x01 \x01@\x01\x04\x06\x01\r\x0f\x06\x00\x18\x00??\xcd\x01/^]]]\xe13/\x113]10!#\x114>\x027\x0e\x03\x0f\x01'\x013\x02\u01f0\x01\x03\x03\x01\x11\x1a\x1b\x1e\x15\x94`\x01\u007f\x96\x03\x91+baY\"\x12\x1a\x18\x1b\x12y{\x01+\x00\x00\x00\x01\x00`\x00\x00\x03\xf0\x05\xcb\x00#\x00<@ #\bo\x1b\x1b%\x10%\x01\"o\x01!\x01\x11\x11 \x01\x01\x01\b\"\x10\rs\x16\a\x02\"t\x01\x18\x00?\xe12?\xe13\x129\x01/]3/\x113\x10\xed]\x113/\xe1310)\x015\x01>\x0354.\x02#\"\x06\a'>\x0332\x1e\x02\x15\x14\x0e\x02\a\x01\x15!\x03\xf0\xfcp\x01^KvS,\"?V5_\x99Ef(\\jvA`\x9bl;5]\x81K\xfe\xe7\x02\xb1\x9c\x01}Q\x86\x80\x81L;Z? M<w$?.\x1b6e\x91[U\x9a\x95\x96Q\xfe\xd5\b\x00\x00\x00\x00\x01\x00R\xff\xec\x03\xee\x05\xcb\x009\x00]@\v!0!0\x12\x1ao\t'o\x00\xb8\xff\xc0@(\x14\x17H\x00\x00\t; ;\x01O\x12\x01\x12\x06 s\xab!\x01y!\x01\v!\x01\b!!\x15/,s5\a\x15s\x12\x0e\x19\x00?3\xe1?\xe13\x129/^]]]\xe19\x01/]]\x10\xce2/+\xe1\x10\xe1\x1199//10\x01\x14\x0e\x02\a\x15\x1e\x01\x15\x14\x0e\x02#\"&'5\x1e\x0132>\x0254.\x02+\x01532>\x0254.\x02#\"\x06\a'>\x0332\x1e\x02\x03\xc1.StG\xb1\xb8A\x84\u028am\xc1UW\xcb]\\\x86W)5b\x8dY\x85\x85Q~U,$B\\8k\xa3J\\&]n}Fl\xa3n8\x04`IxX9\f\x06\x16\xb5\x91`\xa0t@\"-\xaa.2(JlCDa?\x1e\x97(Jf=4R9\x1eC6}\x1f6)\x186a\x85\x00\x02\x00\x17\x00\x00\x04?\x05\xbe\x00\n\x00\x18\x00N@,\tV\x00\x01\x00\x00\x02n\x11\f\v\a \x03\x01\x03\x03\x1a\x10\x1a\x01w\x18\x87\x18\x02\x18_\x05\x01\x05\t\x06\x18t\x01\x05\x05\x02\x11\a\x06\x02\x18\x00??3\x129/3\xe122\x01/]3]]\x129/]3333\xe12/]210\x01#\x11#\x11!5\x013\x113!\x114>\x027#\x0e\x03\a\x01\x04?\u0570\xfd]\x02\x97\xbc\xd5\xfe{\x03\x04\x05\x01\t\a\x15\x19\x1a\v\xfee\x01H\xfe\xb8\x01H\x9f\x03\xd7\xfc0\x01d8{uf\"\x1411.\x10\xfd\xa0\x00\x00\x00\x00\x01\x00\x83\xff\xec\x03\xf6\x05\xb6\x00*\x00N@\x18&\x1ao\x05,\x10,\x01'$$(h#\x01Y#\x01##\xf0\x0f\x01\x0f\xb8\xff\xc0@\x12\b\vH\x0f\x1ds\x00\x00\x15't$\x06\x15s\x10\n\x19\x00?3\xe1?\xe1\x129/\xe1\x01/+]3/]]33\x113]\x10\xde\xe1310\x012\x1e\x02\x15\x14\x0e\x02#\".\x02'5\x1e\x0332>\x0254&#\"\x0e\x02\a'\x13!\x15!\x03>\x01\x02!c\xab\u007fHD\x86\u01403c[R!!Ybc*O|V.\xb0\xa8\x1b??9\x15Z7\x02\xb2\xfd\xec' i\x03\x817l\xa0ir\xb6~C\n\x13\x1e\x14\xac\x17$\x18\r%NvQ\x8f\x97\x05\b\t\x049\x02\xb0\xa6\xfe]\x06\x0e\x00\x00\x00\x00\x02\x00q\xff\xec\x04\n\x05\xcb\x00+\x00?\x007@ 1n\f\"A\x10A\x01\x17;o\x00\x00\x10\x00 \x00\x03\x006u\x1d\x1d\a,s'\x19\x10s\a\a\x00?\xe1?\xe1\x119/\xe1\x01/]\xe12]\x10\xde2\xe110\x134>\x0432\x1e\x02\x17\x15.\x01#\"\x0e\x04\a3>\x0332\x1e\x02\x15\x14\x0e\x02#\".\x02\x012>\x0254.\x02#\"\x0e\x02\x15\x14\x1e\x02q\x155\\\x8e\u0185\x13./+\x11#X+Z\x89dC*\x14\x03\f\x149L_;_\x9al;>t\xa4fd\xaf\x80J\x01\xdb<cH'!BcBCoN+%In\x02qi\u043f\xa4yE\x02\x05\a\x05\x9b\f\f+Nl\x83\x94P$?-\x1a;r\xa5jr\xb6\u007fDN\xa0\xf2\xfe\xb9)S\u007fWFoN*/K`0C\x85jC\x00\x00\x00\x01\x00Z\x00\x00\x04\x06\x05\xb6\x00\x06\x00+\xb1\x06\x00\xb8\xff\xf0@\x11\x00\x00\x02\x01\x05\b\x10\b\x01\x02\x05\x02t\x03\x06\x00\x18\x00??\xe12\x01/]\x10\xce2\x119/8310!\x01!5!\x15\x01\x01\x19\x023\xfd\x0e\x03\xac\xfd\xd5\x05\x10\xa6\x91\xfa\xdb\x00\x03\x00j\xff\xec\x04\x00\x05\xcd\x00'\x00:\x00J\x00\x80@S\x1e#2n\x0f\n(Hn\xc3\x05\xd3\x05\x02\xb5\x05\x01\x05\x05\x0fL\x10L\x01(n\x19>n\xd5#\x01\xcc#\x01\xba#\x01##\x10\x19 \x19\x02\x19\n\x1eh8\x988\x02Y8\x01(888H8\x038\x93C\x01&CVC\x02CC\x00-s\x14\x19;s\x00\a\x00?\xe1?\xe1\x119/]]\xc1]]]99\x01/]3/]]]\xe1\x10\xe1]\x10\xce2/]]\xe1\x129\x10\xe1\x11910\x012\x1e\x02\x15\x14\x0e\x02\a\x1e\x03\x15\x14\x0e\x02#\".\x0254>\x027.\x0354>\x02\x03\x14\x1e\x0232>\x0254.\x02/\x01\x0e\x01\x01\"\x06\x15\x14\x1e\x02\x17>\x0354&\x025T\x95qB(F`8:oW5Cy\xa9fn\xabu=-Lh:1V?%Cr\x95\xc7 DhHFkH$'If?\x1e~\x80\x01\x16j}#>W30U?$~\x05\xcd,X\x84XClWE\x1c\x1fL_vI\\\x95h86e\x92\\Kx`J\x1c\x1fIZmBW\x83X,\xfb\xa65Y?##A\\84TH@\x1f\x0e<\x9b\x03Tje9R@3\x18\x164BT6ej\x00\x00\x02\x00j\xff\xec\x04\x04\x05\xcb\x00)\x00=\x005@\x1e9\x15o\x00?\x10?\x01/n\f\x10   \x02 4u\x1b\x1b\a*s%\a\x10u\a\x1a\x00?\xe1?\xe1\x119/\xe1\x01/]3\xe1]\x10\xde\xe1210\x01\x14\x0e\x04#\".\x02'5\x1e\x0132>\x027#\x0e\x03#\".\x0254>\x0232\x1e\x02\x01\"\x0e\x02\x15\x14\x1e\x0232>\x0254.\x02\x04\x04\x155\\\x8e\u0185\x13..,\x11#X+\x87\xaef+\x05\r\x148L`;_\x9al;?s\xa5fe\xae\x80J\xfe%<cH'!BcBDnN+%In\x03Fi\u047e\xa5xE\x02\x05\x06\x05\x9c\r\f^\xa1\xd6w$>.\x1a;r\xa5jr\xb7\u007fDN\xa0\xf3\x01G(T\u007fWFoN*/K`0C\x85kB\x00\x00\x00\x00\x02\x00\x93\xff\xe3\x01\x91\x04f\x00\x13\x00'\x00>@\x1c\x10)\x80)\x90)\xa0)\x04\x1e\n\x96\x14\xc0\x00\xd0\x00\x024\x00D\x00d\x00t\x00\x04\x00\xb8\xff\xc0@\v\a\nH\x00#\x9b\x19\x10\x05\x9b\x0f\x00/\xed?\xed\x01/+]]3\xe52]1074>\x0232\x1e\x02\x15\x14\x0e\x02#\".\x02\x114>\x0232\x1e\x02\x15\x14\x0e\x02#\".\x02\x93\x14\".\x1b\x1a/\"\x14\x14\"/\x1a\x1b.\"\x14\x14\".\x1b\x1a/\"\x14\x14\"/\x1a\x1b.\"\x14o&5!\x0f\x0f!5&%5\"\x10\x10\"5\x03\x91'5!\x0e\x0e!5'%4\"\x10\x10\"4\x00\x02\x00?\xfe\xf8\x01\x91\x04f\x00\f\x00 \x00a@/\x10\"\x80\"\x90\"\xa0\"\x04\x17\x96\xc0\r\xd0\r\x02d\rt\r\x02P\r\x01D\r\x01;\r\x01\x1f\r/\r\x02\r\r\x1b\f+\f\x02\f\x01\x97\x06\a\xb8\xff\xc0@\x11\x10\x14H_\a\x01\x10\a\x01\a\x1c\x9b\x12\x10\x06\x9c\f\x00/\xed?\xed\x01/]]+3\xed2]3/]]]]]]\xe5]10%\x17\x0e\x03\a#>\x037\x034>\x0232\x1e\x02\x15\x14\x0e\x02#\".\x02\x01j\x0f\x0e'/3\x19\x8a\x0f\x1d\x1b\x16\b\x11\x14\".\x1b\x1a/\"\x14\x14\"/\x1a\x1b.\"\x14\xee\x176z|{8=\x84\x83}5\x02\xed'5!\x0e\x0e!5'%4\"\x10\x10\"4\x00\x00\x00\x01\x00f\x00\xee\x04\x02\x04\xdd\x00\x06\x00N@0\x00\b@\b\x01@\x01\x01\x01\x02\x01\x05\x05\x03\x06o\x00\u007f\x00\x020\x00\x01\x00\x00\x04 \x03\x01P\x03p\x03\x80\x03\xd0\x03\xf0\x03\x05?\x03\x01\x00\x03\x01\x06\x03\x00/^]]]q33/]]2\x129=/33\x01\x18/]]\x10\xce10%\x015\x01\x15\t\x01\x04\x02\xfcd\x03\x9c\xfd!\x02\xdf\xee\x01\xa8f\x01\xe1\xa0\xfe\x94\xfe\xbe\x00\x02\x00f\x01\xba\x04\x02\x03\xe9\x00\x03\x00\a\x00\\@=\a\x02\t@\t\x01\x04\xc6\x00\x01\xbb\x00\x01\xa9\x00\x01\x86\x00\x01{\x00\x01h\x00\x01B\x00\x019\x00\x01\x00\x04\xad\x1f\x05/\x05\x02\u007f\x05\x01\x00\x05\x10\x05\x02\x06\x05\x05\x00\xad\xf0\x01\x01\x0f\x01o\x01\x02\x01\x00/]]\xe13/^]]q\xe1\x01/]]]]]]]]3]\x10\xce210\x135!\x15\x015!\x15f\x03\x9c\xfcd\x03\x9c\x03T\x95\x95\xfef\x96\x96\x00\x00\x01\x00f\x00\xee\x04\x02\x04\xdd\x00\x06\x00N@0\x05\b@\b\x01@\x06\x01\x06\x05\x04\x01\x01\x03\x00o\x06\u007f\x06\x020\x06\x01\x06\x06\x02 \x03\x01P\x03p\x03\x80\x03\xd0\x03\xf0\x03\x05?\x03\x01\x00\x03\x01\x06\x03\x00/^]]]q33/]]3\x129=/33\x01\x18/]]\x10\xce10\x13\t\x015\x01\x15\x01f\x02\xe0\xfd \x03\x9c\xfcd\x01\x8f\x01B\x01l\xa0\xfe\x1ff\xfeX\x00\x02\x00%\xff\xe3\x03%\x05\xcb\x00'\x00;\x00>@!2\x9a(('F\x00\x00\x14\vF\x1c=/=\x01\x14\v\x17\x0f\x00\x01\x06\x00\x00-\x9b7\x13\x10Q\x17\x04\x00?\xe13/\xe52/^]\x129\x01/]\x10\xde\xe1\x119/\xe13/\xe110\x0154>\x027>\x0354.\x02#\"\x06\a'>\x0132\x1e\x02\x15\x14\x0e\x02\a\x0e\x03\x1d\x01\x034>\x0232\x1e\x02\x15\x14\x0e\x02#\".\x02\x01\x19\x0f'B20D+\x15\x1e9U8S\x96F?Q\xbca]\x95h8\x1b6P64B&\x0e\xbb\x14\".\x1b\x1a/\"\x14\x14\"/\x1a\x1b.\"\x14\x01\x9e%9\\PM*)CEO50O9\x1f4\"\x91*;3`\x8bWCiZT/-C?B,\x12\xfe\xd1&5!\x0f\x0f!5&%5\"\x10\x10\"5\x00\x00\x00\x02\x00m\xffJ\x06\x81\x05\xb6\x00W\x00h\x00o@?X\x17`'\x1f\x17\x01\u007f'\x01\x17'FF'\x17\x03N1 \x00\x01\x00j@j\x01;@N\x01N,\f[\x12\a\x12d\x1c\x0f\x12\x1f\x12\xbf\x12\x03\x06\x00\x1c\x01\a\x12\x1c\x12\x1c@6S\x03@EI\x00/3\xc1?\xc1\x1299//^]^]\x10\xc1\x113\x10\xc122\x01/]\xc1]\x10\xdeq\xc1\x11\x179///]]\x10\xc1\x10\xc110\x01\x14\x0e\x04#\".\x02'#\x0e\x03#\".\x0254>\x0232\x1e\x02\x17\x03\x0e\x01\x1c\x01\x15\x14\x1e\x0232>\x0254.\x02#\"\x04\x06\x02\x15\x14\x1e\x0232>\x027\x15\x0e\x01#\"$&\x0254\x126$32\x04\x16\x12\x01\x14\x1632>\x02?\x01.\x01#\"\x0e\x02\x06\x81\x13%9La:-I4!\x06\x04\x126GY5MwR+;o\x9eb-ZRE\x17\x17\x01\x01\x15\"+\x17.F/\x18V\x98\xd1{\xa9\xfe\xfe\xafZO\x99\xe3\x93=wod+V\u0602\xb3\xfe\xe7\xc3fv\xdb\x017\xc1\x9c\x01\x06\xbfj\xfc\x15eU7N2\x1a\x04\x0e\x1cM*Je?\x1c\x02\xdb>}qaH)\x1e2A#%B1\x1c8e\x8eVe\xa8zD\b\x0e\x11\b\xfe`\x16\x1b\x10\b\x035D(\x0f=h\x8cN\x8e\u0758Oo\xc7\xfe\uf897\xea\xa0R\x0e\x18\x1f\x11\x8d&,f\xc3\x01\x19\xb3\xbc\x01E\xee\x88e\xbd\xfe\xf1\xfe\u0545w-SsE\xfd\b\r:^x\x00\x00\x02\x00\x00\x00\x00\x04\xdd\x05\xbc\x00\a\x00\x14\x00\x84@$\x06\x05F\x02\x01F\x14\x01\x02\x14\x03I\b\x01I\x01\x01\b\x01\x00\x0e\x0e\x03\x00\x00\x10\a\x01\x80\a\x90\a\xd0\a\x03\a\xb8\xff\xc0@\x18\x06\nH\a\x10\a\a\x16\x0f\x16\x1f\x16/\x16\x8f\x16\x9f\x16\xdf\x16\x06\a\x03\x04\xb8\xff\xf0@\x11\x04\x02_\x0e \n\x0eH\x0e\x05\x14\x14\x05\x03\x04\x00\x12\x00?2?9/\x129+\xe1\x01/83^]\x113/8+]q3\x11\x129=/\x1299]]\x1299]]3310!\x03!\x03#\x013\t\x01\x03.\x03'\x0e\x03\a\x03\x04\x1f\xa0\xfd\u07e2\xbc\x02\x19\xaa\x02\x1a\xfeg\x94\x06\x11\x12\x12\b\a\x12\x12\x11\x06\x91\x01\xc5\xfe;\x05\xbc\xfaD\x02j\x01\xa8\x124<A\x1f\x1fB=3\x11\xfeX\x00\x00\x03\x00\xc7\x00\x00\x04\x87\x05\xb6\x00\x17\x00\"\x00/\x00b@>\v\x1eZ\x05\x06\x01\xe5\x06\xf5\x06\x02\xd6\x06\x01\x06\x06$*[p\x11\x80\x11\x02\x11g1\u007f1\x8f1\x02\x101\x01\x18$Z\x17d0\v#`y\x18\x01\v\x18\x01\b\x18\x18\x00$`\x17\x12\"`\x00\x03\x00?\xe1?\xe1\x119/^]]\xe19\x01\x10\xf6\xe12]]\x10\xf6]\xe1\x129/]]q\xe1210\x13!2\x1e\x02\x15\x14\x0e\x02\a\x15\x1e\x03\x15\x14\x0e\x02#!\x1332>\x0254&+\x01\x19\x01!2>\x0254.\x02#\xc7\x01\x8f\x80\u00c3B'JmEEyZ4A{\xb0o\xfe\x1b\xba\xf4TrF\x1f\x9a\xa6\xdf\x01\nXwI !K|\\\x05\xb6'W\x8dg>lR7\t\n\f-OxVd\x9dm:\x03J\x1e;Y;xh\xfd\x97\xfd\xf0(He=8^C%\x00\x00\x00\x00\x01\x00}\xff\xec\x04\x98\x05\xcb\x00#\x00L@\x14\xaf\x0e\x01\x0e@\x15\x18H\x0e\x0e\x18\xba \x01` p \x02 \xb8\xff\xc0@\x18\x06\nH  %\xaf%\x01\x05[\x18f$!\x00_\x1d\x04\r\n_\x13\x13\x00?\xe13?\xe13\x01\x10\xf6\xe1]\x113/+]]\x129/+]10\x01\"\x0e\x02\x15\x14\x1e\x023267\x15\x0e\x03#\".\x01\x0254\x12>\x0132\x16\x17\a.\x01\x03\x19k\xae{C;v\xb0vY\xa0N'NUa;\xa4\xf0\x9dLW\xa9\xfa\xa2l\xc4ON?\x94\x05'Q\x98\u0689\x8d\u06d6N#\x17\xa2\x0f\x17\x0e\al\xc6\x01\x16\xa9\xa6\x01\x14\xc6n,*\x9c .\x00\x00\x00\x02\x00\xc7\x00\x00\x04\xfc\x05\xb6\x00\f\x00\x17\x00&@\x15\r[\x00g\x19\x10\x19\x01\x14Z\x06d\x18\x13`\a\x03\x14`\x06\x12\x00?\xe1?\xe1\x01\x10\xf6\xe1]\x10\xf6\xe110\x01\x14\x02\x06\x04#!\x11!2\x1e\x01\x12\a4.\x02+\x01\x113 \x00\x04\xfc`\xb6\xfe\xf7\xa8\xfe\x92\x01\x97\x99\xf8\xae_\xc5B~\xb8u\u0262\x01\b\x01\f\x02\xe9\xb9\xfe\xe9\xbb^\x05\xb6\\\xb5\xfe\xf4\xb6\x92\u054aC\xfb\x89\x01$\x00\x00\x00\x00\x01\x00\xc7\x00\x00\x03\xbe\x05\xb6\x00\v\x00B@&\x14\b\x01\b\b\x01\x04\x00g\r\x06\nZ\x01d\f\t_O\x06\x01\x0f\x06\xaf\x06\x02\b\x06\x06\n\x05_\x02\x03\n_\x01\x12\x00?\xe1?\xe1\x129/^]q\xe1\x01\x10\xf6\xe12\x10\xe62\x119/]10)\x01\x11!\x15!\x11!\x15!\x11!\x03\xbe\xfd\t\x02\xf7\xfd\xc3\x02\x17\xfd\xe9\x02=\x05\xb6\xa4\xfe<\xa2\xfd\xf8\x00\x00\x00\x01\x00\xc7\x00\x00\x03\xbe\x05\xb6\x00\t\x00p@\x11\b\b\x01\x0f\x03\x01\xff\x03\x01\x80\x03\x90\x03\xd0\x03\x03\x03\xb8\xff\xc0@8\a\nH\x03\x03\v\x0f\v/\v\x8f\v\xaf\v\x04\a\x06\x00Z\x01d\n\t_\x0f\x06\x01\x0f\x06?\x06o\x06\xff\x06\x04\b\x06@\x1a\x1dH\x06@\x10\x15H\x06\x06\x00\x05_\x02\x03\x00\x12\x00??\xe1\x129/++^]q\xe1\x01\x10\xf6\xe12^]\x113/+]]q\x129/10!#\x11!\x15!\x11!\x15!\x01\x81\xba\x02\xf7\xfd\xc3\x02\x17\xfd\xe9\x05\xb6\xa4\xfd\xfc\xa4\x00\x00\x00\x00\x01\x00}\xff\xec\x04\xf2\x05\xcb\x00+\x007@\x1e++\f)Z\x14\x02g-\x10-\x01\x1f[\ff,+_\x00\x00$\x1a_\x11\x04$_\a\x13\x00?\xe1?\xe1\x129/\xe1\x01\x10\xf6\xe1]\x10\xf62\xe1\x119/10\x01!\x11\x0e\x03#\".\x01\x0254\x126$32\x16\x17\a.\x03#\"\x0e\x02\x15\x14\x1e\x0232>\x027\x11!\x03\x0e\x01\xe47pv\x82K\x9d\xf2\xa6V_\xb6\x01\v\xabo\xccXH$SX].z\xbc\u007fB7x\xbe\x86,I>7\x1a\xfe\xd5\x03\x04\xfd3\x12\x1c\x13\ni\xc3\x01\x17\xae\xac\x01\x16\xc3i,*\xa2\x11\x1e\x17\x0eQ\x98\u0689\x82\u061cV\x05\b\v\x05\x01\xb4\x00\x00\x01\x00\xc7\x00\x00\x04\xd5\x05\xb6\x00\v\x00=@#\t\x01Z\x00e\r\xc0\r\x01\xbf\r\x01 \r\x01\b\x04Z\x05d\f\x03_\x0f\b\x01\b\b\b\n\x06\x03\x05\x00\x12\x00?2?39/^]\xe1\x01\x10\xf6\xe12]]]\x10\xf6\xe1210!#\x11!\x11#\x113\x11!\x113\x04\u057a\xfdf\xba\xba\x02\x9a\xba\x02\xaa\xfdV\x05\xb6\xfd\x98\x02h\x00\x00\x01\x00R\x00\x00\x02d\x05\xb6\x00\v\x00W@&\v\r+\r\x02{\r\x9b\r\xab\r\xfb\r\x04T\r\x01+\r;\rK\r\x03\x1f\r\x01\x02\b\v\nZ\x05\x02\xc9\x03\x01\x03\xb8\xff\xf8@\x10\r\x10H\x00\x03\x01\x06\x03\t\x04\x06\x03\x03\n\x00\x12\x00?\xc12?\xc12\x01/^]+]\xc12\xf1\xc12_]]]]q10)\x0157\x11'5!\x15\a\x11\x17\x02d\xfd\ueb2c\x02\x12\xac\xacf)\x04\x98)ff)\xfbh)\x00\x00\x00\x01\xffH\xfe{\x01s\x05\xb6\x00\x13\x00/@\x1c\xdf\x15\x01`\x15p\x15\x02/\x15\x01\x0fZ\f\x03\x03\x00\f\x10\f\x02\a\f\r\x03\a_\x00\x00/\xe1?\x01/^]3/\x10\xe1]]]10\x03\"&'5\x1e\x0132>\x025\x113\x11\x14\x0e\x02\x1d3L\x1c\"N-%K=&\xbb;i\x93\xfe{\r\v\xa0\t\v\x132XD\x05\xb6\xfa^i\x9ae1\x00\x00\x00\x00\x01\x00\xc7\x00\x00\x04\xa2\x05\xb6\x00\f\x00d@-\x02\ff\f\x01\f\x00\n\v\x10\v\v\x01\x00\x00\x10\x00\x02\a\x00\x10\x00\x00\x0e\xb0\x0e\x01/\x0e\x01\x10\x0e\x01\b\x04Z\x05d\r\x02\x10\v\x10H\b\xb8\xff\xf0@\f\v\x10H\x02\b\x05\n\x06\x03\x00\x05\x12\x00?3?3\x1299++\x01\x10\xf6\xe12]]]\x113/8^]33/83\x119]\x11310!#\x01\a\x11#\x113\x117\x013\x01\x04\xa2\xd3\xfe=\x8b\xba\xbay\x01\xc4\xd1\xfd\xf8\x02\xbar\xfd\xb8\x05\xb6\xfd%\xa8\x023\xfd\x83\x00\x00\x01\x00\xc7\x00\x00\x03\xbe\x05\xb6\x00\x05\x00#@\x13\x04\a\xaf\a\x01\x10\a\x01\x03Z\x00d\x06\x01\x03\x03_\x00\x12\x00?\xe1?\x01\x10\xf6\xe1]]\x113103\x113\x11!\x15\u01fa\x02=\x05\xb6\xfa\xf0\xa6\x00\x01\x00\xc7\x00\x00\x06/\x05\xb6\x00\x19\x00\x8b@\x136\x19\x019\x00\x01\x17\x0e\b\f\x0fH9\x0e\x01\x0e\x11Z\x19\xb8\xff\xf8@\x1c\f\x0fH\x19\x00\b\f\x0fH\x00\r\r\f\t\x10e\x1bO\x1b\x01 \x1b\x01\x0f\x1b\x01\b\v\xb8\xff\xf8@\x1a\f\x0fH&\v\x01\v\x02\bZ\td\x1a\x18\x01\x01\x10\t\x12H\x01\x0e\v\x03\x11\f\xb8\xff\xf0\xb6\t\x12H\f\b\x00\x12\x00?22+2?33+\x113\x01\x10\xf6\xe122]+^]]]\x10\xf6\x1199\x113+3+\xe12]+210]]!\x01#\x16\x17\x1e\x01\x15\x11#\x11!\x013\x01!\x11#\x1146767#\x01\x03#\xfeE\b\x06\x04\x04\x05\xac\x01\x14\x01\x9c\x06\x01\x9e\x01\x14\xba\x04\x03\x04\x03\b\xfeA\x05\x00JI?\x8b9\xfc\x96\x05\xb6\xfbX\x04\xa8\xfaJ\x03w4\x86=GI\xfb\x02\x00\x01\x00\xc7\x00\x00\x05\x0e\x05\xb6\x00\x17\x00Q@)\x0e(\x01\x01\x01\x15Z\x00e\x19\xb0\x19\x01\x8f\x19\x01\x00\x19\x10\x19\x02'\f\x01\f\x03\tZ\nd\x18\x16\x02\x10\x06\x18H\x02\v\x03\r\xb8\xff\xf0\xb6\x06\x18H\r\n\x00\x12\x00?22+?3+3\x01\x10\xf6\xe122]]]]\x10\xf6\xe12]210!#\x01#\x16\x17\x1e\x01\x15\x11#\x113\x013&'.\x035\x113\x05\x0e\xd7\xfd1\b\x06\x04\x04\x05\xac\xd5\x02\xcc\a\x03\x04\x01\x03\x03\x01\xae\x04\xbaMLA\x8e9\xfc\xe7\x05\xb6\xfbLLJ CC>\x1a\x03 \x00\x00\x00\x00\x02\x00}\xff\xec\x05q\x05\xcd\x00\x13\x00'\x004@ \x1e[\x00g)\xc0)\x01\xbf)\x01p)\x01/)_)\x02\x14[\nf(#_\x0f\x04\x19_\x05\x13\x00?\xe1?\xe1\x01\x10\xf6\xe1]]]]\x10\xf6\xe110\x01\x14\x02\x0e\x01#\".\x01\x0254\x12>\x0132\x1e\x01\x12\x05\x14\x1e\x0232>\x0254.\x02#\"\x0e\x02\x05qQ\xa0\ud6e3\xef\x9dLL\x9e\xf0\xa3\x9b\xeb\xa0Q\xfb\xd14k\xa5rr\xa5k22j\xa4rr\xa6l4\x02\u0769\xfe\xea\xc6ll\xc6\x01\x17\xaa\xaa\x01\x15\xc4kk\xc5\xfe\ubac9\u06d9QQ\x99\u06c9\x8a\u0697QQ\x97\xda\x00\x00\x00\x00\x02\x00\xc7\x00\x00\x043\x05\xb6\x00\x0e\x00\x19\x00F@,\x15[(\x008\x00H\x00\x03\x00g\x1b\xcf\x1b\x01@\x1b\x01\x0f\x1b\x01\x06\x0f\aZ\bd\x1a\x0f`0\x06@\x06\x02\x06\x06\a\x19`\t\x03\a\x12\x00??\xe1\x119/]\xe1\x01\x10\xf6\xe12^]]]\x10\xf6]\xe110\x01\x14\x0e\x02+\x01\x11#\x11!2\x1e\x02\x0132>\x0254&+\x01\x0437~\u03d8\x96\xba\x01j\x86\xc2~<\xfdN\x81]\x8b[.\xa4\xae\xa0\x04\n[\xa8\x81M\xfd\xc7\x05\xb69m\xa0\xfeg GqQ\x8e\x89\x00\x00\x00\x02\x00}\xfeb\x05q\x05\xcd\x00\x1d\x001\x008@\"([\x00g3\xc03\x01\xbf3\x01p3\x01/3_3\x02\x1e[\x14f2-_\x19\x04#_\x05\x0f\x13\t\x00/?3\xe1?\xe1\x01\x10\xf6\xe1]]]]\x10\xf6\xe110\x01\x14\x0e\x02\a\x1e\x01\x17\a.\x01'\x0e\x01#\".\x01\x0254\x12>\x0132\x1e\x01\x12\x05\x14\x1e\x0232>\x0254.\x02#\"\x0e\x02\x05q1_\x8e]+\x89Zyg\xad3\x11)\x12\xa3\xef\x9dLL\x9e\xf0\xa3\x9b\xeb\xa0Q\xfb\xd14k\xa5rr\xa5k22j\xa4rr\xa6l4\x02\u0743\u2d44&^\x8f<\x8eI\xc6\u007f\x02\x02l\xc6\x01\x17\xaa\xaa\x01\x15\xc4kk\xc5\xfe\ubac9\u06d9QQ\x99\u06c9\x8a\u0697QQ\x97\xda\x00\x00\x00\x00\x02\x00\xc7\x00\x00\x04\xa0\x05\xb6\x00\x0f\x00\x1c\x00\x82@V\t\x0f\x19\x0f\x02\xf9\x0f\x01\x0f\b\v\x0fH\x0f\f\t\f\x01\a\f\x01\x16[\b\a\x18\a\x02\a\a\t\x0e\x01\xe9\x0e\xf9\x0e\x02\x0e\b\v\x0fH\x0e\r\x10\r\x1e?\x1e\x8f\x1e\x9f\x1e\xbf\x1e\xdf\x1e\x05 \x1e\x01\x10\x01Z\x02d\x1d\f\x03\x10`\x00\x00\x01\b\x00\x00\x01\x1c`\x03\x03\x0e\x01\x12\x00?3?\xe1\x119/^]\xe1\x129\x01\x10\xf6\xe12]]\x10\xce82+]q2/]\xe1\x129^]\x113+]q10\x01\x11#\x11! \x16\x15\x14\x0e\x02\a\x01#\x01'32>\x0254.\x02+\x01\x01\x81\xba\x01d\x01\n\xfe1Qh7\x01\x8e\xdb\xfe\xa1\xe5\xa4Z~Q%)S\u007fW\xa0\x02\\\xfd\xa4\x05\xb6\xce\xd1W\x82]>\x14\xfdq\x02\\\x9e#EgEHd@\x1d\x00\x00\x00\x01\x00h\xff\xec\x03\xc9\x05\xcb\x003\x00B@'Y#\x01#\x11Z\x00g5\xbf5\xff5\x02`5\x01?5\x01*Z\t\x1bf4\x11*\x05'_$ \x04\x0e`\t\x05\x13\x00?3\xe1?3\xe1\x1299\x01\x10\xf62\xe1]]]\x10\xf6\xe13]10\x01\x14\x0e\x02#\"&'5\x1e\x0332654.\x02'.\x0354>\x0232\x16\x17\a.\x01#\"\x06\x15\x14\x1e\x02\x17\x1e\x03\x03\xc9E\x80\xb8so\xc1A\"W`f2\xa0\x99\x1dIz]Y\x83U)@t\xa1aw\xbeJCA\xa5Xz\x86\x1eFsT[\x89\\/\x01\x87a\x99j7#\"\xb2\x10\x1f\x18\x0fxp6PC?%#Sh\x84TX\x8a_2-#\x9c\x1d+q`9SC;!$L`~\x00\x01\x00\x14\x00\x00\x04\x12\x05\xb6\x00\a\x00^@2\x0f\t\x01\xd0\t\x01O\t\xcf\t\x02\x10\t \t0\t\x03\xaf\x06\xef\x06\x02\x84\x06\x01\x06\x06\aZ\x02@\x03\xe0\x03\x02\x0f\x03\x01\b\x03\x03W\x02g\x02w\x02\x03\x02\xb8\xff\xc0@\v\a\nH\x02\a\x03_\x04\x03\x00\x12\x00??\xe12\x01/+]3/^]]\x10\xe12/]]]]]q10!#\x11!5!\x15!\x02q\xbb\xfe^\x03\xfe\xfe_\x05\x12\xa4\xa4\x00\x00\x00\x00\x01\x00\xb8\xff\xec\x04\xdd\x05\xb8\x00\x17\x00/@\x1c\x16Z\x01e\x19\xb0\x19\x01o\x19\xaf\x19\x02\x10\x19\x01\x0eZ\vd\x18\x11_\x06\x13\f\x00\x03\x00?2?\xe1\x01\x10\xf6\xe1]]]\x10\xf6\xe110\x01\x11\x14\x0e\x02#\".\x025\x113\x11\x14\x1632>\x027\x11\x04\xddB\x85\u0248\x80\u0105D\xbb\xad\xafY\x80R(\x01\x05\xb8\xfcLr\u0110RM\x8e\xc7z\x03\xae\xfcH\xaf\xc06b\x88Q\x03\xb8\x00\x01\x00\x00\x00\x00\x04\x8b\x05\xb6\x00\f\x00l@\x10\x03\x02\t\t\x04\x00`\x01p\x01\xb0\x01\xf0\x01\x04\x01\xb8\xff\xc0@\x16\x06\nH\x01\x10\x01\x01\x0e/\x0e\u007f\x0e\xbf\x0e\x03\x0e@\x06\tH\x05\x04\xb8\xff\xf0\xb4\x04\x05\x04\x03\t\xb8\xff\xe0\xb3\n\x11H\t\xb8\xff\xf0@\n\x06\tH\t\x02\x03\x12\x00\x01\x03\x00?3?33++?3\x01/83+]\x113/8+]3\x129=/3310\x013\x01#\x013\x01\x1e\x01\x17>\x017\x03\xc5\xc6\xfe\x17\xbb\xfe\x19\xc5\x01'\x1d*\x11\x0f.\x1f\x05\xb6\xfaJ\x05\xb6\xfca[\xa9JJ\xa9a\x00\x00\x00\x01\x00\x14\x00\x00\x06\xfe\x05\xb6\x00*\x00\u07f6\x10\b\x15\x18H\x10\x0f\xb8\xff\xf8\xb5\x15\x18H\x0f\a\x01\xb8\xff\xf8@\x12\x15\x18H\x01\x00\b\x15\x18H\x00\x16\x1d\b\x15\x18H\x1d\x1c\xb8\xff\xf8@/\x15\x18H\x1c%\x14\a\x01\x04\aD\a\xb4\a\x03\a\x04%\x14%$%D%T%\x05\a\x16%%\x16\a\x03\x1e\r\x00\x0e\x01p\x0e\x80\x0e\xc0\x0e\x03\x0e\xb8\xff\xc0@\x18\a\nH\x0e\x10\x0e\x0e,o,\u007f,\x02 ,0,\x02\x0f,\x01\b\x1f\x1e\xb8\xff\xf0@\x13\x1e\x16 \n\x11H\x16\x10\x06\tH\x16\r\x00\x1e\x03\a%%\xb8\xff\xe0\xb3\n\x11H%\xb8\xff\xf0\xb6\x06\tH%\x10\x1d\x12\x00?33++\x113?333++\x01/83^]]]\x113/8+]q3\x12\x179=///]^]q\x113+3+\x113+3+\x113+3+10\x013\x13\x1e\x03\x17>\x037\x133\x01#\x03.\x01'&'\x06\a\x0e\x01\a\x03#\x013\x13\x1e\x03\x17>\x037\x03)\xc5\xe5\x0f\x1d\x19\x13\x06\x04\f\x10\x13\v\xc8\xc7\xfe\x91\xbc\xfe\x0e\x1a\v\f\v\v\v\n\x19\x0e\xf2\xbc\xfe~\xc5\xdf\f\x14\x11\x0e\x05\x05\x0f\x14\x17\r\x05\xb6\xfc\xa88pi^&&Zcg1\x03r\xfaJ\x03\xaa3l/7437/p6\xfc\\\x05\xb6\xfc\x87.cb[&%blo1\x00\x01\x00\x00\x00\x00\x04`\x05\xb6\x00\v\x00\x81@\x1d\t\n\x10\n\n\x007\v\x01\v\b8\x05\x01\x05\x02\x02\x01\x00\x00\x01p\x00\x80\x00\xc0\x00\x03\x00\xb8\xff\xc0@\x14\a\nH\x00\x10\x00\x00\r\x0f\r\x1f\r/\r\u007f\r\x04\b\a\x06\xb8\xff\xf0\xb3\x06\x06\x03\x04\xb8\xff\xf0@\x10\x04(\x02\x01'\b\x01\x02\b\x04\t\x06\x03\x04\x00\x12\x00?2?3\x1299]]\x01/822/83^]\x113/8+]q39=/3]33]\x113\x18/8310!#\t\x01#\t\x013\t\x013\x01\x04`\xd3\xfe\x9e\xfe\x91\xbc\x01\xc5\xfeZ\xc6\x01L\x01N\xbe\xfe[\x02{\xfd\x85\x02\xfc\x02\xba\xfd\xd1\x02/\xfdL\x00\x00\x00\x00\x01\x00\x00\x00\x00\x047\x05\xb6\x00\b\x00s@\x19\xef\n\x01\n@\t\fH\b\xab\a\x01\x98\a\x01@\a\x01\x1b\a\x01\x0f\a\x01\a\xb8\xff\xf0@/\a\a\x05\x01\x80\x02\x01O\x02\x01\x1b\x02\x01\x02\x10\x02\x02\x00\x04Zw\x05\x87\x05\x97\x05\x03O\x05\x01\x00\x05\x10\x05\x02\a\x056\x00\x01\x00\x01\x04\x12\a\x01\x03\x00?3?\x129]\x01/^]]]\xe192/8]]]3\x113/8]]]]]3+]10\t\x013\x01\x11#\x11\x013\x02\x1b\x01T\xc8\xfeB\xbb\xfeB\xcb\x02\xd3\x02\xe3\xfc\x83\xfd\xc7\x02/\x03\x87\x00\x00\x00\x00\x01\x00R\x00\x00\x03\xfe\x05\xb6\x00\t\x008@ \t\t\x03\ag\v\x0f\v?\vO\v\x9f\v\x04\b\b\x04\x04\x01f\n\a\x04_\x05\x03\x02\b_\x01\x12\x00?\xe19?\xe19\x01\x10\xe62/2^]\x10\xe622/10)\x015\x01!5!\x15\x01!\x03\xfe\xfcT\x02\xc7\xfdM\x03\x83\xfd:\x02\u06d1\x04\u007f\xa6\x91\xfb\x81\x00\x00\x00\x00\x01\x00\xa4\xfe\xbc\x029\x05\xb6\x00\a\x00&@\x17\x04\x00\xf3\x06\xf1\x00\x01\x10\x01\xb0\x01\xc0\x01\x04\x01\x05\xf5\x02\xf8\x06\xf5\x01\xf9\x00?\xe1?\xe1\x01/]\xe1\xed210\x01!\x11!\x15#\x113\x029\xfek\x01\x95\xdf\xdf\xfe\xbc\x06\xfa\x95\xfa1\x00\x00\x01\x00\x17\x00\x00\x02\xe9\x05\xb6\x00\x03\x00!\xb7\x02\x01\x01\x10\x01\x05\x00\x03\xb8\xff\xf0\xb4\x03\x02\x01\x00\x03\x00?//\x01/83\x1138\x11310\x13\x01#\x01\xc9\x02 \xb2\xfd\xe0\x05\xb6\xfaJ\x05\xb6\x00\x00\x01\x003\xfe\xbc\x01\xc9\x05\xb6\x00\a\x00$@\x14\x03\x00\xf3\x01\xf1`\x06p\x06\x02\x06\t\x00\xf5\a\xf9\x03\xf5\x04\xf8\x00?\xe1?\xe1\x01\x10\xd6]\xe1\xed210\x173\x11#5!\x11!3\xdf\xdf\x01\x96\xfej\xae\x05\u03d5\xf9\x06\x00\x00\x01\x00)\x02%\x04\x19\x05\xc1\x00\x06\x00\x12\xb6\x03\x03\b\x00\x00\x01\x06\x00?\xcd\x01/\x113/10\x13\x013\x01#\t\x01)\x01\xcbf\x01\xbf\xa1\xfe\xaf\xfe\xa3\x02%\x03\x9c\xfcd\x02\xdf\xfd!\x00\x01\xff\xfc\xfe\xbc\x03N\xffH\x00\x03\x00\x12\xb6\x00\x00\x05\x01\x01\xba\x02\x00/\xe1\x01/\x113/10\x01!5!\x03N\xfc\xae\x03R\xfe\xbc\x8c\x00\x00\x00\x00\x01\x01\x89\x04\xd9\x03\x12\x06!\x00\r\x00\x16@\n\x00\x06\b\x80\x0f\x00_\x00\x02\x00\x00/]\x1a\xcc\x01/\xcd10\x01#.\x03'53\x1e\x03\x17\x03\x12x#RM?\x10\xdb\x10+.0\x15\x04\xd9\x1cSXQ\x1b\x15\"QQL\x1d\x00\x00\x00\x00\x02\x00^\xff\xec\x03\x9c\x04^\x00#\x002\x00T@\x11\x10\x01)G#U4\x0f4o4\x02\x060H\f\x1a\xb8\xff\xd0@\x1e\r\x11H\x1a\x10\t\fH\x1a\x1a\fV3\x19\x16P\x1d*R\x10\x10\x1d\x10$P\x02\a\x16\x00\x15\x00??3\xe1?9/\xe1\x10\xe12\x01\x10\xe62/++\x10\xe1^]\x10\xf6\xe12210!'#\x0e\x03#\".\x02546?\x0154.\x02#\"\x06\a'>\x0132\x1e\x02\x15\x11%2>\x02=\x01\a\x0e\x03\x15\x14\x16\x03\x19%\b!BN`?EtU0\xe7\xec\xb8\x1d7Q4S\x8fB@J\xb6df\x95a0\xfe/=hL+\x8fZzI a\x98-A*\x14'Q{T\xa4\xb0\b\aECZ7\x180\"\x89(8)Y\x8ab\xfd\x10\u007f&MuOc\a\x04 9Q3\\V\x00\x00\x00\x00\x02\x00\xae\xff\xec\x04?\x06\x14\x00\x1f\x00/\x008\xb5-H\x05W11\xb8\xff\xb8@\x17\nI\x15\x10%G\x12T0\x13\x00\x12\x15*P\x0f\n\x16 P\x1b\x00\x10\x00?2\xe1?3\xe1??\x01\x10\xf6\xe122+\x10\xf6\xe110\x012\x1e\x02\x15\x14\x0e\x02#\".\x02'#\a#\x113\x11\x14\x06\a\x06\a3>\x03\x17\"\x0e\x02\x15\x14\x1e\x0232654&\x02\x9e^\x9am<<m\x9a^;`M;\x17\f%\x85\xb6\x02\x02\x02\x02\b\x17:M`\x19PkA\x1b\x1bAlQ\x87\u007f\u007f\x04^H\x8f\u050c\x8d\u0550I\x1a+: \x8b\x06\x14\xfe\x88#O\"(&#<,\x19\x973h\x9cie\x9dk7\xda\xcc\xd0\xce\x00\x00\x00\x01\x00q\xff\xec\x03o\x04^\x00\x1f\x00*@\x18\x1d\r!_!\u007f!\x02\x10!\x01\x16H\x05V \x13Q\n\x10\x19Q\x00\x16\x00?\xe1?\xe1\x01\x10\xf6\xe1]]\x10\xce210\x05\".\x0254>\x0232\x16\x17\a.\x03#\"\x06\x15\x14\x163267\x15\x0e\x01\x02Re\xb0\x82JL\x85\xb2fN\x9526\x178<:\x1a\x9d\x90\x91\x94Q\x8366{\x14?\x89\u0556\x9d\u06c9>\"\x19\x9a\n\x13\x0f\t\xc9\xd4\xd3\xc3%\x19\xa2\x1d\x1e\x00\x00\x00\x00\x02\x00q\xff\xec\x04\x02\x06\x14\x00\x1f\x000\x004@\x1d&\x00\x1bG\x1eU2\x102\x01.H\vV1\x1f\x15\x1c\x00+P\x16\x10\x10 P\x01\x06\x16\x00?3\xe1?3\xe1??\x01\x10\xf6\xe1]\x10\xf6\xe12210%#\x0e\x03#\".\x0254>\x0232\x1e\x02\x173&'.\x015\x113\x11#%2>\x02754.\x02#\"\x06\x15\x14\x16\x03T\b\x16;M`<]\x9an<<n\x9a];`M<\x16\f\x03\x03\x02\x04\xb6\x93\xfe\xc6LiA\x1f\x02\x1bAlQ\x87\u007f\u007f\x93\"=.\x1aH\x8f\u050c\x8d\u0550I\x1a,: \"\x1f\x1a7\x10\x01\xb4\xf9\xec\x83.^\x8d^)e\x9dk7\xda\xcc\xd1\xcd\x00\x02\x00q\xff\xec\x03\xe1\x04^\x00\x1e\x00'\x00C@(#H\x19\x10W)\xe0)\x01o)\x01\"\x11H\x05V(\x11P\x1b\"+\"\x02\x0f\"\x01\x06\"\"\x14\x1fP\n\x10\x14Q\x00\x16\x00?\xe1?\xe1\x129/^]]\xe1\x01\x10\xf6\xe12]]\x10\xf62\xe110\x05\".\x0254>\x0232\x1e\x02\x1d\x01!\x1e\x0132>\x027\x15\x0e\x03\x03\"\x06\a!4.\x02\x02`n\xb6\x83HBx\xa7ec\x9en;\xfdL\x05\x99\x973WQL'(MQW`r\x85\v\x01\xec\x1b9X\x14J\x8e\u0487\x88\u0595NG\x81\xb5nq\xc1\xb6\n\x13\x1d\x12\xa2\x13\x1c\x12\b\x03\u06dc\x95DqP,\x00\x00\x00\x01\x00\x1d\x00\x00\x02\xf0\x06\x1f\x00\x1b\x00p@N\xcf\x1d\xdf\x1d\x02`\x1d\x80\x1d\x90\x1d\xa0\x1d\x04\x1f\x1d?\x1dO\x1d\x03\x1b\x1b\u007f\x10\xbf\x10\x02\x10\x10\x1a\x02G\x03\a\x03\x0f\x05\x1f\x05/\x05\xaf\x05\x04\x05\x05\x00\x03\x10\x03 \x03\x80\x03\x90\x03\xa0\x03\x06\x06\x03\x01\x05O\a\x00\x1a\x01\a\x1a\x0f\x14P\r\x01\x02\x15\x00??\xe1?^]3\xe12\x01/^]3/]\x113\x10\xe122/]9/]]]10\x01#\x11#\x11#5754>\x0232\x16\x17\a.\x01#\"\x0e\x02\x1d\x013\x02\x8b\xf5\xb7\xc2\xc2-U|N;c'/\x1fI((:&\x13\xf5\x03\xc1\xfc?\x03\xc1KD`k\x8dT#\x17\x0e\x8d\v\x11\x130SAh\x00\x00\x00\x00\x03\x00%\xfe\x14\x03\xfc\x04^\x00?\x00R\x00^\x00\xa7@\x19\r2\x05SG7\x12/`7p7\x807\x037/7/'H\x1dYG\x05\xb8\xff\xc0@M\a\nH\x05\x05\x01\n\x1d\x01\xfd\x1d\x01\xb0\x1d\x01\x88\x1d\x01 \x1d0\x1d@\x1d\x03\x1d\x1d`\x1f`\x01\xbf`\xdf`\x02\xa0`\x01@'@\f\x0fH'\x02\x052\r\x04<VR\n\n\"\\O<,N\x0f\x17\x01\a\x17\x17<\x10EO\"\x1b\x01\x00\x0f\x00?\xc1?\xe1?9/^]\xc19\x10\xe1\x119/\xe1\x12\x179\x01/+\xc1]]q\x113/]]]]q39/+\xe1\x10\xc1\x1199//]\x10\xc1\x10\xe1\x129910\x01\x15\a\x1e\x01\x15\x14\x0e\x02#\"&'\x0e\x03\x15\x14\x1e\x02;\x012\x1e\x02\x15\x14\x0e\x02#\".\x0254>\x027.\x015467.\x0354>\x0232\x16\x17\x01\x14\x1e\x0232654.\x02+\x01\"\x0e\x02\x13\x14\x1632654&#\"\x06\x03\xfc\xc5\x1c&/_\x8c]\x16,\x0e\x11!\x1b\x11\x18)8\x1f\xb0]\x80Q$A\x86\u034bk\xa0j5'BW/*6@E+G1\x1b2b\x92a%O\x1b\xfe@\x1a;aH\xba\xb9\x187ZA\xb0#L?)\\lcdgidcj\x04Jq\x1b#mEL\x81^5\x01\x03\n\x19 (\x18\x1b!\x12\x06/Pm=X\x8ca4*PqG<[B*\v\x13R5=Y*\x12?Q`3Y\x8cb4\v\t\xfb\x02%@.\x1bsl.:!\f\x10,M\x03`spow{tx\x00\x01\x00\xae\x00\x00\x04\x12\x06\x14\x00\x19\x002@\x1d\x00G\x19U\x1b\x10\x1b`\x1b\x80\x1b\x03\x0f\x0e\nG\vT\x1a\x10\x04P\x15\x10\f\x00\v\x00\x15\x00?2??\xe13\x01\x10\xf6\xe122]\x10\xf6\xe110!\x114&#\"\x0e\x02\x15\x11#\x113\x11\a3>\x0332\x16\x15\x11\x03\\ipQnC\x1d\xb6\xb6\b\n\x19ER\\0\xb7\xb9\x02\u00c2\x824f\x94`\xfd\xc7\x06\x14\xfe2\x90+?*\x14\xbf\xd2\xfd3\x00\x00\x00\x00\x02\x00\xa0\x00\x00\x01u\x05\xe5\x00\x03\x00\x11\x00%@\x14\x10\x13 \x13\x02\f\x00G\x04\x01T\x12\aS\x0f\x0f\x02\x0f\x00\x15\x00??3/\xe5\x01\x10\xf62\xe12]10!#\x113\x034632\x1e\x02\x15\x14\x06#\"&\x01d\xb6\xb6\xc4=-\x16'\x1d\x11?,-=\x04J\x01)<6\r\x1c+\x1e:98\x00\x00\x00\x02\xff\xbc\xfe\x14\x01u\x05\xe5\x00\x13\x00!\x00.@\x19\x10# #\x02\x1c\x0fG\f\x14\x03\x03\fT\"\x17S\x1f\x1f\r\x0f\aP\x00\x1b\x00?\xe1?3/\xe5\x01\x10\xe62/2\x10\xe12]10\x13\"&'5\x1e\x0132>\x025\x113\x11\x14\x0e\x02\x134632\x1e\x02\x15\x14\x06#\"&B0?\x17\x1a6#\x1b.#\x13\xb6\"Hm\x13=-\x16'\x1d\x11?,-=\xfe\x14\x0e\v\x94\n\v\x0f'A3\x04\xf4\xfb\x18M{W/\a_<6\r\x1c+\x1e:98\x00\x00\x00\x00\x01\x00\xae\x00\x00\x03\xf0\x06\x14\x00\x0e\x00^@\v\a\x04\x04\x02\x03\x03\x06D\x05\x01\x05\xb8\xff\xc0@\x17\a\nH\x05\x10\x05\x05\x10\x0f\x10/\x10\x02\a\r\tG\nT\x0f\v\x00\x00\xb8\xff\xf8@\x10\f\x0fH\a\b\f\x0fH\x00\a\x03\x06\n\x15\x03\x0f\x00??3\x1299++?\x01\x10\xf6\xe12^]\x113/8+]33\x1139\x11310\x017\x013\t\x01#\x01\a\x11#\x113\x11\x03\x01V\x87\x01%\xd3\xfeo\x01\xac\xd1\xfe\xb0m\xb4\xb4\x10\x027\xaa\x01i\xfe%\xfd\x91\x01\xf8R\xfeZ\x06\x14\xfd6\xfe\xed\x00\x01\x00\xae\x00\x00\x01d\x06\x14\x00\x03\x00\x1a@\x0e\x10\x05 \x05\x02\x00G\x01T\x04\x02\x00\x00\x15\x00??\x01\x10\xf6\xe1]10!#\x113\x01d\xb6\xb6\x06\x14\x00\x00\x00\x01\x00\xae\x00\x00\x06\x87\x04^\x00,\x00e@?#\nG\xb9\v\x01\x96\v\xa6\v\x02\x89\v\x01g\vw\v\x02\v\v\x16\x00G,U.\xf0.\x01\xcf.\x01 .P.\x02\x0f.\x01\b\x19\x15G\x16T-#\x1a\x1a\x04\x0fP(\x1f\x10\x17\x0f\x16\v\x00\x15\x00?22??3\xe122\x113\x01\x10\xf6\xe12^]]]]\x10\xf6\xe1\x119/]]]]\xe1210!\x114&#\"\x0e\x02\x15\x11#\x114&#\"\x0e\x02\x15\x11#\x113\x173>\x0332\x16\x173>\x0332\x16\x15\x11\x05\xd1diIfA\x1e\xb7ciMh?\x1b\xb6\x94\x1a\n\x18BOY.x\x9f&\b\x1aIW`2\xaf\xb1\x02\u00c2\x82/[\x87X\xfd\xa2\x02\u00c2\x824f\x94`\xfd\xc7\x04J\x94+?*\x14X^/D-\x16\xbf\xd2\xfd3\x00\x00\x00\x01\x00\xae\x00\x00\x04\x12\x04^\x00\x18\x000@\x1c\x00G\x18U\x1a\x10\x1a`\x1a\x80\x1a\x03\x0e\nG\vT\x19\x0f\x04P\x14\x10\f\x0f\v\x00\x15\x00?2??\xe13\x01\x10\xf6\xe12]\x10\xf6\xe110!\x114&#\"\x0e\x02\x15\x11#\x113\x173>\x0332\x16\x15\x11\x03\\ipQnC\x1d\xb6\x94\x1a\n\x19ER\\0\xb7\xb9\x02\u00c2\x824f\x94`\xfd\xc7\x04J\x94+?*\x14\xbf\xd2\xfd3\x00\x02\x00q\xff\xec\x04-\x04^\x00\x13\x00\x1f\x000@\x1d\x1aH\x00W!@!\xd0!\xe0!\x03\x0f!\x01\x06\x14H\nV \x1dP\x0f\x10\x17P\x05\x16\x00?\xe1?\xe1\x01\x10\xf6\xe1^]]\x10\xf6\xe110\x01\x14\x0e\x02#\".\x0254>\x0232\x1e\x02\x05\x14\x1632654&#\"\x06\x04-C}\xb2og\xae\u007fGC|\xb3og\xae\u007fG\xfd\x00\x89\x9a\x9a\x87\x89\x9a\x9a\x87\x02'\x89\u0551LL\x91\u0549\x88\u04d1KK\x91\u04c8\xd1\xd3\xd3\xd1\xd1\xcf\xcf\x00\x00\x00\x00\x02\x00\xae\xfe\x14\x04?\x04^\x00\x1f\x000\x006@\x1e.H\x1bW2\x102\x01&\x10\x06\fG\rT1 P\x11\x16\x10\x0e\x0f\f\x1b+P\x05\x00\x16\x00?2\xe1???3\xe1\x01\x10\xf6\xe1222]\x10\xf6\xe110\x05\".\x02'#\x16\x17\x1e\x01\x15\x11#\x113\x173>\x0332\x1e\x02\x15\x14\x0e\x02\x03\"\x0e\x02\a\x15\x14\x1e\x0232654&\x02\x9e;`M;\x17\f\x03\x03\x02\x04\xb6\x94\x1a\b\x17:M`<^\x9am<<m\x9a\x81LiA\x1f\x02\x1bAlQ\x87\u007f\u007f\x14\x1a+: \"\x1f\x1a7\x10\xfe+\x066\x94#=-\x1bH\x8f\u050c\x8d\u0550I\x03\xdb.^\x8c_)e\x9dk7\xda\xcc\xd0\xce\x00\x00\x02\x00q\xfe\x14\x04\x02\x04^\x00\x10\x000\x006@\x1e+ \x05%G$U2\x102\x01\x0eH\x16V1$\x1b\"\x0f \vP\x1b\x10,\x00P\x11\x16\x00?\xe13?\xe13??\x01\x10\xf6\xe1]\x10\xf6\xe122210%2>\x02754.\x02#\"\x06\x15\x14\x16\x17\".\x0254>\x0232\x1e\x02\x17373\x11#\x1146767#\x0e\x03\x025LiA\x1f\x02\x1bAlQ\x87\u007f\u007ff]\x9an<<n\x9a];`L<\x17\b\x1b\x93\xb6\x04\x02\x03\x03\f\x16;M`\x83.^\x8d^)e\x9dk7\xda\xcc\xd1\u0357H\x8f\u050c\x8d\u0550I\x1b-=#\x94\xf9\xca\x01\xd5\x13:\x1b \"\"=.\x1a\x00\x00\x00\x01\x00\xae\x00\x00\x03\b\x04^\x00\x16\x00A@\v\xb2\x03\xc2\x03\x02\x90\x03\xa0\x03\x02\x03\xb8\xff\xc0@\x1b\a\vH\x03\x03\x180\x18P\x18\x80\x18\x03\x11\rG\x0eT\x17\x0f\x0f\r\x15\x12\a\x00\x10\x00?\xc13??\x01\x10\xf6\xe12]\x113/+]]10\x012\x16\x17\a.\x01#\"\x0e\x02\x15\x11#\x113\x173>\x03\x02\x89\x1dH\x1a\x18\x1c;\x1a?hK)\xb6\x94\x16\b\x199GX\x04^\x05\x05\xa8\x05\a3_\x85Q\xfd\xb0\x04J\xc9+P=%\x00\x01\x00Z\xff\xec\x03?\x04^\x005\x00H@-%\x13G\x90\x00\xa0\x00\x02\x00W7?7_7\x9f7\x03\x107\x01,G\t\x9f\x1d\xaf\x1d\x02\x1dV6&)P\x13,\x05\"\x10\t\x0eP\x05\x16\x00?\xe12?\x1299\xe12\x01\x10\xf6]2\xe1]]\x10\xf6]\xe1310\x01\x14\x0e\x02#\"&'5\x1e\x0332>\x0254.\x02'.\x0354>\x0232\x16\x17\a.\x01#\"\x06\x15\x14\x1e\x02\x17\x1e\x03\x03?:m\x9a`m\x9c;\x1fLTY,A[9\x1a\x145\\HHsP+7d\x8cVa\xa1H?A\x89Gfb\x178^FHqP*\x01-PxQ(#\"\xa6\x10\x1f\x18\x0f\x16);$\x1f212\x1f\x1f<JaCFmJ&*\"\x93\x1d+C>#4./\x1d\x1e<K`\x00\x00\x01\x00!\xff\xec\x02\x8f\x05F\x00\x1d\x00P\xb1\x19\x05\xb8\xff\xc0@/\b\vH\x05\x05\x1f?\x1fO\x1f\x02\x17\x1bG\x14\x1f\x12/\x12\x02\x12\x00\x10\x10\x10 \x10\xb0\x10\xc0\x10\xd0\x10\x06\x06\x10\x1a\x12O\x16\x14\x17\x0f\x00P\v\x16\x00?\xe1?33\xe12\x01/^]\xc6]3\xe12]\x113/+310%2>\x027\x15\x0e\x03#\".\x025\x11#5?\x013\x15!\x15!\x11\x14\x16\x01\xfa\x12-*#\t\r(04\x19>jM,\x9b\x9bNi\x01\x14\xfe\xec?\x81\x04\x06\b\x03\x8a\x06\f\t\x05 N\x85e\x02}QN\xe6\xfc\x89\xfd\x83ab\x00\x00\x00\x01\x00\xa4\xff\xec\x04\b\x04J\x00\x1a\x000@\x1c\x01\x17G\x1aU\x1c\x10\x1c`\x1c\x80\x1c\x03\x0fG\fT\x1b\x18\r\x0f\x12P\x02\a\x16\x00\x15\x00??3\xe1?3\x01\x10\xf6\xe1]\x10\xf6\xe1210!'#\x0e\x03#\".\x025\x113\x11\x14\x1632>\x025\x113\x11\x03u\x1b\n\x19ER\\0[\x8a\\/\xb6joQnC\x1d\xb6\x93+?)\x14.b\x98i\x02\xcd\xfd=\x82\x824e\x94`\x02:\xfb\xb6\x00\x00\x00\x00\x01\x00\x00\x00\x00\x03\xd5\x04J\x00\x11\x00m\xb9\x00\x11\xff\xf8@\x0f\n\x0eH\x11\x00\b\n\x0eH\x00\t\t\x01\x0f\x10\xb8\xff\xc0\xb3\x12\x15H\x10\xb8\xff\xc0@\x1c\a\vH\x10\x10\x10\x10\x13\xbf\x13\xcf\x13\xef\x13\x03P\x13\x01\x0f\x13/\x13O\x13\x03\a\x02\x01\xb8\xff\xf0@\n\x01G\t\x01\t\x0f\x01\x0f\x00\x15\x00??39]\x01/8\xc1^]]]\x113/8++\xc1\x129=/3+3+10!\x013\x13\x1e\x03\x173>\x037\x133\x01\x01w\xfe\x89\xbc\xc7\v\x1e\x1e\x19\x04\a\x05\x18\x1e\x1e\v\u01fc\xfe\x89\x04J\xfd\x9d!hl`\x19\x19`lh!\x02c\xfb\xb6\x00\x01\x00\x14\x00\x00\x05\xe3\x04J\x00/\x00\u00f9\x00/\xff\xf8@\f\n\x0eH/\x00\b\t\x0eH\x00' \xb8\xff\xf8@\x12\t\x0eH \x1f\b\t\x0eH\x1f\t\x10\b\n\x0eH\x10\x0f\xb8\xff\xf8@\t\t\x0eH\x0f\x18T'\x01'\xb8\xff\xe0@\x15\a\nH[\x18\x01\x18 \a\nH'\t\x18\x18\t'\x03\x11-.\xb8\xff\xc0\xb3\x12\x15H.\xb8\xff\xc0@\x13\a\vH.\x10..1 101\x02\x0f1\x01\a\x12\x11\xb8\xff\xf0@\x16\x11-\x1f\t\t\x01\t\x11\x0f'\x19\x06\x19f\x19v\x19\x03\x19\x00\x10\x15\x00?33]\x113?3]33\x01/83^]]\x113/8++3\x12\x179=///+]+]\x113+3+\x113+3+\x113+3+10!\x03.\x03'&'#\x06\a\x0e\x01\a\x03#\x013\x13\x1e\x03\x173>\x037\x133\x13\x1e\x03\x173>\x037\x133\x01\x03\xf0\xa8\x04\f\f\r\x06\x0e\x0f\x06\x0e\r\v\x19\v\xac\xd3\xfe\u7fc3\n\x14\x12\x0e\x04\x06\x05\x11\x15\x16\n\xb3\u012c\t\x17\x16\x12\x04\x06\x03\r\x12\x15\v\x89\xba\xfe\xe4\x02h\x12-24\x19:>?:2j%\xfd\x9c\x04J\xfd\xb8-ig[\x1d\x1aWa_!\x02k\xfd\x95\"\\_X\x1d\x1aWhm/\x02H\xfb\xb6\x00\x00\x00\x01\x00#\x00\x00\x03\xdb\x04J\x00\v\x00\xe5@\xa1\x89\t\x01\x86\x03\x01\x06\x04\x01\xf7\x04\x01\xe5\x04\x016\x04\x01\x04\x05\xe8\x06\x01\x06\x03\xe7\x00\x01\x00\t\t\x02\x01\xf8\x02\x01\xea\x02\x019\x02\x01\x02\x01k\x05{\x05\x02W\x05\x01:\x05J\x05\x02d\x01t\x01\x02X\x01\x015\x01E\x01\x02\x05\x01\t\x01\t\x05\x03\v\x06\b\x01\xf7\b\x01\xe5\b\x016\b\x01\b\a@\x16\x19H\a@\x0e\x11Hk\a{\a\x02W\a\x01:\aJ\a\x02\a\r\x10\r0\r\x02\x90\r\xb0\r\x02\x0f\r\x01\x06\xd9\n\x01\xc8\n\x01\xba\n\x01\t\n\x01\n;\vK\v\x02(\v\x01\x05\v\x15\v\x02\v\a\x15\x01\x0f\x00??\x01/]]]\xc1]]]]^]]q\x10\xde]]]++\xc1]]]q\x12\x179=/\x18//]]]]]]\x10\xc1]]]q\x113]33]\x10\xc1]]]q10\x00]]\t\x013\x1b\x013\t\x01#\t\x01#\x01\x98\xfe\x9f\xcf\xfa\xfa\xcf\xfe\x9d\x01u\xcf\xfe\xf4\xfe\xf2\xcf\x023\x02\x17\xfef\x01\x9a\xfd\xe9\xfd\xcd\x01\xb4\xfeL\x00\x00\x00\x00\x01\x00\n\xfe\x14\x03\xdf\x04J\x00\"\x00d\xb6\"\x10\b\b\x00\x0e\x0f\xb8\xff\xc0\xb3\x12\x15H\x0f\xb8\xff\xc0@\x1d\a\vH\x0f\x10\x0f\x0f$\xbf$\xcf$\xef$\x03P$\x01\x0f$/$O$\x03\a\x18\x01\x00\xb8\xff\xf0@\f\x00\"\x10\b#\x1cP\x15\x1b\x0e\x00\x0f\x00?2?\xe1\x11333\x01/8\xc13^]]]\x113/8++\xc1\x129=/3310\x133\x13\x1e\x03\x173>\x037\x133\x01\x0e\x03#\"&'5\x1e\x0132>\x02?\x01\n\xbd\xd7\x0e\x1d\x19\x12\x04\x06\x05\x16\x1b\x1d\v\u01fc\xfeN\x1cAVtP4L\x1b\x15@#0F4%\x0f9\x04J\xfd\x9b(XXR#\x19Va^!\x02c\xfb'Q\x81Z1\v\x06\x91\x05\a\x17,@)\xa0\x00\x00\x00\x00\x01\x00R\x00\x00\x035\x04J\x00\t\x00l@\v\t\x97\x03\x01\x03\b\t\rH\x03\a\xb8\xff\xc0@\x11\a\nH\a\a\v?\v_\v\u007f\v\x03\x98\b\x01\b\xb8\xff\xf8\xb5\t\rH\b\x04\x02\xb8\xff\xc0\xb7\x12\x15H?\x02\x01\x02\a\xb8\xff\xf0@\x12\a\fH\a\x04O\x05\x0f\x02\x10\a\fH\x02\bO\x01\x15\x00?\xe12+?\xe12+\x01/]+33+]]\x113/+3+]310)\x015\x01!5!\x15\x01!\x035\xfd\x1d\x02\x18\xfe\t\x02\xb0\xfd\xf4\x02\x1e}\x03D\x89\x92\xfc\xd1\x00\x00\x00\x00\x01\x00=\xfe\xbc\x02\xa2\x05\xb6\x00'\x00@@%\x1a\x05\x05\xf7 '\xf1#\x13\x0f\xf6\x10\f\x01\f#\x0f\xf5\xd9\x10\x01\x0f\x10_\x10\x02\x10\x10)\x1a\xf5\x19\xf8\x05\xf5\x06\xf9\x00?\xe1?\xe1\x129/]]\xe19\x01/]\xe633\xf12\xe2/210\x05\x14\x1e\x02\x17\x15.\x035\x114&#5265\x114>\x027\x15\x0e\x03\x15\x11\x14\x06\a\x15\x1e\x01\x15\x01\xf4\x18-A(M\x83_6\x83}}\x836_\x83M(A-\x18wssw\x100=#\r\x01\x96\x01!GnN\x01NgV\x9bVg\x01MNnG!\x01\x95\x01\r#=0\xfe\xb4i{\x14\f\x14zj\x00\x00\x01\x01\xe9\xfe\x14\x02\u007f\x06\x14\x00\x03\x00-@\x1f\x00\x05\x010\x05@\x05p\x05\x80\x05\x04\x02\xaa\x00\x03\x10\x03@\x03\x80\x03\xc0\x03\x05\a\x03\x02\x1b\x00\x00\x00??\x01/^]\xe1]q10\x013\x11#\x01\u9596\x06\x14\xf8\x00\x00\x00\x01\x003\xfe\xbc\x02\x98\x05\xb6\x00)\x00@@%\r$$\xf7\a\x00\xf1\x1a\xf6\x14\x03\x90\x1d\x01\x1d\x04\x1a\xf5\xef\x19\xff\x19\x02\xd9\x19\x01\x19\x19\x0e$\xf5#\xf9\r\xf5\x0e\xf8\x00?\xe1?\xe1\x119/]]\xe19\x01/]33\xe6\xf12\xe2/210\x134675.\x015\x114.\x02'5\x1e\x03\x15\x11\x14\x1e\x023\x15\"\x06\x15\x11\x14\x0e\x02\a5>\x035\xe1wssw\x18-A(M\x83_6!A`>}\x836_\x83M(A-\x18\x01;jz\x14\f\x14{i\x01L0=#\r\x01\x95\x01!GnN\xfe\xb34H-\x14\x9bVg\xfe\xb2NnG!\x01\x96\x01\r#=0\x00\x01\x00f\x02J\x04\x02\x03Z\x00#\x00<@\r\x1d%\x10%\x01\x10\n\x01\n\x17\xad\n\x1f\xb8\xff\xc0@\x16\x10\x13H\x1f\x1f\x05\xad\x1c\x0f\r\x1f\r?\rO\ro\r\x8f\r\x06\r\x00/]3\xf1\xc8/+2\xe1\x01/]]\x10\xce10\x01.\x03#\"\x0e\x02\a5632\x1e\x02\x17\x1e\x0332>\x027\x15\x06#\".\x02\x02\x12%7-)\x16\x1c<;8\x19d\x94\x1d27C/%7/(\x16\x1c<;8\x18c\x95\x1d27C\x02\x8b\x10\x16\r\x05\x13!,\x19\xa2l\x05\r\x19\x14\x10\x16\r\x05\x13!,\x19\xa2l\x05\r\x19\x00\x00\x00\x02\x00\x93\xfe\x8b\x01\x91\x04^\x00\x03\x00\x17\x00A\xb9\x00\x00\xff\xf0@\x13\n\x14H0\x19\xa0\x19\xb0\x19\xc0\x19\x04\x02\x04\x9a\x0e\x03\x03\x0e\xb8\xff\xc0@\x0f\a\nH\x0e\x00\t\x9b\x13\x00\x02\x10\x02\x02\a\x02\x00/^]/\xf5\xce\x01/+3/\x10\xe12]10+\x133\x13#\x13\x14\x0e\x02#\".\x0254>\x0232\x1e\x02\xd5y3\xdf\xef\x13#.\x1b\x1a.#\x14\x14#.\x1a\x1b.#\x13\x02\xa4\xfb\xe7\x05H&5!\x0f\x0f!5&%4\"\x10\x10\"4\x00\x00\x01\x00\xbc\xff\xec\x03\xba\x05\xcb\x00%\x00Z@%\x12\x03F\x0f\x04\x04\n%\x15'@'\x01\x1eH\x00\n0\n@\n\xd0\n\x04\x06\n\x1bs\x0f\x12\x0f!s\x05\x02\x05\x0f\xb8\xff\xc0@\f\x0f\x12H\x0f\x05\x0f\x05\x03\x10\a\x03\x19\x00??\x1299//+\x113\x10\xe1\x113\x10\xe1\x01/^]\xe1]\x10\xc62\x119/3\xe1210$\x06\a\x15#5.\x0354>\x02753\x15\x1e\x01\x17\a.\x03#\"\x06\x15\x14\x163267\x15\x03vnL\x89W\x8ab45a\x8bV\x89H\x88.5\x178<;\x19\x9d\x90\x91\x94Q\x836\xd4\x1e\x02\xc8\xce\rK\x85\u01c9\x8d\u02c8K\r\xac\xa4\x03!\x17\x9a\n\x13\x0f\t\xca\xd4\xd2\xc3%\x18\xa1\x00\x00\x01\x00D\x00\x00\x04#\x05\xc9\x00(\x00u@\x11\r\x11o#\x0f\x0f\x1f\x0f\x02\a\x1f\x0f\x1f\x0f\x19\x03\x17\xb8\xff\xc0\xb3\n\x0eH\x17\xb8\xff\xc8@0\x06\tH\x17\x17*\x10*\x01!\x19@\v\x0eH\x19\x19)\x10!u\r/\"\u007f\"\x8f\"\xaf\"\xbf\"\xdf\"\xff\"\a\"\"\x00\x16t\x19\x18\as\x00\a\x00?\xe1?\xe1\x119/]3\xe12\x11\x013/+3]\x113/++3\x1299//^]3\xe1210\x012\x16\x17\a.\x01#\"\x0e\x02\x15\x11!\x15!\x15\x14\x0e\x02\a!\x15!5>\x03=\x01#53\x114>\x02\x02\x9aj\xaeBB8\x8dK0R<!\x01x\xfe\x88\x17'3\x1b\x02\xec\xfc!,I5\x1e\xc6\xc6;i\x92\x05\xc9-#\x90\x1d+\x1b;^B\xfe\u0649\xd3>Y@+\x10\xa6\x9a\v)DaC\u0549\x01DW\x89_2\x00\x02\x00{\x01\x1d\x03\xec\x04\x8b\x00#\x007\x00\x86@#\x0e\x8f\x16\x01\x16\x16.\xab\x15\x0f\f\x18\x06\x1e!\x03\b\x00p\x12\x01\x12\x129\x109\x01\x04 $\xaa\x80\x00\x01\x00\xb8\xff\xc0@1\x06\nH\x00\x008\x17\x80\x1f\x01\x1f\f\x06\x18\x1e\x0f\x06\x04\t)\xae\x00\x1b\x01\x1b\r\x053\xae\xcf\t\xef\t\x02\x90\t\xa0\t\xb0\t\x03\x1f\t?\to\t\x03\t\x00/]]]\xe1\xc62/]\xe1\x12\x179\x113\xc6]2\x11\x013/+]\xe1\xc62]\x113/]\x12\x179\xf1\xc0/]210\x13467'7\x17>\x0132\x16\x177\x17\a\x1e\x01\x15\x14\x06\a\x17\a'\x0e\x01#\"&'\a'7.\x017\x14\x1e\x0232>\x0254.\x02#\"\x0e\x02\xba#\x1f\x81b\u007f/l<<k.\x81c\x82\x1f%#!\u007f`\x81.k<<n-\u007f`\u007f\x1f#\x8a%AW23YB&&BY32WA%\x02\xd3;k/\x81b\x81 $$ \x81`\x81.m<<n-\u007f`\u007f\x1f#$ \u007f`\u007f-l<2WA&&AW23YB&&BY\x00\x00\x00\x00\x01\x00\x1d\x00\x00\x04L\x05\xb6\x00\x16\x00\x95@[0\x18\x01\x0f\x13\f\x16\xaa\x15\x01\x15\x15\f\x04\b\x01\xab\x02\x01\x1f\x02\x01\x02\x02\x98\x00\x01\x00\a\x03\vZ\x99\x14\x01\x14\x10\x0f\f\x01\x8a\f\x01\x00\f\x10\f@\f\x03\a\f\n\x0e`\x0f\a\x0f\x06\x12`\x13\x03\x00\x13\u007f\x0f\x8f\x0f\x020\x13\x01\xd0\x13\x01\x0f\x13\x1f\x13\x02\x0f\x13\x0f\x13\x01\v\x12\x15\x01\x03\x00?3?\x1299//]]q]\x1133\x10\xe12\x113\x10\xe12\x01/^]]q33]\xe1229]2/]]399\x113/]3\x1299]10\t\x013\x013\x15!\x15!\x15!\x11#\x11!5!5!53\x013\x023\x01Z\xbf\xfe\u007f\xef\xfe\xd3\x01-\xfe\u04f2\xfe\xd3\x01-\xfe\xd3\xea\xfe\x85\xc0\x02\xd3\x02\xe3\xfd\x00\x89\x9e\x89\xfe\xfa\x01\x06\x89\x9e\x89\x03\x00\x00\x00\x00\x00\x02\x01\xe9\xfe\x14\x02\u007f\x06\x14\x00\x03\x00\a\x009@%\x00\t\x010\t@\tp\t\x80\t\x04\x02\x06\xaa\x03\x00\a\x10\a@\a\x80\a\xc0\a\x05\a\a\x04\x03\x04\x03\x06\x1b\x00\x00\x00??99//\x01/^]3\xe12]q10\x013\x11#\x113\x11#\x01\u9596\x96\x96\x06\x14\xfc\xf4\xfe\x19\xfc\xf3\x00\x00\x02\x00y\xff\xf6\x03^\x06\x1f\x00E\x00Z\x00y@K\x05V\bQF!&LF<F))\x10\xff!\x01\xa0!\xb0!\x02!\\\xc0\\\x01\xbf\\\x01FF\x00\x17F\b\b1\x00\x00\x01\x00\x00\x10\x000\x00\xc0\x00\xd0\x00\xf0\x00\x06\b\x00[&L\x05V\x17VL)\x04\r7P.\x15\x14P\r\x01\x00?\xe1?\xe1\x12\x179\x113\x113\x01\x10\xc6^]q22/\xe1\x10\xe1]]\x10\xce]]22/\xe1\x1299\x10\xe1\x119910\x134>\x027.\x0154>\x0232\x16\x17\a.\x01#\"\x06\x15\x14\x1e\x02\x17\x1e\x03\x15\x14\x0e\x02\a\x1e\x01\x15\x14\x0e\x02#\"&'5\x1e\x0332>\x0254.\x02'.\x037\x14\x1e\x02\x1f\x01>\x0354.\x02'\x0e\x03\x89\x1a-:\x1fKU7d\x8cVa\x9dH8A\x8cGcf\x189_FHqN*\x18)4\x1cEL;l\x9b`l\x9c;\x1fLTY+E]7\x17\x113^LIsP)\x9a\x1c?eH#\x14)!\x15\x1aAlR\x19/&\x17\x03)3S@-\x0f&rT=bD%( \x8b\x1c';9\x1b.,/\x1d\x1cANa>4UD1\x10&mNGoM(! \x9e\x0f\x1e\x17\x0e\x18'3\x1b\x1d--1\x1f\x1f>NdY%?:7\x1e\x0f\r$.8\"&@;9\x1e\b\x1f-:\x00\x00\x00\x00\x02\x013\x05\f\x03j\x05\xd9\x00\v\x00\x19\x005@!\f\x86\xaf\x14\x01\x14\xc0\x06\x86\x00\x00\x10\x00@\x00P\x00\x04\x06\x00\x0f\x03\x91\x17\x9f\t\xcf\t\x020\t\x01\t\x00/]]3\xe52\x01/^]\xe1\x1a\xdc]\xe110\x014632\x16\x15\x14\x06#\"&%4632\x1e\x02\x15\x14\x06#\"&\x0138('::'(8\x01w8(\x13#\x1a\x10:&(8\x05s6015522560\f\x19&\x1b522\x00\x00\x03\x00d\xff\xec\x06D\x05\xcb\x00%\x00A\x00U\x00j@C\x05\xc5\x1a\x0f\x0f\"\x1a\"\x1a\"&L\xc3\x004\x01\xc04\x014WB\xc3&\n\xc9\x15\x00\xc9\x1f\x0f\x15\x1f\x15/\x15\u007f\x15\x8f\x15\x9f\x15\x06\b\x00\x1f\x10\x1f`\x1fp\x1f\x80\x1f\x05\x15\x1f\x15\x1f-G\xc8;Q\xc8-\x04\x00?\xe1/\xe1\x1199//]^]\x10\xe1\x10\xe1\x01/\xe1\x10\xde]q\xe1\x1199//\x113/\x10\xe110\x01\"\x0e\x02\x15\x14\x1e\x0232>\x027\x15\x0e\x03#\".\x0254>\x0232\x16\x17\a.\x01\x014>\x0432\x1e\x04\x15\x14\x0e\x04#\".\x047\x14\x1e\x0232>\x0254.\x02#\"\x0e\x02\x03{=^@!\x1d=_C\x17698\x19\x1815<#f\x98e36i\x99d?\x84;>4a\xfc\xbe6a\x8a\xa7\xc0hh\xc0\xa7\x8aa66a\x8a\xa7\xc0hh\xc0\xa7\x8aa6me\xaf\ua145\xea\xafee\xaf\ua145\xea\xafe\x04\x1d,SxKNxR+\a\f\x11\t\x83\v\x12\x0e\aBz\xaage\xa7xC!\x1d\u007f\x1a\x1c\xfe\xbeh\xc0\xa7\x8aa66a\x8a\xa7\xc0hh\xc0\xa7\x89b55b\x89\xa7\xc0h\x85\xea\xafee\xaf\ua145\xea\xafee\xaf\xea\x00\x00\x00\x00\x02\x00D\x03\x10\x02B\x05\xc7\x00\x1e\x00-\x00N@/-\x01\x0f\xe0\x00\x1d\x10\x1d\x02\x1d/\x0f/\x1f/O/\u007f/\xaf/\x05$\xe0\v\x17\x17`\v\x01\v.-\xe4\x0f\x0f\x1a\x01'\xe4\x00\x06\xc0\x13\xe4\x1a\xde\x00?\xe1\x1a\xdc\xc4\xe19\x119/\xe1\x01\x10\xc6]2/\x10\xe1]\x10\xd6]\xe12210\x01'\x0e\x03#\".\x02546?\x0154&#\"\x06\a'>\x0132\x16\x15\x11\x03\x0e\x03\x15\x14\x1632>\x02=\x01\x01\xe7\x1c\x12'/8#+H4\x1d\x8d\x8fc=80Z*03u<}w\xc93D)\x122*\":+\x19\x03\x1dR\x16#\x19\r\x1a3M3fl\x05\x04\x1fH9\x1d\x16d\x1a$jz\xfe:\x019\x03\x12\x1e+\x1d3-\x15,A,1\x00\x02\x00R\x00s\x03\x93\x03\xc7\x00\x06\x00\r\x00`@\x11\x02\x04\r\xeb\nP\x04`\x04\x02\x04\n\x04\n\x06\v\t\xb8\xff\xc0@!\t\fH\t\x0f\x0f\x0f\x9f\x0f\xaf\x0f\x03\x06\xeb\x9f\x03\x01\x03\x06\x00\x03\r\a\n\n\x05\x03\x03\x01\f\x05\b\x01\x00/3/3\x129=/\x129\x1133\x1133\x01\x18/]\xe1]\x10\xc6+2\x1199//]\x10\xe1\x11310\x13\x01\x17\x03\x13\a\x01%\x01\x17\x03\x13\a\x01R\x015u\xee\xeeu\xfe\xcb\x01\x97\x016t\xed\xedt\xfe\xca\x02)\x01\x9eN\xfe\xa4\xfe\xa4N\x01\x9b\x1b\x01\x9eN\xfe\xa4\xfe\xa4N\x01\x9b\x00\x01\x00f\x01\x06\x04\x02\x03\x1d\x00\x05\x009@$\x02\xaa\x01\a\x10\a\x01\x96\x04\x01\x8b\x04\x01y\x04\x01V\x04\x01K\x04\x018\x04\x01\x12\x04\x01\t\x04\x01\x04\x04\xad\x05\xb3\x00?\xe1\x01/]]]]]]]]]\x10\xde\xe110\x01\x11#\x11!5\x04\x02\x95\xfc\xf9\x03\x1d\xfd\xe9\x01\x81\x96\x00\x00\x00\xff\xff\x00R\x01\xd1\x02B\x02y\x12\x06\x00\x10\x00\x00\x00\x04\x00d\xff\xec\x06D\x05\xcb\x00\b\x00\x1e\x00:\x00N\x00\xc2@}\xa4\x16\xb4\x16\xc4\x16\x03\xb4\x17\xc4\x17\x02\x17\x16\x01R\x15\x0e\x17\x0e\x16\xc5\x15\x0e\x14\x15\x15\x0e\x0e\t\x00\x19\xc5\x1a\t\xc5\x04\x15\x04\x00\x1a\x01\x00\x1a\xc0\x1a\xd0\x1a\x03\a\x8f\x04\x01\x1a\x04\x1a\x04\x1fE\xc3\x00-\x01\xc0-\x01-P;\xc3\x1f\x0e\x18\xc9\x00\x00\x16\x1b\x16\x15\x1a\b\xc9\x1b\x00\x1a\x01\x0f\x1a\x1f\x1a/\x1a\u007f\x1a\x8f\x1a\x9f\x1a\x06\b\x00\x1b\x10\x1b`\x1bp\x1b\x80\x1b\x05\x1a\x1b\x1a\x1b&@\xc84\x13J\xc8&\x04\x00?\xe1?\xe1\x1199//]^]q\x10\xe1\x1133\x11\x129\x10\xe12\x01/\xe1\x10\xde]q\xe1\x1199//]^]q\x119\x10\xe1\x10\xe12\x119\x87\x10+\x10\x00\xc1\x87\x05+\x10\xc4\x01]10]\x0132654&+\x01\x05\x14\x0e\x02\a\x16\x17\x1e\x02\x1f\x01#\x03#\x11#\x1132\x16\x014>\x0432\x1e\x04\x15\x14\x0e\x04#\".\x047\x14\x1e\x0232>\x0254.\x02#\"\x0e\x02\x02\xe7H[OSYF\x01\x92\x1b-9\x1fC5\x17*!\n\n\xb3\xce_\x9d\u9a1e\xfb\xeb6a\x8a\xa7\xc0hh\xc0\xa7\x8aa66a\x8a\xa7\xc0hh\xc0\xa7\x8aa6me\xaf\ua145\xea\xafee\xaf\ua145\xea\xafe\x03\x00HEJ;\x810K9(\rnW%G8\x11\x11\x01`\xfe\xa0\x03}\x82\xfe\xc3h\xc0\xa7\x8aa66a\x8a\xa7\xc0hh\xc0\xa7\x89b55b\x89\xa7\xc0h\x85\xea\xafee\xaf\ua145\xea\xafee\xaf\xea\x00\x00\x00\x00\x01\xff\xfa\x06\x14\x04\x06\x06\xa0\x00\x03\x00\x12\xb6\x00\x00\x05\x01\x01\xba\x02\x00/\xe1\x01/\x113/10\x01!5!\x04\x06\xfb\xf4\x04\f\x06\x14\x8c\x00\x00\x00\x00\x02\x00{\x03V\x02\xf2\x05\xcb\x00\x13\x00'\x00C@,\x1e\xab\n)\x9f)\x01\x14\xaa0\x00@\x00\x02\x00\x19\xae\x10\x0f \x0f\x02\xe0\x0f\xf0\x0f\x02o\x0f\x01\x00\x0f\x10\x0f \x0f\x03\x06\x0f\x0f#\xae\x05\x04\x00?\xe13/^]]]q\xe1\x01/]\xe1]\x10\xd6\xe110\x134>\x0232\x1e\x02\x15\x14\x0e\x02#\".\x027\x14\x1e\x0232>\x0254.\x02#\"\x0e\x02{2UsAAsV22VsAAsU2{\x1e4F((F5\x1e\x1e5F((F4\x1e\x04\x8fAsV22VsAArU11UrA'E4\x1e\x1e4E'(G5\x1f\x1f5G\x00\x00\x00\x02\x00f\x00\x00\x04\x02\x04\xa2\x00\v\x00\x0f\x00:@!\x10\x11\x01\x0f\b\b\x06\t\xaa\f\x01\x01\x03\xef\x00\x01 \x00`\x00\xa0\x00\x03\x00\r\xad\f\t\x00\xad\x06\x03\xb3\x00?3\xe12/\xe1\x01/]]33\x113\xe122\x113]10\x01!5!\x113\x11!\x15!\x11#\x015!\x15\x01\xe9\xfe}\x01\x83\x96\x01\x83\xfe}\x96\xfe}\x03\x9c\x02\x87\x96\x01\x85\xfe{\x96\xfe\u007f\xfe\xfa\x96\x96\x00\x01\x001\x02J\x02m\x05\xc9\x00\x1e\x00@@\x15\b\xe1\x00\x17 O \u007f \x02 @\x06\nH\x1d\xe1\x01\x0f\x0f\x01\xb8\xff\xc0@\x0e\x15\x18H\x01\b\x1d\v\xe5\x12\xde\x1d\xe5\x01\xdd\x00?\xe1?\xe1\x129\x01/+3/\x10\xe1+]\x10\xde2\xe110\x01!57>\x0354&#\"\x06\a'>\x0132\x1e\x02\x15\x14\x0e\x02\x0f\x01!\x02m\xfd\xc4\xd19H(\x0fB63]-N6\x85R<aD%\x1d6O3\x94\x01\x8c\x02Jp\xe4>UC;\"A@2&^0A!?[92VU[7\x9d\x00\x01\x00\x1f\x029\x02h\x05\xc9\x000\x00a@<\x03\x00\x19\x19\x0e\x06\x1e\xe1\x00\x00\x15\xe1\x062_2\x8f2\x022@\x06\nH''\x0e@\x19 H\x0e\x03\x19\xe4\x0f\x1a\x1f\x1a/\x1a_\x1a\xdf\x1a\x05\b\x1a\x1a\x12&#\xe5,\xde\x12\xe5\x0f\v\xdf\x00?3\xe1?\xe13\x129/^]\xe19\x01/+3/+]\x10\xde\xe13/\xe1\x11\x129/\x12910\x01\x14\x06\a\x1e\x01\x15\x14\x0e\x02#\"&'5\x1e\x0132654&+\x01532654.\x02#\"\x06\a'>\x0332\x1e\x02\x02NQEXX(S~VF{9?\x845bXk`bb\\T\x14#/\x1b;a3E\x1d=DL,EiF#\x04\xe7Nj\x18\x17jN<dG(\x19\x1f\x85\"&SIJCqO@ /\x1e\x0e)%`\x17%\x1a\x0f\"<S\x00\x00\x00\x01\x01\x89\x04\xd9\x03\x12\x06!\x00\r\x00\x16@\n\x06\x00\x05\x80\x0f\f_\f\x02\f\x00/]\x1a\xcd\x01/\xcd10\x01>\x0373\x15\x0e\x03\a#\x01\x89\x16//*\x10\xdb\x10?MQ#y\x04\xf4\x1dLQQ\"\x15\x1bQXS\x1c\x00\x00\x00\x00\x01\x00\xae\xfe\x14\x04\x12\x04J\x00\x1d\x007@\"\r\tG\nU\x1f\x10\x1f \x1f`\x1fp\x1f\x80\x1f\x05\x14\x1dG\x1cT\x1e\x1a\x1b\x03P\x11\x16\v\x15\x1c\t\x0f\x00?3??\xe1?\x01\x10\xf6\xe12]\x10\xf6\xe1210\x01\x14\x1632>\x025\x113\x11#'#\x0e\x01#\"&'\x16\x17\x1e\x01\x15\x11#\x113\x01djoRnC\x1c\xb6\x93\x1b\n0\x90gHj#\x01\x02\x02\x01\xb6\xb6\x01\x87\x82\x824e\x94`\x02:\xfb\xb6\x93ST.*&(#U*\xfe\xc0\x066\x00\x01\x00q\xfe\xfc\x04f\x06\x14\x00\x13\x007@!\x04\x99\x00\x050\x05@\x05P\x05\x04\x06\x05\x05\r\x01\x99\x00\x15\x10\x15\x01\x00\r\x10\r\x02\r\x03\x12\x00\x05\x00\x00/2?\xc1\x01/]]\x10\xd6\xe1\x129/^]\xe110\x01#\x11#\x11#\x11\x06#\".\x0254>\x023!\x04fx\xcfy=U_\x9bm<Aw\xa6d\x023\xfe\xfc\x06y\xf9\x87\x033\x123v\xc0\x8c\x93\xc5x2\x00\x00\x00\x00\x01\x00\x93\x02H\x01\x91\x03^\x00\x13\x003@\x1a\x10\x15\x80\x15\x90\x15\xa0\x15\x04\n\x96\xc0\x00\xd0\x00\x024\x00D\x00d\x00t\x00\x04\x00\xb8\xff\xc0\xb6\a\nH\x00\x05\x9b\x0f\x00/\xe5\x01/+]]\xed]10\x134>\x0232\x1e\x02\x15\x14\x0e\x02#\".\x02\x93\x14\".\x1b\x1a/\"\x14\x14\"/\x1a\x1b.\"\x14\x02\xd3&5!\x0f\x0f!5&%4\"\x10\x10\"4\x00\x00\x01\x00#\xfe\x14\x01\x98\x00\x00\x00\x19\x009@\x1f\x14\x13\x13\x15\u007f\x12\x8f\x12\x02\x12\x12\x06\r\x84\x00\x1b\x06\x1a\x12\x8c\x15@\t\x0eH\x15\x15\x13\n\x8d\x03\x00/\xe1/9/+\xe1\x01\x10\xc6\x10\xd6\xe1\x119/]33\x11310\x01\x14\x06#\"&'5\x1e\x0132654.\x02'73\a\x1e\x03\x01\x98\x8d\x96\x16-\x0f\x0f1\x10GP\x1a.?%Zy9\":+\x19\xfe\xe1al\x06\x03l\x03\x03+1\x18#\x1a\x13\t\xb0s\b\x1a):\x00\x00\x01\x00?\x02J\x01\xba\x05\xb6\x00\x0e\x004@!O\x10\u007f\x10\x02\x10@\x06\nH\x0e\x0e\x02\xe1\x00\u007f\x03\x8f\x03\x02 \x030\x03\x02\x03\x02\xdd\r\t\xe5\x00\xdc\x00?\xe1\xcd?\x01/]]3\xe13/+]10\x013\x11#\x114>\x027\x0e\x01\x0f\x01'\x013\x87\x91\x01\x03\x03\x01\x0e&\x16^J\x05\xb6\xfc\x94\x02\x04\x19<<8\x16\x11(\x11I`\x00\x00\x00\x00\x02\x00B\x03\x10\x02\x8b\x05\xc7\x00\x13\x00\x1f\x00.\xb2\x1a\xe0\x00\xb8\xff\xc0@\x14\t\x0fH\x00!\x0f!\x01\x14\xe0\n \x17\xe4\x05\xc0\x1d\xe4\x0f\xde\x00?\xe1\x1a\xdc\xe1\x01\x10\xd6\xe1]\x10\xd6+\xe110\x01\x14\x0e\x02#\".\x0254>\x0232\x1e\x02\x05\x14\x1632654&#\"\x06\x02\x8b)MmD?jN+)LmD>kN,\xfe:KVUKKUVK\x04mS\x82Y//Y\x82SS\x81X..X\x81Swyywxss\x00\x00\x02\x00T\x00s\x03\x96\x03\xc7\x00\x06\x00\r\x00V@/\x0f\x0f\x9f\x0f\xaf\x0f\x03\a\xeb\x04\x02\n\x02\n\x02\x03\v\t\x0e\x00\xeb\x9f\x03\x01\x10\x03 \x03@\x03\x03\x03\r\a\n\x06\x00\x03\n\x03\n\x03\x01\f\x05\b\x01\x00/3/3\x1299=//\x1133\x1133\x01\x18/]]\xe1\x10\xc62\x1199//\x113\xe1]10\t\x01'\x13\x037\x01\x05\x01'\x13\x037\x01\x03\x96\xfe\xcat\xed\xedt\x016\xfeh\xfe\xcbu\xee\xeeu\x015\x02\x0e\xfeeN\x01\\\x01\\N\xfeb\x1b\xfeeN\x01\\\x01\\N\xfeb\x00\xff\xff\x00?\x00\x00\x05\x8b\x05\xb6\x10&\x00{\x00\x00\x10'\x00\xd1\x02J\x00\x00\x11\a\x00\xd2\x02\xfc\xfd\xb7\x000@\x1d\x03\x02\x16\x18\x03\x02\xbf\x16\x01\x8f\x16\x01?\x16\x01\x16\x01@\x11\x01\x00\x11\x01\x11\x00@\x00\x01\x00\x11]5\x11]]5\x11]]]55\x00?55\x00\x00\xff\xff\x00,\x00\x00\x05\xa0\x05\xb6\x10&\x00{\xed\x00\x10'\x00\xd1\x025\x00\x00\x11\a\x00t\x033\xfd\xb7\x00(@\x18\x02\x14\x18\x02\x00\x14\x01\x14\x01\xb0\x11\x01@\x11\x01\x11\x00p\x00\x01@\x00\x01\x00\x11]]5\x11]]5\x11]5\x00?5\x00\x00\xff\xff\x00\x1f\x00\x00\x05\xce\x05\xc9\x10&\x00u\x00\x00\x10'\x00\xd1\x02\xa8\x00\x00\x11\a\x00\xd2\x03?\xfd\xb7\x00<@'\x03\x028\x18\x03\x02p8\x01P8\x018\x01\xb43\x01\xa43\x01\x843\x01d3\x01P3\x0103\x01 3\x013\x0fL\x01]\x11]]]]]]]5\x11]]55\x00?55\x00\x00\x00\x02\x00D\xfew\x03D\x04^\x00'\x00;\x00D@\x122\x9a(('F\x00\x00\v\x14=\x0f=\x01\b\vF\x1c\xb8\xff\xc0@\x10\x0f\x1bH\x1c\v\x17''-\x9b7\x10\x13\x10Q\x17\x00/\xe13?\xe52/\x129\x01/+\xe1^]\x10\xce\x119/\xe13/\xe110\x01\x15\x14\x0e\x02\a\x0e\x03\x15\x14\x1e\x023267\x17\x0e\x01#\".\x0254>\x027>\x03=\x01\x13\x14\x0e\x02#\".\x0254>\x0232\x1e\x02\x02P\x10'A20D+\x15\x1e9U7T\x96E@R\xbca]\x95g8\x1b5Q64B&\x0e\xba\x13#.\x1b\x1a.#\x14\x14#.\x1a\x1b.#\x13\x02\xa4%:[QL*)CEO50O9\x1f3#\x92*:3`\x8aXDhZT/-C>C+\x13\x01/&5!\x0f\x0f!5&%4\"\x10\x10\"4\xff\xff\x00\x00\x00\x00\x04\xdd\as\x12&\x00$\x00\x00\x11\a\x00C\xff\xbd\x01R\x00\x15\xb4\x02\x15\x05&\x02\xb8\xff\x9c\xb4\x1b\x15\x04\a%\x01+5\x00+5\x00\xff\xff\x00\x00\x00\x00\x04\xdd\as\x12&\x00$\x00\x00\x11\a\x00v\x00\x8d\x01R\x00\x13@\v\x02!\x05&\x02l\x15\x1b\x04\a%\x01+5\x00+5\x00\x00\x00\xff\xff\x00\x00\x00\x00\x04\xdd\as\x12&\x00$\x00\x00\x11\a\x00\xc3\x00\x1f\x01R\x00\x15\xb4\x02\x15\x05&\x02\xb8\xff\xff\xb4\x1d\x15\x04\a%\x01+5\x00+5\x00\xff\xff\x00\x00\x00\x00\x04\xdd\a5\x12&\x00$\x00\x00\x11\a\x00\xc5\x00\x06\x01R\x00\x13@\v\x02\x1d\x05&\x02\x01\x1e,\x04\a%\x01+5\x00+5\x00\x00\x00\xff\xff\x00\x00\x00\x00\x04\xdd\a+\x12&\x00$\x00\x00\x11\a\x00j\x00!\x01R\x00\x17@\r\x03\x02\x1e\x05&\x03\x02\x01\x15)\x04\a%\x01+55\x00+55\x00\x00\x00\xff\xff\x00\x00\x00\x00\x04\xdd\a\x04\x12&\x00$\x00\x00\x11\x06\x00\xc4\x1f}\x001@ \x03\x02\xef\x1a\x01\xdf\x1a\x01P\x1a\x01@\x1a\x01 \x1a\x01\x10\x1a\x01\x00\x1a\x01\x1a\x03\x02\x00\x1f\x15\x04\a%\x01+55\x00\x11]]]]]]]55\x00\x00\x00\x00\x02\xff\xfe\x00\x00\x06V\x05\xb6\x00\x0f\x00\x13\x00\x84@*\x06\x13\n\x0eZ\x01\x11\x01\x10\x03\x04\x13\xa9\x13\x01$\x134\x13T\x13\x03\x10\x01\x01\x14\f\x01\x13\x01\f\f\x01\x13\x03\x05\b\x00g\x15\x04\x05\xb8\xff\xf0@ \x05\t\x13_\x06\x03_\x10\r_\nO\n\x01\x0f\n\xaf\n\x02\b\x10\n\x10\n\x06\x03\x04\x0e_\x05\x01\x12\x00?3\xe1/?99//^]q\x10\xe1\x10\xe1\x10\xe12\x01/83\x10\xe62\x11\x179///]]]]}\x87\xc4\xc4\x11\x013\x10\xe12\x11310)\x01\x11!\x03#\x01!\x15!\x11!\x15!\x11!\x01!\x11#\x06V\xfd\b\xfe%\u02fa\x02\x8f\x03\xc9\xfd\xc3\x02\x16\xfd\xea\x02=\xfbu\x01\x93l\x01\xc5\xfe;\x05\xb6\xa4\xfe<\xa2\xfd\xf8\x01\xc6\x02\xa8\x00\x00\x00\xff\xff\x00}\xfe\x14\x04\x98\x05\xcb\x12&\x00&\x00\x00\x11\a\x00z\x01\xfc\x00\x00\x00\v\xb6\x01O*$\x18 %\x01+5\x00\x00\x00\xff\xff\x00\xc7\x00\x00\x03\xbe\as\x12&\x00(\x00\x00\x11\a\x00C\xff\xb7\x01R\x00\x15\xb4\x01\f\x05&\x01\xb8\xff\u00b4\x12\f\x01\x00%\x01+5\x00+5\x00\xff\xff\x00\xc7\x00\x00\x03\xbe\as\x12&\x00(\x00\x00\x11\a\x00v\x00?\x01R\x00\x13@\v\x01\x18\x05&\x01J\f\x12\x01\x00%\x01+5\x00+5\x00\x00\x00\xff\xff\x00\xc7\x00\x00\x03\xbe\as\x12&\x00(\x00\x00\x11\a\x00\xc3\xff\xf1\x01R\x00\x15\xb4\x01\f\x05&\x01\xb8\xff\xfd\xb4\x14\f\x01\x00%\x01+5\x00+5\x00\xff\xff\x00\xc7\x00\x00\x03\xbe\a+\x12&\x00(\x00\x00\x11\a\x00j\xff\xf5\x01R\x00\x17@\r\x02\x01\x15\x05&\x02\x01\x01\f \x01\x00%\x01+55\x00+55\x00\x00\x00\xff\xff\x00>\x00\x00\x02d\as\x12&\x00,\x00\x00\x11\a\x00C\xfe\xb5\x01R\x00\x15\xb4\x01\f\x05&\x01\xb8\xff\xa8\xb4\x12\f\x01\x00%\x01+5\x00+5\x00\xff\xff\x00R\x00\x00\x02\x8a\as\x12&\x00,\x00\x00\x11\a\x00v\xffx\x01R\x00\x13@\v\x01\x18\x05&\x01j\f\x12\x01\x00%\x01+5\x00+5\x00\x00\x00\xff\xff\x00\x11\x00\x00\x02\xa9\as\x12&\x00,\x00\x00\x11\a\x00\xc3\xff\x0f\x01R\x00\x13@\v\x01\f\x05&\x01\x02\x14\f\x01\x00%\x01+5\x00+5\x00\x00\x00\xff\xff\x00@\x00\x00\x02w\a+\x12&\x00,\x00\x00\x11\a\x00j\xff\r\x01R\x00\x17@\r\x02\x01\x15\x05&\x02\x01\x00\f \x01\x00%\x01+55\x00+55\x00\x00\x00\x00\x02\x00/\x00\x00\x04\xfc\x05\xb6\x00\x10\x00\x1f\x00]@:\x1a\x1a\x0e\x11[\bg! !\x01\x18\x1cZ\x0e\x10\x10\x01\x0ed \x1b\x10_\x18\x0f\x00\x01\x0f\x00?\x00o\x00\xaf\x00\xdf\x00\xff\x00\x06\b\x00@\x1a\x1dH\x00\x00\x02\x1c`\x0e\x12\x17`\x02\x03\x00?\xe1?\xe1\x119/+^]q3\xe12\x01\x10\xe622/\x10\xe12]\x10\xf6\xe1\x119/10\x133\x11!2\x1e\x01\x12\x15\x14\x02\x06\x04#!\x11#%4.\x02+\x01\x11!\x15!\x113 \x00/\x98\x01\x97\x99\xf8\xae_`\xb6\xfe\xf7\xa8\xfe\x92\x98\x04\bB~\xb8u\xc9\x01P\xfe\xb0\xa2\x01\b\x01\f\x03%\x02\x91\\\xb5\xfe\xf4\xb0\xb9\xfe\xe9\xbb^\x02\x83`\x92\u054aC\xfe\x0e\xa2\xfe\x1d\x01$\xff\xff\x00\xc7\x00\x00\x05\x0e\a5\x12&\x001\x00\x00\x11\a\x00\xc5\x00\x8b\x01R\x00\x13@\v\x01 \x05&\x01\n!/\n\x00%\x01+5\x00+5\x00\x00\x00\xff\xff\x00}\xff\xec\x05q\as\x12&\x002\x00\x00\x11\a\x00C\x00T\x01R\x00\x15\xb4\x02(\x05&\x02\xb8\xff\xab\xb4.(\n\x00%\x01+5\x00+5\x00\xff\xff\x00}\xff\xec\x05q\as\x12&\x002\x00\x00\x11\a\x00v\x01\x02\x01R\x00\x13@\v\x024\x05&\x02X(.\n\x00%\x01+5\x00+5\x00\x00\x00\xff\xff\x00}\xff\xec\x05q\as\x12&\x002\x00\x00\x11\a\x00\xc3\x00\xae\x01R\x00\x13@\v\x02(\x05&\x02\x050(\n\x00%\x01+5\x00+5\x00\x00\x00\xff\xff\x00}\xff\xec\x05q\a5\x12&\x002\x00\x00\x11\a\x00\xc5\x00}\x01R\x00\x15\xb4\x020\x05&\x02\xb8\xff\xf0\xb41?\n\x00%\x01+5\x00+5\x00\xff\xff\x00}\xff\xec\x05q\a+\x12&\x002\x00\x00\x11\a\x00j\x00\xaa\x01R\x00\x17@\r\x03\x021\x05&\x03\x02\x01(<\n\x00%\x01+55\x00+55\x00\x00\x00\x00\x01\x00\x8d\x01-\x03\xdd\x04{\x00\v\x00\x87\xb9\x00\x06\xff\xf0\xb3\x14\x17H\x06\xb8\xff\xe0@\x18\x0f\x12H\x00\x10\x14\x17H\x00 \x0f\x12H\t\x10\x14\x17H\t \x0f\x12H\x03\xb8\xff\xf0\xb3\x14\x17H\x03\xb8\xff\xe0@0\x0f\x12H@\r\x01\a\x05\x05\x03\v\x01\x01P\x03\x01\x03\b\n\n\x04\x02\x02 \x00\x01\x00\x00 \x00P\x00p\x00\x80\x00\xa0\x00\xc0\x00\xd0\x00\xf0\x00\t\x06\x00\xb3\x00\x19?^]q2\x1132\x113\x01/]3\x113\x113\x113]10\x00++++\x01++++\t\x017\t\x01\x17\t\x01\a\t\x01'\x01\xcb\xfe\xc2i\x01=\x01Bh\xfe\xbf\x01?f\xfe\xbe\xfe\xc3g\x02\xd3\x01?i\xfe\xc2\x01>g\xfe\xbf\xfe\xc0f\x01=\xfe\xc5g\x00\x00\x00\x00\x03\x00}\xff\xb4\x05q\x05\xfc\x00\x1a\x00&\x001\x00\\@:)\x1f*\x1e\x04\x1b'[\x01\x19\v\x0e\x04\x11\x04g3\xc03\x01\xbf3\x01p3\x01/3_3\x02\x1b[\x11f2\x1f)\x1e*\x04-\"_\x19\x01\x0e\v\x04\t\x1a\x16\x04-_\f\t\x13\x00?3\xe1?3\x12\x179\xe1\x11\x179\x01\x10\xf6\xe1]]]]\x10\xf6\x11\x179\xe1\x11\x17910\x01\a\x16\x12\x15\x14\x02\x0e\x01#\"'\a'7&\x0254\x12>\x0132\x16\x177\x01\x14\x16\x17\x01.\x01#\"\x0e\x02\x05\x10'\x01\x1e\x0132>\x02\x05\x14\\[^Q\xa0\ud6fd\x85N\x89Za[L\x9e\xf0\xa3^\xa1BP\xfc\xb7.0\x02C0rGr\xa6l4\x03jX\xfd\xbe/rEr\xa5k2\x05\xae\x95c\xfe\u07b7\xa9\xfe\xea\xc6lG\u007fN\x91d\x01*\xbe\xaa\x01\x15\xc4k*&\u007f\xfc\xe1\x83\xd1N\x03\xb1\x1d Q\x97\u068a\x01\x01\x97\xfcT\x1c\x1eQ\x99\xdb\x00\x00\xff\xff\x00\xb8\xff\xec\x04\xdd\as\x12&\x008\x00\x00\x11\a\x00C\x00=\x01R\x00\x15\xb4\x01\x18\x05&\x01\xb8\xff\xc0\xb4\x1e\x18\v\x00%\x01+5\x00+5\x00\xff\xff\x00\xb8\xff\xec\x04\xdd\as\x12&\x008\x00\x00\x11\a\x00v\x00\xc5\x01R\x00\x13@\v\x01$\x05&\x01H\x18\x1e\v\x00%\x01+5\x00+5\x00\x00\x00\xff\xff\x00\xb8\xff\xec\x04\xdd\as\x12&\x008\x00\x00\x11\a\x00\xc3\x00y\x01R\x00\x15\xb4\x01\x18\x05&\x01\xb8\xff\xfd\xb4 \x18\v\x00%\x01+5\x00+5\x00\xff\xff\x00\xb8\xff\xec\x04\xdd\a+\x12&\x008\x00\x00\x11\a\x00j\x00}\x01R\x00\x17@\r\x02\x01!\x05&\x02\x01\x01\x18,\v\x00%\x01+55\x00+55\x00\x00\x00\xff\xff\x00\x00\x00\x00\x047\as\x12&\x00<\x00\x00\x11\a\x00v\x001\x01R\x00\x13@\v\x01\x15\x05&\x01c\t\x0f\a\x02%\x01+5\x00+5\x00\x00\x00\x00\x02\x00\xc7\x00\x00\x043\x05\xb6\x00\x10\x00\x1b\x00<@!\x17[\x00g\x1d\x9f\x1d\x01\x10\x1d\x01\x11\v\aZ\bd\x1c\x11`\x06\x1b`\v\x06\v\x06\v\a\t\x03\a\x12\x00??\x1299//\x10\xe1\x10\xe1\x01\x10\xf6\xe122]]\x10\xf6\xe110\x01\x14\x0e\x02+\x01\x11#\x113\x1532\x1e\x02\x0132>\x0254&+\x01\x0437~\u03d8\x96\xba\xba\xb0\x86\xc2~<\xfdN\x81]\x8b[.\xa4\xae\xa0\x03\x0e[\xa8\x81M\xfe\xc3\x05\xb6\xfc9m\xa0\xfeg GqQ\x8f\x88\x00\x00\x01\x00\xae\xff\xec\x04u\x06\x1f\x00K\x00m@H\aF.5G\x00\x0f\x19\x1f\x19/\x19\x03\x19@\r\x13H_.o.\x02\x0f\x00\x1f\x00/\x00\x03\b\x19.\x00\x00.\x19\x03A$G\x11WM\x10M M\xc0M\x03@GATL$\a5\x03\x16:PG\x01A\x15\x1fP\x1a\x16\x16\x00?3\xe1??\xe1\x12\x179\x01\x10\xf6\xe1]\x10\xf6\xe1\x12\x179///^]]+]\x10\xe1\x10\xe110\x01\x14\x0e\x04\x15\x14\x1e\x02\x17\x1e\x03\x15\x14\x0e\x02#\"&'5\x1e\x0332>\x0254.\x02'.\x0354>\x0454.\x02#\"\x0e\x02\x15\x11#\x114>\x0232\x1e\x02\x03\xf2+?K?+\x0e'F98X=!8e\x8dUa\x8b5\x1aAHL%8Q4\x18\x11+H8?U5\x16)>H>)!<S31XB'\xb6?q\x9c\\\\\x98l<\x04\xec9YI<76\x1e\x15!'1&%HR`>W~Q'#\"\xa6\x10\x1f\x18\x0f\x19-@($;8:#(DCF*6O?6:C,*>)\x13\x130SA\xfbN\x04\xb0h\x8dU%&Lt\x00\x00\xff\xff\x00^\xff\xec\x03\x9c\x06!\x12&\x00D\x00\x00\x11\x06\x00C\x94\x00\x00\x15\xb4\x023\x11&\x02\xb8\xff\xe5\xb493\f\"%\x01+5\x00+5\x00\x00\x00\xff\xff\x00^\xff\xec\x03\x9c\x06!\x12&\x00D\x00\x00\x11\x06\x00v5\x00\x00\x13@\v\x02?\x11&\x02\x8539\f\"%\x01+5\x00+5\x00\xff\xff\x00^\xff\xec\x03\x9c\x06!\x12&\x00D\x00\x00\x11\x06\x00\xc3\xe2\x00\x00\x13@\v\x023\x11&\x023;3\f\"%\x01+5\x00+5\x00\xff\xff\x00^\xff\xec\x03\x9c\x05\xe3\x12&\x00D\x00\x00\x11\x06\x00\u017d\x00\x00\x13@\v\x02;\x11&\x02)<J\f\"%\x01+5\x00+5\x00\xff\xff\x00^\xff\xec\x03\x9c\x05\xd9\x12&\x00D\x00\x00\x11\x06\x00j\xde\x00\x00\x17@\r\x03\x02<\x11&\x03\x02/3G\f\"%\x01+55\x00+55\x00\xff\xff\x00^\xff\xec\x03\x9c\x06\x87\x12&\x00D\x00\x00\x11\x06\x00\xc4\xde\x00\x00\x17@\r\x03\x028\x11&\x03\x020=3\f\"%\x01+55\x00+55\x00\x00\x03\x00^\xff\xec\x06D\x04^\x008\x00G\x00P\x00|@\x1a/\x14K\x1eH\x04BB\x00LH&\x1dWROR_R\x9fR\x039H\x00\x0e\xb8\xff\xc0@.\r\x11H\x0e\x0e\x00VQ\x00B\x10B\x02B\x1eP\x00\x04\x10\x04\x02\x04\x0fK\x1fK\x02\aKK\x11!<P/,4\x16H\r\nP\x17\x14\x11\x10\x00?33\xe122?33\xe12\x119/^]3]\xe12]\x01\x10\xe62/+\x10\xe1]\x10\xf62\xe1\x119/3\xe129910\x1346?\x0154.\x02#\"\x06\a'>\x0132\x16\x17>\x0132\x1e\x02\x1d\x01!\x1e\x0132>\x027\x15\x0e\x03#\"&'\x0e\x03#\".\x027\x14\x1632>\x02=\x01\a\x0e\x03\x01\"\x06\a!4.\x02^\xe7\xec\xb8\x1d7Q4S\x8fB@J\xb6d\x83\xa6+3\xa6ga\x9al9\xfd`\x05\x93\x931UNJ%'KOU1\x8a\xca>\"L_tJG{Z4\xbdaO=hL+\x8fZzI \x03\x85n\u007f\v\x01\xd7\x1a7T\x013\xa4\xb0\b\aECZ7\x180\"\x89(8U]U]G\x81\xb5nq\xc1\xb6\n\x13\x1d\x12\xa2\x13\x1c\x12\brs6U;\x1f'Q{R\\V&MuOc\a\x04 9Q\x02c\x9c\x95DqP,\x00\xff\xff\x00q\xfe\x14\x03o\x04^\x12&\x00F\x00\x00\x11\a\x00z\x01B\x00\x00\x00\v\xb6\x01/& \x05\r%\x01+5\x00\x00\x00\xff\xff\x00q\xff\xec\x03\xe1\x06!\x12&\x00H\x00\x00\x11\x06\x00C\x94\x00\x00\x15\xb4\x02(\x11&\x02\xb8\xff\xb9\xb4.(\x05\x0f%\x01+5\x00+5\x00\x00\x00\xff\xff\x00q\xff\xec\x03\xe1\x06!\x12&\x00H\x00\x00\x11\x06\x00vR\x00\x00\x13@\v\x024\x11&\x02v(.\x05\x0f%\x01+5\x00+5\x00\xff\xff\x00q\xff\xec\x03\xe1\x06!\x12&\x00H\x00\x00\x11\x06\x00\xc3\xde\x00\x00\x13@\v\x02(\x11&\x02\x030(\x05\x0f%\x01+5\x00+5\x00\xff\xff\x00q\xff\xec\x03\xe1\x05\xd9\x12&\x00H\x00\x00\x11\x06\x00j\xda\x00\x00\x17@\r\x03\x021\x11&\x03\x02\x00(<\x05\x0f%\x01+55\x00+55\x00\xff\xff\xff\xde\x00\x00\x01g\x06!\x12&\x00\xc2\x00\x00\x11\a\x00C\xfeU\x00\x00\x00\x15\xb4\x01\x04\x11&\x01\xb8\xff\x9a\xb4\n\x04\x01\x00%\x01+5\x00+5\x00\xff\xff\x00\xae\x00\x00\x02B\x06!\x12&\x00\xc2\x00\x00\x11\a\x00v\xff0\x00\x00\x00\x13@\v\x01\x10\x11&\x01t\x04\n\x01\x00%\x01+5\x00+5\x00\x00\x00\xff\xff\xff\xbd\x00\x00\x02U\x06!\x12&\x00\xc2\x00\x00\x11\a\x00\xc3\xfe\xbb\x00\x00\x00\x13@\v\x01\x04\x11&\x01\x00\f\x04\x01\x00%\x01+5\x00+5\x00\x00\x00\xff\xff\xff\xee\x00\x00\x02%\x05\xd9\x12&\x00\xc2\x00\x00\x11\a\x00j\xfe\xbb\x00\x00\x00\x17@\r\x02\x01\r\x11&\x02\x01\x00\x04\x18\x01\x00%\x01+55\x00+55\x00\x00\x00\x00\x02\x00o\xff\xec\x04-\x06#\x00'\x009\x00t@F\x12(H\x00# \x16\x19\x04\x1c\"\x18\x1c\"\"\x1c\x18\x03\n\x00W;@;\xd0;\xe0;\x03\x0f;\x01\x062H\nV: \x19#\x16\x04\x17!!\x1d-P\x0f\x12\x0f\xaf\x0f\xbf\x0f\x020\x0f\x01\x17\x0f\x17\x0f\x1d\x017P\x05\x16\x00?\xe1?99//]]\x113\x10\xe1\x113\x11\x12\x179\x01\x10\xf6\xe1^]]\x10\xe6\x11\x179///\x11\x12\x179\x10\xe1210\x01\x14\x0e\x02#\".\x0254>\x0232\x16\x177.\x01'\x05'7.\x01'7\x1e\x01\x177\x17\a\x1e\x03\a4.\x02#\"\x0e\x02\x15\x14\x1e\x02326\x04-C}\xb2oh\xaf\u007fG?v\xa8if\x9a+\b\x1fxZ\xff\x00J\xd9(U/FAz;\xe3J\xc3CoO,\xbc\"FnKMmF!!GmL\x9a\x87\x02=\x8e\u0718OB\u007f\xb9ww\xb8~A;<\x04v\xc0Q\x99r\x83\x1c7\x1a{ H,\x8aquA\x9c\xbb\u07708kR2.X\x83UL}Z1\xc7\x00\xff\xff\x00\xae\x00\x00\x04\x12\x05\xe3\x12&\x00Q\x00\x00\x11\x06\x00\xc5\xf9\x00\x00\x13@\v\x01!\x11&\x01\x02\"0\v\x17%\x01+5\x00+5\x00\xff\xff\x00q\xff\xec\x04-\x06!\x12&\x00R\x00\x00\x11\x06\x00C\xd8\x00\x00\x15\xb4\x02 \x11&\x02\xb8\xff\u05f4& \n\x00%\x01+5\x00+5\x00\x00\x00\xff\xff\x00q\xff\xec\x04-\x06!\x12&\x00R\x00\x00\x11\x06\x00vP\x00\x00\x13@\v\x02,\x11&\x02N &\n\x00%\x01+5\x00+5\x00\xff\xff\x00q\xff\xec\x04-\x06!\x12&\x00R\x00\x00\x11\x06\x00\xc3\xfb\x00\x00\x15\xb4\x02 \x11&\x02\xb8\xff\xfa\xb4( \n\x00%\x01+5\x00+5\x00\x00\x00\xff\xff\x00q\xff\xec\x04-\x05\xe3\x12&\x00R\x00\x00\x11\x06\x00\xc5\xe2\x00\x00\x15\xb4\x02(\x11&\x02\xb8\xff\xfd\xb4)7\n\x00%\x01+5\x00+5\x00\x00\x00\xff\xff\x00q\xff\xec\x04-\x05\xd9\x12&\x00R\x00\x00\x11\x06\x00j\xf9\x00\x00\x19\xb6\x03\x02)\x11&\x03\x02\xb8\xff\xf9\xb4 4\n\x00%\x01+55\x00+55\x00\x00\x00\x00\x03\x00f\x00\xf8\x04\x02\x04\xac\x00\x03\x00\x17\x00+\x00`@\x150-\x01\"\xaa\x18\x18\x0e\xaaV\x03f\x03\x02(\x038\x03\x02\x03\x00\xb8\xff\xf0@(\t\rH\x00\x04'\xad\x10\x1d\x01\x0f\x1d\x01\x1d\x1d\x01\t\xad\x00\x13\x10\x13 \x13`\x13\xb0\x13\xc0\x13\xd0\x13\a\a\x13\x13\x00\xad\x01\xb3\x00?\xe13/^]\xe1\x113/]q\xe1\x01/3+3]]\xe13/\xe1]10\x135!\x15\x014>\x0232\x1e\x02\x15\x14\x0e\x02#\".\x02\x114>\x0232\x1e\x02\x15\x14\x0e\x02#\".\x02f\x03\x9c\xfd\xbf\x12\x1f)\x18\x17* \x12\x12 *\x17\x18)\x1f\x12\x12\x1f)\x18\x17* \x12\x12 *\x17\x18)\x1f\x12\x02\x87\x96\x96\xfe\xee#/\x1e\r\r\x1e/#!/\x1f\x0e\x0e\x1f/\x02\xdb#/\x1e\r\r\x1e/#!/\x1f\x0e\x0e\x1f/\x00\x00\x00\x00\x03\x00s\xff\xb4\x04/\x04\x91\x00\x1a\x00$\x00-\x00\\@;'\x1f(\x1e\x04\x1b%H\x17\x18\x16\x15\a\b\n\t\b\r\x00W/@/\xd0/\xe0/\x03\x0f/\x01\x06\x1bH\rV.(\x1e'\x1f\x04+\"P\a\n\x18\x15\x04\x05\x16\x12\x10+P\b\x05\x16\x00?\xc6\xe1?\xc6\x12\x179\xe1\x11\x179\x01\x10\xf6\xe1^]]\x10\xf6\x11\x179\xe1\x11\x17910\x01\x14\x0e\x02#\"'\a'7.\x0154>\x0232\x16\x177\x17\a\x1e\x01\x05\x14\x16\x17\x01.\x01#\"\x06\x054'\x01\x1e\x01326\x04/C}\xb2o}bD\x83P?FC|\xb3o?q1D\x83P>E\xfd\x00\x13\x16\x01\x8d\x1dK-\x9a\x87\x02D'\xfer\x1fH-\x9a\x87\x02'\x89\u0551L5mJ\x83H\u0549\x88\u04d1K\x1d\x1clI\x81I\u0446T\x833\x02\x87\x11\x12\xcf\u045fc\xfd{\x11\x10\xd3\x00\x00\x00\xff\xff\x00\xa4\xff\xec\x04\b\x06!\x12&\x00X\x00\x00\x11\x06\x00C\xa3\x00\x00\x15\xb4\x01\x1b\x11&\x01\xb8\xff\x9b\xb4!\x1b\f\x19%\x01+5\x00+5\x00\x00\x00\xff\xff\x00\xa4\xff\xec\x04\b\x06!\x12&\x00X\x00\x00\x11\x06\x00v`\x00\x00\x13@\v\x01'\x11&\x01W\x1b!\f\x19%\x01+5\x00+5\x00\xff\xff\x00\xa4\xff\xec\x04\b\x06!\x12&\x00X\x00\x00\x11\x06\x00\xc3\b\x00\x00\x13@\v\x01\x1b\x11&\x01\x00#\x1b\f\x19%\x01+5\x00+5\x00\xff\xff\x00\xa4\xff\xec\x04\b\x05\xd9\x12&\x00X\x00\x00\x11\x06\x00j\x02\x00\x00\x19\xb6\x02\x01$\x11&\x02\x01\xb8\xff\xfb\xb4\x1b/\f\x19%\x01+55\x00+55\x00\x00\x00\xff\xff\x00\n\xfe\x14\x03\xdf\x06!\x12&\x00\\\x00\x00\x11\x06\x00v\x0e\x00\x00\x13@\v\x01/\x11&\x01g#)\x00\x0f%\x01+5\x00+5\x00\x00\x02\x00\xae\xfe\x14\x04?\x06\x14\x00 \x001\x008@\x1f/H\nW3\x103\x01' \x1f\x15\x1bG\x1cT2\x1d\x00\x1b\x1b,P\x15\x0f\x16!P\x00\x05\x10\x00?3\xe1?3\xe1??\x01\x10\xf6\xe12222]\x10\xf6\xe110\x01>\x0332\x1e\x02\x15\x14\x0e\x02#\".\x02'#\x16\x17\x1e\x01\x15\x11#\x113\x11\a%\"\x0e\x02\a\x15\x14\x1e\x0232654&\x01d\x17:M`<^\x9am<<m\x9a^;`M;\x17\f\x03\x03\x02\x04\xb6\xb6\b\x01\x1fLiA\x1f\x02\x1bAlQ\x87\u007f\u007f\x03\xb6#=-\x1bH\x8f\u050c\x8d\u0550I\x1a+: \"\x1f\x1a7\x10\xfe+\b\x00\xfe6\x94\x11.^\x8c_)e\x9dk7\xda\xcc\xd0\xce\x00\x00\x00\xff\xff\x00\n\xfe\x14\x03\xdf\x05\xd9\x12&\x00\\\x00\x00\x11\x06\x00j\xb1\x00\x00\x17@\r\x02\x01,\x11&\x02\x01\v#7\x00\x0f%\x01+55\x00+55\x00\x00\x01\x00\xae\x00\x00\x01d\x04J\x00\x03\x00\x1a@\x0e\x10\x05 \x05\x02\x00G\x01T\x04\x02\x0f\x00\x15\x00??\x01\x10\xf6\xe1]10!#\x113\x01d\xb6\xb6\x04J\x00\x00\x00\x01\x01\x02\x04\xd9\x03\x9a\x06!\x00\x14\x00%@\x11\x0f\x0e\x04\x04\x00\xc0\b\x04\x0e\x80\x00\x0f\b_\b\x02\b\x00/]3\x1a\xcc2\x01/\x1a\xcc9=/3310\x01#.\x01'\x0e\x01\a#5>\x0373\x1e\x03\x17\x03\x9ay3l46j3y\x1aDC;\x10\xc0\x10;CE\x19\x04\xd9\"a77a\"\x1b\x1dLQQ\"\"QQL\x1d\x00\x02\x01m\x04\xd9\x031\x06\x87\x00\x13\x00\x1f\x00@@-\x14\x83\x0f\x00?\x00O\x00_\x00\x04\x00\x1a\x830\n\x01\n\x17\x8c\x0f\x0f\x1f\x0f?\x0fO\x0f_\x0f\xaf\x0f\xff\x0f\a\x06\x0f\x1d\x8c\x0f\x05_\x05\x02\x05\x00/]\xe1\xd4^]\xe1\x01/]\xe1\xd4]\xe110\x01\x14\x0e\x02#\".\x0254>\x0232\x1e\x02\a4&#\"\x06\x15\x14\x16326\x031#=T12R;  ;R20T>#u?12?981?\x05\xb23Q8\x1d\x1d8O33O8\x1d\x1d7O45<<55<<\x00\x01\x01\x02\x04\xd9\x03\xd1\x05\xe3\x00\x1b\x008@#\x0f\x17/\x17\x02\x17\x00\t \t\x02\a\t\x16\x05\x8f\x0e@\x10\x13H\x0e@\a\vH\x0e\x0e\x13\x8f\t\x0f\x00\x01\x00\x00/]2\xe13/++\xe13\x01/^]\xcc]10\x01\".\x02#\"\x06\a#>\x0332\x1e\x0232673\x0e\x03\x02\xfe(OLF -0\x0eh\x05!5J.*QLE\x1d-.\x0fi\x05!5J\x04\xdb#+#5><bE%#*#4><aE&\x00\x00\x00\x00\x01\x00R\x01\xd1\x03\xae\x02y\x00\x03\x00\x1d\xb9\x00\x02\xff\xc0@\v\x06\fH\x02\x02\x05\x00\x00\xb9\x01\xbd\x00?\xe1\x01/\x113/+10\x135!\x15R\x03\\\x01\u0468\xa8\x00\x00\x00\x01\x00R\x01\xd1\a\xae\x02y\x00\x03\x00\x1d\xb9\x00\x02\xff\xc0@\v\x06\fH\x02\x02\x05\x00\x00\xb9\x01\xbd\x00?\xe1\x01/\x113/+10\x135!\x15R\a\\\x01\u0468\xa8\x00\x00\x00\x01\x00\x17\x03\xc1\x01P\x05\xb6\x00\f\x00%@\x17_\x0e\x01\x06\x0f\a_\ao\a\xbf\a\xcf\a\x05\a\f\x98\x01\f\x9c\x06\x03\x00?\xe5\x01/\xe1/]3]10\x13'>\x0373\x0e\x03\a%\x0e\x0e'.4\x19\x89\x0f\x1d\x1a\x16\b\x03\xc1\x166z|{8=\x84\x83|5\x00\x00\x00\x01\x00\x17\x03\xc1\x01P\x05\xb6\x00\f\x00%@\x17_\x0e\x01\x06\a\f\x98\x0f\x01_\x01o\x01\xbf\x01\xcf\x01\x05\x01\x06\x9c\x00\x03\x00?\xe5\x01/]\xe1/3]10\x01\x17\x0e\x03\a#>\x037\x01B\x0e\x0e'/3\x19\x89\x0e\x1d\x1b\x16\b\x05\xb6\x167y}z8<\x84\x84|5\x00\x00\x01\x00?\xfe\xf8\x01y\x00\xee\x00\f\x005\xb9\x00\x0e\xff\xc0@\x14\n\x18H\f\x98\x0f\x01_\x01o\x01\u007f\x01\xcf\x01\x05\x01\x01\x06\a\xb8\xff\xc0\xb7\x10\x15H\a\x06\x9c\x00\xa8\x00?\xe5\x01/+33/]\xe1+10%\x17\x0e\x03\a#>\x037\x01j\x0f\x0e'/3\x19\x8a\x0f\x1d\x1b\x16\b\xee\x176z|{8=\x84\x83}5\x00\x00\x00\x02\x00\x17\x03\xc1\x02\xd1\x05\xb6\x00\f\x00\x19\x00b@H\xbf\x1b\x01\x90\x1b\x01\x0f\x1b_\x1bo\x1b\x03\x13\x0f\x14_\x14o\x14\u007f\x14\xbf\x14\xcf\x14\xdf\x14\a\x14\x14\x19\x98\x0e\f\x98\x00\x01P\x01`\x01p\x01\xb0\x01\xc0\x01\xd0\x01\a\x01\x01\x06\x0f\a_\ao\a\xbf\a\xcf\a\x05\a\x19\f\x9c\x13\x06\x03\x00?3\xe52\x01/]33/]\xe1/\xe13/]3]]]10\x01'>\x0373\x0e\x03\a!'>\x0373\x0e\x03\a\x01\xa6\x0e\x0e'.4\x19\x89\x0f\x1d\x1a\x16\b\xfd\xb8\x0e\x0e'.4\x19\x89\x0f\x1d\x1a\x16\b\x03\xc1\x166z|{8=\x84\x83|5\x166z|{8=\x84\x83|5\x00\x02\x00\x17\x03\xc1\x02\xd1\x05\xb6\x00\f\x00\x19\x00b@H\xbf\x1b\x01\x90\x1b\x01\x0f\x1b_\x1bo\x1b\x03\x13\x00\x14P\x14`\x14p\x14\xb0\x14\xc0\x14\xd0\x14\a\x14\x14\x19\x98\x0f\x0e_\x0eo\x0e\xbf\x0e\xcf\x0e\x05\x0e\f\x98\x0f\x01_\x01o\x01\u007f\x01\xbf\x01\xcf\x01\xdf\x01\a\x01\x01\x06\a\x13\x06\x9c\r\x00\x03\x00?2\xe52\x01/33/]\xe1/]\xe13/]3]]]10\x01\x17\x0e\x03\a#>\x037!\x17\x0e\x03\a#>\x037\x01B\x0e\x0e'/3\x19\x89\x0e\x1d\x1b\x16\b\x02H\x0e\x0e'/3\x19\x89\x0e\x1d\x1b\x16\b\x05\xb6\x167y}z8<\x84\x84|5\x167y}z8<\x84\x84|5\x00\x02\x00?\xfe\xf8\x02\xfa\x00\xee\x00\f\x00\x19\x00~@Q\xd0\x1b\xe0\x1b\xf0\x1b\x03\xa4\x1b\xb4\x1b\xc4\x1b\x03\x90\x1b\x01\x02 \x1b0\x1b@\x1b`\x1bp\x1b\x80\x1b\x06\x13\x00\x14P\x14`\x14p\x14\xc0\x14\xd0\x14\x06\x14\x14\x19\x98\x90\x0e\xe0\x0e\xf0\x0e\x03\x0f\x0e_\x0e\x02\x0e\f\x98\x0f\x01_\x01o\x01\u007f\x01\xcf\x01\xdf\x01\x06\x01\x01\x06\a\xb8\xff\xc0@\n\x10\x18H\a\x13\x06\x9c\r\x00\xa8\x00?2\xe52\x01/+33/]\xe1/]]\xe13/]3]_]]]10%\x17\x0e\x03\a#>\x037!\x17\x0e\x03\a#>\x037\x01j\x0f\x0e'/3\x19\x8a\x0f\x1d\x1b\x16\b\x02H\x0e\x0e'/3\x19\x89\x0e\x1d\x1b\x16\b\xee\x176z|{8=\x84\x83}5\x176z|{8=\x84\x83}5\x00\x00\x01\x00\x96\x01\xe5\x02m\x03\xf2\x00\x13\x00F@$/\x15_\x15o\x15\u007f\x15\xcf\x15\xef\x15\xff\x15\a\x10\x15\x01_\no\n\x9f\n\xaf\n\xdf\n\xef\n\x06\n\xd0\x00\x01\x00\xb8\xff\xc0@\f\a\nH\x00\x1f\x0f\x01\x0f\x10\x05\x01\x05\x00/]\xc5]\x01/+]\xc5]]]10\x134>\x0232\x1e\x02\x15\x14\x0e\x02#\".\x02\x96$?V21V@%%@V12V?$\x02\xecGd?\x1c\x1c?dGFd?\x1e\x1e?d\x00\x00\x00\x01\x00R\x00s\x01\xfc\x03\xc7\x00\x06\x00<\xb1\x04\x02\xb8\xff\xc0@\x1f\t\fH\x02\b?\b\x9f\b\xaf\b\xdf\b\xef\b\xff\b\x06\x06\xeb\x9f\x03\x01\x03\x06\x00\x03\x03\x01\x05\x01\x00//\x129=/33\x01\x18/]\xe1]\x10\xc6+210\x13\x01\x17\x03\x13\a\x01R\x015u\xee\xeeu\xfe\xcb\x02)\x01\x9eN\xfe\xa4\xfe\xa4N\x01\x9b\x00\x00\x00\x01\x00R\x00s\x01\xfc\x03\xc7\x00\x06\x00?@(\x00\xeb\xdf\x03\xef\x03\xff\x03\x03\x10\x03 \x03\x02\x03?\b\x9f\b\xaf\b\xdf\b\xef\b\xff\b\x06\x04?\x02\x01\x02\x06\x00\x03\x03\x01\x05\x01\x00//\x129=/33\x01\x18/]3]/]]\xe110\t\x01'\x13\x037\x01\x01\xfc\xfe\xcbu\xed\xedu\x015\x02\x0e\xfeeN\x01\\\x01\\N\xfeb\x00\x00\x00\x01\xfe\xa0\x00\x00\x02h\x05\xb6\x00\x03\x00\x1d\xb1\x01\x02\xb8\xff\xf0@\t\x02\x03\x00\x10\x00\x01\x12\x00\x03\x00??\x01/82/8310\t\x01#\x01\x02h\xfc\u055d\x03+\x05\xb6\xfaJ\x05\xb6\x00\x02\x00\f\x02J\x02\x8f\x05\xbc\x00\n\x00\x15\x00F@*\t\x02\xe1\v\a\x03\x03\x17_\x17\x8f\x17\x02\x17@\x06\nH\x15\xe1\x05\x01\x04\xe5\t\x0f\v\x1f\v/\v\x03\b\v\v\x02\x0f\xe5\a\xdc\x02\xdd\x00??\xe1\x129/^]3\xe12\x01/\xe1+]\x129/33\xe1210\x01#\x15#5!5\x013\x113!5467\x0e\x03\x0f\x01\x02\x8f}\x8f\xfe\x89\x01y\x8d}\xfe\xf4\x03\x03\x05\x14\x16\x18\t\x9b\x03\n\xc0\xc0o\x02C\xfd\xcd\xc3*c1\v%*(\x0f\xf0\x00\x00\x00\x00\x01\x00\x00\x00\xd3\x00i\x00\x05\x00S\x00\x04\x00\x02\x00\x10\x00/\x00Z\x00\x00\x02\x1f\x00\xe5\x00\x03\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00F\x00x\x01\x00\x01\xba\x02J\x03\x02\x03&\x03V\x03\x86\x03\xbc\x03\xea\x04 \x048\x04r\x04\x92\x04\xe4\x05\x1e\x05t\x05\xf2\x06F\x06\xae\a\"\aJ\a\xf4\bf\b\xbe\t\"\t^\t\xa0\t\xdc\nP\v\x1a\v\x86\v\xfe\f\\\f\x9c\f\xd6\r$\r\x82\r\xb8\r\xfc\x0e6\x0e\x84\x0e\xa4\x0f\x18\x0fj\x0f\xc4\x10\x12\x10|\x10\xee\x11X\x11\x9a\x11\xd8\x12,\x12\xe2\x13B\x13\x94\x13\xc8\x13\xee\x14\x0e\x142\x14P\x14h\x14\x8e\x15\x02\x15d\x15\xaa\x16\n\x16h\x16\xcc\x17\xa0\x17\xe2\x18\x14\x18`\x18\xb0\x18\xca\x19<\x19z\x19\xc4\x1a&\x1a\x88\x1a\xce\x1b>\x1b\x94\x1b\xd6\x1c.\x1c\xdc\x1dn\x1d\xd8\x1e&\x1e\x80\x1e\xa4\x1f\x00\x1fT\x1fT\x1f\x9c \x00 v!\x0e!\x82!\xb2\"l\"\xb0#Z#\xc4$\x18$F$N%\x1e%6%\x92%\xce&\x1e&\x94&\xba'\x04'B'|'\xc2'\xfa(B(\x92(\xbc(\xe2)\x12)\x88)\xa0)\xb8)\xd0)\xe8*\x02*(*\x92*\xa6*\xbe*\xd6*\xee+\b+ +8+P+j+\xce+\xe6+\xfe,\x16,.,F,`,\xc6-H-`-x-\x90-\xaa-\xc2.\f.\xa8.\xc0.\xd6.\xec/\x02/\x1a/2/\xe2/\xf60\x0e0$0:0R0j0\x820\x9a0\xb41D1Z1r1\x881\xa01\xb81\xd22D2\xbe2\xd62\xec3\x023\x1c323\x983\xb03\xca4\x004P4\x984\xb44\xd04\xfc5(5\\5\xb86\x146~6\xc26\xf67,7J7\x94\x00\x01\x00\x00\x00\x01\x00\x00d\xbc\x83%_\x0f<\xf5\x00\x1f\b\x00\x00\x00\x00\x00\xc8\x17O\xf6\x00\x00\x00\x00\xc8\\\x86Y\xfe\xa0\xfe\x14\a\xae\as\x00\x00\x00\b\x00\x02\x00\x00\x00\x00\x00\x00\b\x00\x00\x00\x00\x00\x00\x00\b\x00\x00\x00\x02\x14\x00\x00\x02'\x00\x93\x037\x00\x85\x05+\x003\x04h\x00{\x06\x9a\x00f\x05\x9e\x00m\x01\xcf\x00\x85\x02h\x00R\x02h\x00=\x04h\x00R\x04h\x00f\x02\x00\x00?\x02\x93\x00R\x02%\x00\x93\x02\xfc\x00\x14\x04h\x00b\x04h\x00\xb2\x04h\x00`\x04h\x00R\x04h\x00\x17\x04h\x00\x83\x04h\x00q\x04h\x00Z\x04h\x00j\x04h\x00j\x02%\x00\x93\x02%\x00?\x04h\x00f\x04h\x00f\x04h\x00f\x03h\x00%\x06\xee\x00m\x04\xdd\x00\x00\x04\xf8\x00\xc7\x04\xd3\x00}\x05y\x00\xc7\x049\x00\xc7\x03\xee\x00\xc7\x05\x85\x00}\x05\x9c\x00\xc7\x02\xb6\x00R\x02+\xffH\x04\xa2\x00\xc7\x03\xee\x00\xc7\x06\xf6\x00\xc7\x05\xd5\x00\xc7\x05\xf0\x00}\x04\x9c\x00\xc7\x05\xee\x00}\x04\xb8\x00\xc7\x04'\x00h\x04'\x00\x14\x05\x96\x00\xb8\x04\x8b\x00\x00\a\x12\x00\x14\x04`\x00\x00\x047\x00\x00\x04P\x00R\x02m\x00\xa4\x02\xfc\x00\x17\x02m\x003\x04B\x00)\x03J\xff\xfc\x04\x9e\x01\x89\x04?\x00^\x04\xb0\x00\xae\x03\xb4\x00q\x04\xb0\x00q\x04H\x00q\x02\xa2\x00\x1d\x04%\x00%\x04\xb6\x00\xae\x02\x12\x00\xa0\x02\x12\xff\xbc\x03\xf8\x00\xae\x02\x12\x00\xae\a+\x00\xae\x04\xb6\x00\xae\x04\x9e\x00q\x04\xb0\x00\xae\x04\xb0\x00q\x031\x00\xae\x03\x9c\x00Z\x02\xb6\x00!\x04\xb6\x00\xa4\x03\xd5\x00\x00\x05\xf8\x00\x14\x04\x00\x00#\x03\xe9\x00\n\x03\x87\x00R\x02\xd5\x00=\x04h\x01\xe9\x02\xd5\x003\x04h\x00f\x02\x14\x00\x00\x02'\x00\x93\x04h\x00\xbc\x04h\x00D\x04h\x00{\x04h\x00\x1d\x04h\x01\xe9\x03\xe3\x00y\x04\x9e\x013\x06\xa8\x00d\x02\xa6\x00D\x03\xe5\x00R\x04h\x00f\x02\x93\x00R\x06\xa8\x00d\x04\x00\xff\xfa\x03m\x00{\x04h\x00f\x02\xa6\x001\x02\xa6\x00\x1f\x04\x9e\x01\x89\x04\xc1\x00\xae\x05=\x00q\x02%\x00\x93\x01\xa4\x00#\x02\xa6\x00?\x02\xcd\x00B\x03\xe5\x00T\x05\xe5\x00?\x05\xe5\x00,\x05\xe5\x00\x1f\x03h\x00D\x04\xdd\x00\x00\x04\xdd\x00\x00\x04\xdd\x00\x00\x04\xdd\x00\x00\x04\xdd\x00\x00\x04\xdd\x00\x00\x06\xd1\xff\xfe\x04\xd3\x00}\x049\x00\xc7\x049\x00\xc7\x049\x00\xc7\x049\x00\xc7\x02\xb6\x00>\x02\xb6\x00R\x02\xb6\x00\x11\x02\xb6\x00@\x05y\x00/\x05\xd5\x00\xc7\x05\xf0\x00}\x05\xf0\x00}\x05\xf0\x00}\x05\xf0\x00}\x05\xf0\x00}\x04h\x00\x8d\x05\xf0\x00}\x05\x96\x00\xb8\x05\x96\x00\xb8\x05\x96\x00\xb8\x05\x96\x00\xb8\x047\x00\x00\x04\x9c\x00\xc7\x04\xd1\x00\xae\x04?\x00^\x04?\x00^\x04?\x00^\x04?\x00^\x04?\x00^\x04?\x00^\x06\xaa\x00^\x03\xb4\x00q\x04H\x00q\x04H\x00q\x04H\x00q\x04H\x00q\x02\x12\xff\xde\x02\x12\x00\xae\x02\x12\xff\xbd\x02\x12\xff\xee\x04\x9e\x00o\x04\xb6\x00\xae\x04\x9e\x00q\x04\x9e\x00q\x04\x9e\x00q\x04\x9e\x00q\x04\x9e\x00q\x04h\x00f\x04\x9e\x00s\x04\xb6\x00\xa4\x04\xb6\x00\xa4\x04\xb6\x00\xa4\x04\xb6\x00\xa4\x03\xe9\x00\n\x04\xb0\x00\xae\x03\xe9\x00\n\x02\x12\x00\xae\x04\x9e\x01\x02\x04\x9e\x01m\x04\x9e\x01\x02\x04\x00\x00R\b\x00\x00R\x01f\x00\x17\x01f\x00\x17\x02\x00\x00?\x02\xe7\x00\x17\x02\xe7\x00\x17\x03\x81\x00?\x03\x02\x00\x96\x02N\x00R\x02N\x00R\x01\n\xfe\xa0\x02\xa6\x00\f\x00\x01\x00\x00\as\xfe\x14\x00\x00\b\x00\xfe\xa0\xfe\xa2\a\xae\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd3\x00\x03\x04&\x01\x90\x00\x05\x00\b\x05\x9a\x053\x00\x00\x01\x1e\x05\x9a\x053\x00\x00\x03\xd0\x00f\x01\xf2\x00\x00\x02\v\x06\x06\x03\b\x04\x02\x02\x04\xe0\x00\x02\xef@\x00 [\x00\x00\x00(\x00\x00\x00\x001ASC\x00@\x00  D\x06\x1f\xfe\x14\x00\x84\as\x01\xec \x00\x01\x9f\x00\x00\x00\x00\x04J\x05\xb6\x00\x00\x00 \x00\x02\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x14\x00\x03\x00\x01\x00\x00\x00\x14\x00\x04\x00x\x00\x00\x00\x1a\x00\x10\x00\x03\x00\n\x00~\x00\xff\x011\x02\xc6\x02\xda\x02\xdc \x14 \x1a \x1e \" : D\xff\xff\x00\x00\x00 \x00\xa0\x011\x02\xc6\x02\xda\x02\xdc \x13 \x18 \x1c \" 9 D\xff\xff\xff\xe3\xff\xc2\xff\x91\xfd\xfd\xfd\xea\xfd\xe9\xe0\xb3\xe0\xb0\xe0\xaf\xe0\xac\xe0\x96\xe0\x8d\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@EYXUTSRQPONMLKJIHGFEDCBA@?>=<;:9876510/.-,('&%$#\"!\x1f\x18\x14\x11\x10\x0f\x0e\r\v\n\t\b\a\x06\x05\x04\x03\x02\x01\x00,E#F` \xb0&`\xb0\x04&#HH-,E#F#a \xb0&a\xb0\x04&#HH-,E#F`\xb0 a \xb0F`\xb0\x04&#HH-,E#F#a\xb0 ` \xb0&a\xb0 a\xb0\x04&#HH-,E#F`\xb0@a \xb0f`\xb0\x04&#HH-,E#F#a\xb0@` \xb0&a\xb0@a\xb0\x04&#HH-,\x01\x10 <\x00<-, E# \xb0\xcdD# \xb8\x01ZQX# \xb0\x8dD#Y \xb0\xedQX# \xb0MD#Y \xb0\x04&QX# \xb0\rD#Y!!-,  E\x18hD \xb0\x01` E\xb0Fvh\x8aE`D-,\x01\xb1\v\nC#Ce\n-,\x00\xb1\n\vC#C\v-,\x00\xb0(#p\xb1\x01(>\x01\xb0(#p\xb1\x02(E:\xb1\x02\x00\b\r-, E\xb0\x03%Ead\xb0PQXED\x1b!!Y-,I\xb0\x0e#D-, E\xb0\x00C`D-,\x01\xb0\x06C\xb0\aCe\n-, i\xb0@a\xb0\x00\x8b \xb1,\xc0\x8a\x8c\xb8\x10\x00b`+\fd#da\\X\xb0\x03aY-,\x8a\x03E\x8a\x8a\x87\xb0\x11+\xb0)#D\xb0)z\xe4\x18-,Ee\xb0,#DE\xb0+#D-,KRXED\x1b!!Y-,KQXED\x1b!!Y-,\x01\xb0\x05%\x10# \x8a\xf5\x00\xb0\x01`#\xed\xec-,\x01\xb0\x05%\x10# \x8a\xf5\x00\xb0\x01a#\xed\xec-,\x01\xb0\x06%\x10\xf5\x00\xed\xec-,F#F`\x8a\x8aF# F\x8a`\x8aa\xb8\xff\x80b# \x10#\x8a\xb1\f\f\x8apE` \xb0\x00PX\xb0\x01a\xb8\xff\xba\x8b\x1b\xb0F\x8cY\xb0\x10`h\x01:-, E\xb0\x03%FRK\xb0\x13Q[X\xb0\x02%F ha\xb0\x03%\xb0\x03%?#!8\x1b!\x11Y-, E\xb0\x03%FPX\xb0\x02%F ha\xb0\x03%\xb0\x03%?#!8\x1b!\x11Y-,\x00\xb0\aC\xb0\x06C\v-,!!\fd#d\x8b\xb8@\x00b-,!\xb0\x80QX\fd#d\x8b\xb8 \x00b\x1b\xb2\x00@/+Y\xb0\x02`-,!\xb0\xc0QX\fd#d\x8b\xb8\x15Ub\x1b\xb2\x00\x80/+Y\xb0\x02`-,\fd#d\x8b\xb8@\x00b`#!-,KSX\x8a\xb0\x04%Id#Ei\xb0@\x8ba\xb0\x80b\xb0 aj\xb0\x0e#D#\x10\xb0\x0e\xf6\x1b!#\x8a\x12\x11 9/Y-,KSX \xb0\x03%Idi \xb0\x05&\xb0\x06%Id#a\xb0\x80b\xb0 aj\xb0\x0e#D\xb0\x04&\x10\xb0\x0e\xf6\x8a\x10\xb0\x0e#D\xb0\x0e\xf6\xb0\x0e#D\xb0\x0e\xed\x1b\x8a\xb0\x04&\x11\x12 9# 9//Y-,E#E`#E`#E`#vh\x18\xb0\x80b -,\xb0H+-, E\xb0\x00TX\xb0@D E\xb0@aD\x1b!!Y-,E\xb10/E#Ea`\xb0\x01`iD-,KQX\xb0/#p\xb0\x14#B\x1b!!Y-,KQX \xb0\x03%EiSXD\x1b!!Y\x1b!!Y-,E\xb0\x14C\xb0\x00`c\xb0\x01`iD-,\xb0/ED-,E# E\x8a`D-,E#E`D-,K#QX\xb9\x003\xff\xe0\xb14 \x1b\xb33\x004\x00YDD-,\xb0\x16CX\xb0\x03&E\x8aXdf\xb0\x1f`\x1bd\xb0 `f X\x1b!\xb0@Y\xb0\x01aY#XeY\xb0)#D#\x10\xb0)\xe0\x1b!!!!!Y-,\xb0\x02CTXKS#KQZX8\x1b!!Y\x1b!!!!Y-,\xb0\x16CX\xb0\x04%Ed\xb0 `f X\x1b!\xb0@Y\xb0\x01a#X\x1beY\xb0)#D\xb0\x05%\xb0\b%\b X\x02\x1b\x03Y\xb0\x04%\x10\xb0\x05% F\xb0\x04%#B<\xb0\x04%\xb0\a%\b\xb0\a%\x10\xb0\x06% F\xb0\x04%\xb0\x01`#B< X\x01\x1b\x00Y\xb0\x04%\x10\xb0\x05%\xb0)\xe0\xb0) EeD\xb0\a%\x10\xb0\x06%\xb0)\xe0\xb0\x05%\xb0\b%\b X\x02\x1b\x03Y\xb0\x05%\xb0\x03%CH\xb0\x04%\xb0\a%\b\xb0\x06%\xb0\x03%\xb0\x01`CH\x1b!Y!!!!!!!-,\x02\xb0\x04%  F\xb0\x04%#B\xb0\x05%\b\xb0\x03%EH!!!!-,\x02\xb0\x03% \xb0\x04%\b\xb0\x02%CH!!!-,E# E\x18 \xb0\x00P X#e#Y#h \xb0@PX!\xb0@Y#XeY\x8a`D-,KS#KQZX E\x8a`D\x1b!!Y-,KTX E\x8a`D\x1b!!Y-,KS#KQZX8\x1b!!Y-,\xb0\x00!KTX8\x1b!!Y-,\xb0\x02CTX\xb0F+\x1b!!!!Y-,\xb0\x02CTX\xb0G+\x1b!!!Y-,\xb0\x02CTX\xb0H+\x1b!!!!Y-,\xb0\x02CTX\xb0I+\x1b!!!Y-, \x8a\b#KS\x8aKQZX#8\x1b!!Y-,\x00\xb0\x02%I\xb0\x00SX \xb0@8\x11\x1b!Y-,\x01F#F`#Fa# \x10 F\x8aa\xb8\xff\x80b\x8a\xb1@@\x8apE`h:-, \x8a#Id\x8a#SX<\x1b!Y-,KRX}\x1bzY-,\xb0\x12\x00K\x01KTB-,\xb1\x02\x00B\xb1#\x01\x88Q\xb1@\x01\x88SZX\xb9\x10\x00\x00 \x88TX\xb2\x02\x01\x02C`BY\xb1$\x01\x88QX\xb9 \x00\x00@\x88TX\xb2\x02\x02\x02C`B\xb1$\x01\x88TX\xb2\x02 \x02C`B\x00K\x01KRX\xb2\x02\b\x02C`BY\x1b\xb9@\x00\x00\x80\x88TX\xb2\x02\x04\x02C`BY\xb9@\x00\x00\x80c\xb8\x01\x00\x88TX\xb2\x02\b\x02C`BY\xb9@\x00\x01\x00c\xb8\x02\x00\x88TX\xb2\x02\x10\x02C`BY\xb9@\x00\x02\x00c\xb8\x04\x00\x88TX\xb2\x02@\x02C`BYYYYY-,E\x18h#KQX# E d\xb0@PX|Yh\x8a`YD-,\xb0\x00\x16\xb0\x02%\xb0\x02%\x01\xb0\x01#>\x00\xb0\x02#>\xb1\x01\x02\x06\f\xb0\n#eB\xb0\v#B\x01\xb0\x01#?\x00\xb0\x02#?\xb1\x01\x02\x06\f\xb0\x06#eB\xb0\a#B\xb0\x01\x16\x01-,z\x8a\x10E#\xf5\x18-\x00\x00\x00@\x10\t\xf8\x03\xff\x1f\x8f\xf7\x9f\xf7\x02\u007f\xf3\x01`\xf2\x01\xb8\xff\xe8@+\xeb\f\x10F\xdf3\xddU\xde\xff\xdcU0\xdd\x01\xdd\x01\x03U\xdc\x03\xfa\x1f0\xc2\x01o\xc0\xef\xc0\x02\xfc\xb6\x18\x1f0\xb7\x01`\xb7\x80\xb7\x02\xb8\xff\xc0@8\xb7\x0f\x13F\xe7\xb1\x01\x1f\xaf/\xaf?\xaf\x03O\xaf_\xafo\xaf\x03@\xaf\x0f\x13F\xacQ\x18\x1f\x1f\x9c_\x9c\x02\xe0\x9b\x01\x03+\x9a\x01\x1f\x9a\x01\x90\x9a\xa0\x9a\x02s\x9a\x83\x9a\x02\x05\xb8\xff\xea@\x19\x9a\t\vF\xaf\x97\xbf\x97\x02\x03+\x96\x01\x1f\x96\x01\x9f\x96\xaf\x96\x02|\x96\x01\x05\xb8\xff\xea@\x85\x96\t\vF/\x92?\x92O\x92\x03@\x92\f\x0fF/\x91\x01\x9f\x91\x01\x87\x86\x18\x1f@|P|\x02\x03\x10t t0t\x03\x02t\x01\xf2t\x01\no\x01\xffo\x01\xa9o\x01\x97o\x01uo\x85o\x02Ko\x01\nn\x01\xffn\x01\xa9n\x01\x97n\x01Kn\x01\x06\x1a\x01\x18U\x19\x13\xff\x1f\a\x04\xff\x1f\x06\x03\xff\x1f?g\x01\x1fg/g?g\xffg\x04@fPf\xa0f\xb0f\x04?e\x01\x0fe\xafe\x02\x05\xa0d\xe0d\x02\x03\xb8\xff\xc0@Od\x06\nFa_+\x1f`_G\x1f_P\"\x1f\xf7[\x01\xec[\x01T[\x84[\x02I[\x01;[\x01\xf9Z\x01\xefZ\x01kZ\x01KZ\x01;Z\x01\x06\x133\x12U\x05\x01\x03U\x043\x03U\x1f\x03\x01\x0f\x03?\x03\xaf\x03\x03\x0fW\x1fW/W\x03\x03\xb8\xff\xc0\xb3V\x12\x15F\xb8\xff\xe0\xb3V\a\vF\xb8\xff\xc0\xb3T\x12\x15F\xb8\xff\xc0@mT\x06\vFRP+\x1f?POP_P\x03\xfaH\x01\xefH\x01\x87H\x01eH\x01VH\x01:H\x01\xfaG\x01\xefG\x01\x87G\x01;G\x01\x06\x1c\x1b\xff\x1f\x163\x15U\x11\x01\x0fU\x103\x0fU\x02\x01\x00U\x01G\x00U\xfb\xfa+\x1f\xfa\x1b\x12\x1f\x0f\x0f\x01\x1f\x0f\xcf\x0f\x02\x0f\x0f\xff\x0f\x02\x06o\x00\u007f\x00\xaf\x00\xef\x00\x04\x10\x00\x01\x80\x16\x01\x05\x01\xb8\x01\x90\xb1TS++K\xb8\a\xffRK\xb0\x06P[\xb0\x01\x88\xb0%S\xb0\x01\x88\xb0@QZ\xb0\x06\x88\xb0\x00UZ[X\xb1\x01\x01\x8eY\x85\x8d\x8d\x00B\x1dK\xb02SX\xb0`\x1dYK\xb0dSX\xb0@\x1dYK\xb0\x80SX\xb0\x10\x1d\xb1\x16\x00BYss^stu++++++++\x01_ssssssssss\x00s+\x01++++_s\x00st+++\x01_ssssssssss\x00+++\x01+_s^stsst\x00++++\x01_sssstssssst\x00stt\x01_s+\x00st+s\x01+_sstt_s+_sstt\x00_ss\x01+\x00+st\x01s\x00+st+\x01s\x00s++s++\x01+sss\x00+\x18^\x06\x14\x00\v\x00N\x05\xb6\x00\x17\x00u\x05\xb6\x05\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04J\x00\x14\x00\x8f\x00\x00\xff\xec\x00\x00\x00\x00\xff\xec\x00\x00\x00\x00\xff\xec\x00\x00\xfe\x14\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\x00\x00\x00\x00\x00\x00\xac\x00\xb6\x00\xbc\x00\x00\x00\xd5\x00\x00\x00\x00\x00\x00\x00U\x00\x83\x00\x97\x00\x9f\x00}\x00\xe5\x00\xae\x00\xae\x00q\x00q\x00\x00\x00\x00\x00\xba\x00\xc5\x00\xba\x00\x00\x00\x00\x00\xa4\x00\x9f\x00\x8c\x00\x00\x00\x00\x00\xc7\x00\xc7\x00}\x00}\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\xb9\x00\x8a\x00\x00\x00\x00\x00\x9b\x00\xa6\x00\x8f\x00w\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00i\x00n\x00\x90\x00\xb4\x00\xc1\x00\xd5\x00\x00\x00\x00\x00\x00\x00\x00\x00f\x00o\x00x\x00\x96\x00\xc0\x00\xd5\x01G\x00\x00\x00\x00\x00\x00\x00\xfe\x01:\x00\xc5\x00x\x00\xfe\x01\x16\x01\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xee\x00\x00\x00\x96\x00\x88\x00\xae\x00\x96\x00\x89\x01\f\x00\x96\x01\x18\x00\x00\x03\x1d\x00\x94\x02Z\x00\x82\x03\x96\x00\x00\x00\xa8\x00\x8c\x00\x00\x00\x00\x02y\x00\xd9\x00\xb4\x01\n\x00\x00\x01\x83\x00m\x00\u007f\x00\xa0\x00\x00\x00\x00\x00m\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x93\x00\xa0\x00\x00\x00\x82\x00\x89\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\xb6\xfc\x94\x00\x11\xff\xef\x00\x83\x00\x8f\x00\x00\x00\x00\x00m\x00{\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbc\x01\xaa\x03T\x00\x00\x00\x00\x00\xbc\x00\xb6\x01\xd7\x01\x95\x00\x00\x00\x96\x01\x00\x00\xae\x05\xb6\xfe\xbc\xfeo\xfe\x83\x00o\x02\xad\x00\x00\x00\a\x00Z\x00\x03\x00\x01\x04\t\x00\x01\x00\x14\x00\x00\x00\x03\x00\x01\x04\t\x00\x02\x00\x0e\x00\x14\x00\x03\x00\x01\x04\t\x00\x03\x00*\x00\"\x00\x03\x00\x01\x04\t\x00\x04\x00\x14\x00\x00\x00\x03\x00\x01\x04\t\x00\x05\x00,\x00L\x00\x03\x00\x01\x04\t\x00\x06\x00\x12\x00x\x00\x03\x00\x01\x04\t\x00\x0e\x00T\x00\x8a\x00D\x00r\x00o\x00i\x00d\x00 \x00S\x00a\x00n\x00s\x00R\x00e\x00g\x00u\x00l\x00a\x00r\x00A\x00s\x00c\x00e\x00n\x00d\x00e\x00r\x00 \x00-\x00 \x00D\x00r\x00o\x00i\x00d\x00 \x00S\x00a\x00n\x00s\x00V\x00e\x00r\x00s\x00i\x00o\x00n\x00 \x001\x00.\x000\x000\x00 \x00b\x00u\x00i\x00l\x00d\x00 \x001\x001\x003\x00D\x00r\x00o\x00i\x00d\x00S\x00a\x00n\x00s\x00h\x00t\x00t\x00p\x00:\x00/\x00/\x00w\x00w\x00w\x00.\x00a\x00p\x00a\x00c\x00h\x00e\x00.\x00o\x00r\x00g\x00/\x00l\x00i\x00c\x00e\x00n\x00s\x00e\x00s\x00/\x00L\x00I\x00C\x00E\x00N\x00S\x00E\x00-\x002\x00.\x000\x00\x02\x00\x00\x00\x00\x00\x00\xfff\x00f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd3\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\a\x00\b\x00\t\x00\n\x00\v\x00\f\x00\r\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00 \x00!\x00\"\x00#\x00$\x00%\x00&\x00'\x00(\x00)\x00*\x00+\x00,\x00-\x00.\x00/\x000\x001\x002\x003\x004\x005\x006\x007\x008\x009\x00:\x00;\x00<\x00=\x00>\x00?\x00@\x00A\x00B\x00C\x00D\x00E\x00F\x00G\x00H\x00I\x00J\x00K\x00L\x00M\x00N\x00O\x00P\x00Q\x00R\x00S\x00T\x00U\x00V\x00W\x00X\x00Y\x00Z\x00[\x00\\\x00]\x00^\x00_\x00`\x00a\x00\xac\x00\xa3\x00\x84\x00\x85\x00\xbd\x00\x96\x00\xe8\x00\x86\x00\x8e\x00\x8b\x00\x9d\x00\xa9\x00\xa4\x01\x02\x00\x8a\x01\x03\x00\x83\x00\x93\x00\xf2\x00\xf3\x00\x8d\x00\x97\x00\x88\x00\xc3\x00\xde\x00\xf1\x00\x9e\x00\xaa\x00\xf5\x00\xf4\x00\xf6\x00\xa2\x00\xad\x00\xc9\x00\xc7\x00\xae\x00b\x00c\x00\x90\x00d\x00\xcb\x00e\x00\xc8\x00\xca\x00\xcf\x00\xcc\x00\xcd\x00\xce\x00\xe9\x00f\x00\xd3\x00\xd0\x00\xd1\x00\xaf\x00g\x00\xf0\x00\x91\x00\xd6\x00\xd4\x00\xd5\x00h\x00\xeb\x00\xed\x00\x89\x00j\x00i\x00k\x00m\x00l\x00n\x00\xa0\x00o\x00q\x00p\x00r\x00s\x00u\x00t\x00v\x00w\x00\xea\x00x\x00z\x00y\x00{\x00}\x00|\x00\xb8\x00\xa1\x00\u007f\x00~\x00\x80\x00\x81\x00\xec\x00\xee\x00\xba\x00\xd7\x00\xd8\x00\xdd\x00\xd9\x00\xb2\x00\xb3\x00\xb6\x00\xb7\x00\xc4\x00\xb4\x00\xb5\x00\xc5\x00\x87\x00\xbe\x00\xbf\x00\xbc\x01\x04\auni00AD\toverscore\ffoursuperior\x00\x00\x00\x00\x02\x00\x05\x00\x02\xff\xff\x00\x03\x00\x01\x00\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x02\x00\x01\x00\x00\x00\xd1\x00\x01\x00\x00\x00\x01\x00\x00\x00\n\x00\x1e\x00,\x00\x01latn\x00\b\x00\x04\x00\x00\x00\x00\xff\xff\x00\x01\x00\x00\x00\x01kern\x00\b\x00\x00\x00\x01\x00\x00\x00\x01\x00\x04\x00\x02\x00\b\x00\x01\x00\b\x00\x01\x00\xd6\x00\x04\x00\x00\x00f\x01p\x01p\n\xea\x02\"\x11\xdc\x02\"\x02x\x02\xde\rX\x02\xf8\x03R\x0e.\x03\xac\x03\xea\x0e\xf8\x04P\x04\x92\x04\xec\x04\xf2\x06\x1c\x06F\a@\b:\b\xbc\x0e.\n\xea\x10\xea\x10\xea\x10\xf0\x10\xea\t\xce\t\xf4\n\n\n\x10\x10\xea\x10\xea\x110\n\"\x10\xf0\nT\nj\nj\n\x80\n\xb2\n\xc8\n\xea\v\x86\n\xf0\n\xf0\v\x86\f$\f\xba\rX\r\xe4\r\xa2\r\xe4\r\xe4\x0e.\x0e.\x0e.\x0e.\x0el\x0e\x8a\x0e\x8a\x0e\x8a\x0e\x8a\x0e\x8a\x0e\xf8\x0fR\x0fR\x0fR\x0fR\x0f\xa0\x10\xea\x10\xea\x10\xea\x10\xea\x10\xea\x10\xea\x110\x10\xf0\x11\x02\x11\x02\x11\x02\x11\x02\x11\f\x11\x1a\x11\x1a\x11\x1a\x11\x1a\x11\x1a\x110\x11:\x11:\x11:\x11:\x11D\x11\xbe\x11\xdc\x11\xdc\x11\xe2\x11\xe2\x00\x02\x00\x19\x00\x05\x00\x05\x00\x00\x00\n\x00\v\x00\x01\x00\x0f\x00\x11\x00\x03\x00$\x00'\x00\x06\x00)\x00)\x00\n\x00,\x00,\x00\v\x00.\x00/\x00\f\x002\x005\x00\x0e\x007\x00>\x00\x12\x00D\x00F\x00\x1a\x00H\x00K\x00\x1d\x00N\x00N\x00!\x00P\x00R\x00\"\x00U\x00W\x00%\x00Y\x00^\x00(\x00\x82\x00\x87\x00.\x00\x89\x00\x92\x004\x00\x94\x00\x98\x00>\x00\x9a\x00\x9f\x00C\x00\xa2\x00\xad\x00I\x00\xb3\x00\xb8\x00U\x00\xba\x00\xbf\x00[\x00\xc1\x00\xc1\x00a\x00\xc6\x00\xc8\x00b\x00\xcb\x00\xcb\x00e\x00,\x00$\xff\xae\x00,\x00)\x007\x00R\x009\x00R\x00:\x00f\x00;\x00)\x00<\x00R\x00=\x00)\x00F\xff\xc3\x00G\xff\xc3\x00H\xff\xc3\x00J\xff\xd7\x00R\xff\xc3\x00T\xff\xc3\x00W\x00)\x00Y\x00)\x00Z\x00\x14\x00\\\x00)\x00\x82\xff\xae\x00\x83\xff\xae\x00\x84\xff\xae\x00\x85\xff\xae\x00\x86\xff\xae\x00\x87\xff\xae\x00\x88\xff\\\x00\x8e\x00)\x00\x8f\x00)\x00\x90\x00)\x00\x91\x00)\x00\x9f\x00R\x00\xa8\xff\xc3\x00\xa9\xff\xc3\x00\xaa\xff\xc3\x00\xab\xff\xc3\x00\xac\xff\xc3\x00\xad\xff\xc3\x00\xb4\xff\xc3\x00\xb5\xff\xc3\x00\xb6\xff\xc3\x00\xb7\xff\xc3\x00\xb8\xff\xc3\x00\xba\xff\xc3\x00\xbf\x00)\x00\xc1\x00)\x00\x15\x00&\xff\xc3\x00*\xff\xc3\x002\xff\xc3\x004\xff\xc3\x007\xff\x9a\x008\xff\xd7\x009\xff\x9a\x00:\xff\xae\x00<\xff\x9a\x00\x89\xff\xc3\x00\x94\xff\xc3\x00\x95\xff\xc3\x00\x96\xff\xc3\x00\x97\xff\xc3\x00\x98\xff\xc3\x00\x9a\xff\xc3\x00\x9b\xff\xd7\x00\x9c\xff\xd7\x00\x9d\xff\xd7\x00\x9e\xff\xd7\x00\x9f\xff\x9a\x00\x19\x00\x05\xff\xae\x00\n\xff\xae\x00&\xff\xec\x00*\xff\xec\x002\xff\xec\x004\xff\xec\x007\xff\x85\x008\xff\xec\x009\xff\xc3\x00:\xff\xd7\x00<\xff\x9a\x00\x89\xff\xec\x00\x94\xff\xec\x00\x95\xff\xec\x00\x96\xff\xec\x00\x97\xff\xec\x00\x98\xff\xec\x00\x9a\xff\xec\x00\x9b\xff\xec\x00\x9c\xff\xec\x00\x9d\xff\xec\x00\x9e\xff\xec\x00\x9f\xff\x9a\x00\xc9\xff\xae\x00\xcc\xff\xae\x00\x06\x00,\xff\xec\x007\xff\xec\x009\xff\xec\x00;\xff\xec\x00<\xff\xec\x00\x9f\xff\xec\x00\x16\x00\x0f\xff\xc3\x00\x11\xff\xc3\x00$\xff\xec\x00,\xff\xec\x007\xff\xc3\x009\xff\xec\x00:\xff\xec\x00;\xff\xec\x00<\xff\xd7\x00=\xff\xec\x00\x82\xff\xec\x00\x83\xff\xec\x00\x84\xff\xec\x00\x85\xff\xec\x00\x86\xff\xec\x00\x87\xff\xec\x00\x88\xff\xc3\x00\x8e\xff\xec\x00\x8f\xff\xec\x00\x90\xff\xec\x00\x91\xff\xec\x00\x9f\xff\xd7\x00\x16\x00\x05\x00=\x00\n\x00=\x00\f\x00)\x00\x0f\xff\x9a\x00\x11\xff\x9a\x00\"\x00)\x00$\xff\xd7\x009\x00\x14\x00:\x00\x14\x00<\x00\x14\x00@\x00)\x00`\x00)\x00\x82\xff\xd7\x00\x83\xff\xd7\x00\x84\xff\xd7\x00\x85\xff\xd7\x00\x86\xff\xd7\x00\x87\xff\xd7\x00\x88\xff\xc3\x00\x9f\x00\x14\x00\xc9\x00=\x00\xcc\x00=\x00\x0f\x00\x05\x00)\x00\n\x00)\x00&\xff\xd7\x00*\xff\xd7\x002\xff\xd7\x004\xff\xd7\x00\x89\xff\xd7\x00\x94\xff\xd7\x00\x95\xff\xd7\x00\x96\xff\xd7\x00\x97\xff\xd7\x00\x98\xff\xd7\x00\x9a\xff\xd7\x00\xc9\x00)\x00\xcc\x00)\x00\x19\x00\x05\xff\x9a\x00\n\xff\x9a\x00&\xff\xec\x00*\xff\xec\x002\xff\xec\x004\xff\xec\x007\xff\x85\x008\xff\xec\x009\xff\xae\x00:\xff\xc3\x00<\xff\x9a\x00\x89\xff\xec\x00\x94\xff\xec\x00\x95\xff\xec\x00\x96\xff\xec\x00\x97\xff\xec\x00\x98\xff\xec\x00\x9a\xff\xec\x00\x9b\xff\xec\x00\x9c\xff\xec\x00\x9d\xff\xec\x00\x9e\xff\xec\x00\x9f\xff\x9a\x00\xc9\xff\x9a\x00\xcc\xff\x9a\x00\x10\x00\x0f\xff3\x00\x11\xff3\x00$\xff\xae\x00&\xff\xec\x00;\xff\xec\x00<\xff\xec\x00=\xff\xd7\x00\x82\xff\xae\x00\x83\xff\xae\x00\x84\xff\xae\x00\x85\xff\xae\x00\x86\xff\xae\x00\x87\xff\xae\x00\x88\xffq\x00\x89\xff\xec\x00\x9f\xff\xec\x00\x16\x00\x0f\xff\xc3\x00\x11\xff\xc3\x00$\xff\xec\x00,\xff\xec\x007\xff\xc3\x009\xff\xd7\x00:\xff\xec\x00;\xff\xd7\x00<\xff\xd7\x00=\xff\xec\x00\x82\xff\xec\x00\x83\xff\xec\x00\x84\xff\xec\x00\x85\xff\xec\x00\x86\xff\xec\x00\x87\xff\xec\x00\x88\xff\xc3\x00\x8e\xff\xec\x00\x8f\xff\xec\x00\x90\xff\xec\x00\x91\xff\xec\x00\x9f\xff\xd7\x00\x01\x007\xff\xec\x00J\x00\x05\x00R\x00\n\x00R\x00\x0f\xff\x9a\x00\x10\xff\x9a\x00\x11\xff\x9a\x00\"\x00)\x00$\xff\x85\x00&\xff\xc3\x00*\xff\xc3\x002\xff\xc3\x004\xff\xc3\x006\xff\xec\x007\x00\x14\x00D\xff\x85\x00F\xff\x85\x00G\xff\x85\x00H\xff\x85\x00J\xff\x9a\x00P\xff\xae\x00Q\xff\xae\x00R\xff\x85\x00S\xff\xae\x00T\xff\x85\x00U\xff\xae\x00V\xff\x85\x00X\xff\xae\x00Y\xff\xc3\x00Z\xff\xc3\x00[\xff\xc3\x00\\\xff\xc3\x00]\xff\xc3\x00\x82\xff\x85\x00\x83\xff\x85\x00\x84\xff\x85\x00\x85\xff\x85\x00\x86\xff\x85\x00\x87\xff\x85\x00\x88\xffq\x00\x89\xff\xc3\x00\x94\xff\xc3\x00\x95\xff\xc3\x00\x96\xff\xc3\x00\x97\xff\xc3\x00\x98\xff\xc3\x00\x9a\xff\xc3\x00\xa2\xff\x85\x00\xa3\xff\x85\x00\xa4\xff\x85\x00\xa5\xff\x85\x00\xa6\xff\x85\x00\xa7\xff\x85\x00\xa8\xff\x85\x00\xa9\xff\x85\x00\xaa\xff\x85\x00\xab\xff\x85\x00\xac\xff\x85\x00\xad\xff\x85\x00\xb3\xff\xae\x00\xb4\xff\x85\x00\xb5\xff\x85\x00\xb6\xff\x85\x00\xb7\xff\x85\x00\xb8\xff\x85\x00\xba\xff\x85\x00\xbb\xff\xae\x00\xbc\xff\xae\x00\xbd\xff\xae\x00\xbe\xff\xae\x00\xbf\xff\xc3\x00\xc1\xff\xc3\x00\xc6\xff\xae\x00\xc7\xff\x9a\x00\xc9\x00R\x00\xcc\x00R\x00\n\x00\x0f\xff\xd7\x00\x11\xff\xd7\x00$\xff\xec\x00\x82\xff\xec\x00\x83\xff\xec\x00\x84\xff\xec\x00\x85\xff\xec\x00\x86\xff\xec\x00\x87\xff\xec\x00\x88\xff\xd7\x00>\x00\x05\x00R\x00\n\x00R\x00\x0f\xff\x9a\x00\x11\xff\x9a\x00\"\x00)\x00$\xff\xc3\x00&\xff\xd7\x00*\xff\xd7\x002\xff\xd7\x004\xff\xd7\x00D\xff\xc3\x00F\xff\xc3\x00G\xff\xc3\x00H\xff\xc3\x00J\xff\xc3\x00P\xff\xd7\x00Q\xff\xd7\x00R\xff\xc3\x00S\xff\xd7\x00T\xff\xc3\x00U\xff\xd7\x00V\xff\xd7\x00X\xff\xd7\x00\x82\xff\xc3\x00\x83\xff\xc3\x00\x84\xff\xc3\x00\x85\xff\xc3\x00\x86\xff\xc3\x00\x87\xff\xc3\x00\x88\xff\x85\x00\x89\xff\xd7\x00\x94\xff\xd7\x00\x95\xff\xd7\x00\x96\xff\xd7\x00\x97\xff\xd7\x00\x98\xff\xd7\x00\x9a\xff\xd7\x00\xa2\xff\xc3\x00\xa3\xff\xc3\x00\xa4\xff\xc3\x00\xa5\xff\xc3\x00\xa6\xff\xc3\x00\xa7\xff\xc3\x00\xa8\xff\xc3\x00\xa9\xff\xc3\x00\xaa\xff\xc3\x00\xab\xff\xc3\x00\xac\xff\xc3\x00\xad\xff\xc3\x00\xb3\xff\xd7\x00\xb4\xff\xc3\x00\xb5\xff\xc3\x00\xb6\xff\xc3\x00\xb7\xff\xc3\x00\xb8\xff\xc3\x00\xba\xff\xc3\x00\xbb\xff\xd7\x00\xbc\xff\xd7\x00\xbd\xff\xd7\x00\xbe\xff\xd7\x00\xc9\x00R\x00\xcc\x00R\x00>\x00\x05\x00f\x00\n\x00f\x00\x0f\xff\xae\x00\x11\xff\xae\x00$\xff\xd7\x00&\xff\xec\x00*\xff\xec\x002\xff\xec\x004\xff\xec\x00D\xff\xd7\x00F\xff\xd7\x00G\xff\xd7\x00H\xff\xd7\x00J\xff\xec\x00P\xff\xec\x00Q\xff\xec\x00R\xff\xd7\x00S\xff\xec\x00T\xff\xd7\x00U\xff\xec\x00V\xff\xd7\x00X\xff\xec\x00]\xff\xec\x00\x82\xff\xd7\x00\x83\xff\xd7\x00\x84\xff\xd7\x00\x85\xff\xd7\x00\x86\xff\xd7\x00\x87\xff\xd7\x00\x88\xff\xae\x00\x89\xff\xec\x00\x94\xff\xec\x00\x95\xff\xec\x00\x96\xff\xec\x00\x97\xff\xec\x00\x98\xff\xec\x00\x9a\xff\xec\x00\xa2\xff\xd7\x00\xa3\xff\xd7\x00\xa4\xff\xd7\x00\xa5\xff\xd7\x00\xa6\xff\xd7\x00\xa7\xff\xd7\x00\xa8\xff\xd7\x00\xa9\xff\xd7\x00\xaa\xff\xd7\x00\xab\xff\xd7\x00\xac\xff\xd7\x00\xad\xff\xd7\x00\xb3\xff\xec\x00\xb4\xff\xd7\x00\xb5\xff\xd7\x00\xb6\xff\xd7\x00\xb7\xff\xd7\x00\xb8\xff\xd7\x00\xba\xff\xd7\x00\xbb\xff\xec\x00\xbc\xff\xec\x00\xbd\xff\xec\x00\xbe\xff\xec\x00\xc9\x00f\x00\xcc\x00f\x00 \x00\x05\x00)\x00\n\x00)\x00&\xff\xd7\x00*\xff\xd7\x002\xff\xd7\x004\xff\xd7\x00F\xff\xec\x00G\xff\xec\x00H\xff\xec\x00R\xff\xec\x00T\xff\xec\x00\x89\xff\xd7\x00\x94\xff\xd7\x00\x95\xff\xd7\x00\x96\xff\xd7\x00\x97\xff\xd7\x00\x98\xff\xd7\x00\x9a\xff\xd7\x00\xa8\xff\xec\x00\xa9\xff\xec\x00\xaa\xff\xec\x00\xab\xff\xec\x00\xac\xff\xec\x00\xad\xff\xec\x00\xb4\xff\xec\x00\xb5\xff\xec\x00\xb6\xff\xec\x00\xb7\xff\xec\x00\xb8\xff\xec\x00\xba\xff\xec\x00\xc9\x00)\x00\xcc\x00)\x00D\x00\x05\x00R\x00\n\x00R\x00\x0f\xff\x9a\x00\x11\xff\x9a\x00\"\x00)\x00$\xff\x9a\x00&\xff\xd7\x00*\xff\xd7\x002\xff\xd7\x004\xff\xd7\x006\xff\xec\x00D\xff\x9a\x00F\xff\x9a\x00G\xff\x9a\x00H\xff\x9a\x00J\xff\x9a\x00P\xff\xc3\x00Q\xff\xc3\x00R\xff\x9a\x00S\xff\xc3\x00T\xff\x9a\x00U\xff\xc3\x00V\xff\xae\x00X\xff\xc3\x00[\xff\xd7\x00\\\xff\xec\x00]\xff\xc3\x00\x82\xff\x9a\x00\x83\xff\x9a\x00\x84\xff\x9a\x00\x85\xff\x9a\x00\x86\xff\x9a\x00\x87\xff\x9a\x00\x88\xffq\x00\x89\xff\xd7\x00\x94\xff\xd7\x00\x95\xff\xd7\x00\x96\xff\xd7\x00\x97\xff\xd7\x00\x98\xff\xd7\x00\x9a\xff\xd7\x00\xa2\xff\x9a\x00\xa3\xff\x9a\x00\xa4\xff\x9a\x00\xa5\xff\x9a\x00\xa6\xff\x9a\x00\xa7\xff\x9a\x00\xa8\xff\x9a\x00\xa9\xff\x9a\x00\xaa\xff\x9a\x00\xab\xff\x9a\x00\xac\xff\x9a\x00\xad\xff\x9a\x00\xb3\xff\xc3\x00\xb4\xff\x9a\x00\xb5\xff\x9a\x00\xb6\xff\x9a\x00\xb7\xff\x9a\x00\xb8\xff\x9a\x00\xba\xff\x9a\x00\xbb\xff\xc3\x00\xbc\xff\xc3\x00\xbd\xff\xc3\x00\xbe\xff\xc3\x00\xbf\xff\xec\x00\xc1\xff\xec\x00\xc9\x00R\x00\xcc\x00R\x00\t\x00\x05\x00f\x00\n\x00f\x00Y\x00\x14\x00Z\x00\x14\x00\\\x00\x14\x00\xbf\x00\x14\x00\xc1\x00\x14\x00\xc9\x00f\x00\xcc\x00f\x00\x05\x00\x05\x00)\x00\n\x00)\x00J\x00\x14\x00\xc9\x00)\x00\xcc\x00)\x00\x01\x00\n\xff\xc3\x00\x04\x00\x05\x00)\x00\n\x00)\x00\xc9\x00)\x00\xcc\x00)\x00\f\x00\x05\x00f\x00\n\x00f\x00D\xff\xec\x00J\xff\xec\x00\xa2\xff\xec\x00\xa3\xff\xec\x00\xa4\xff\xec\x00\xa5\xff\xec\x00\xa6\xff\xec\x00\xa7\xff\xec\x00\xc9\x00f\x00\xcc\x00f\x00\x05\x00\x05\x00R\x00\n\x00R\x00W\x00\x14\x00\xc9\x00R\x00\xcc\x00R\x00\x05\x00\x05\x00R\x00\n\x00R\x00I\x00\x14\x00\xc9\x00R\x00\xcc\x00R\x00\f\x00\x05\x00)\x00\n\x00)\x00R\xff\xd7\x00\xa8\xff\xd7\x00\xb4\xff\xd7\x00\xb5\xff\xd7\x00\xb6\xff\xd7\x00\xb7\xff\xd7\x00\xb8\xff\xd7\x00\xba\xff\xd7\x00\xc9\x00)\x00\xcc\x00)\x00\x05\x00\x05\x00=\x00\n\x00=\x00I\x00\x14\x00\xc9\x00=\x00\xcc\x00=\x00\b\x00R\xff\xec\x00\xa8\xff\xec\x00\xb4\xff\xec\x00\xb5\xff\xec\x00\xb6\xff\xec\x00\xb7\xff\xec\x00\xb8\xff\xec\x00\xba\xff\xec\x00\x01\x00-\x00{\x00%\x00\x05\xff\xae\x00\n\xff\xae\x00\r\xff\x85\x00\x0f\x00D\x00\x1e\x00D\x00\"\xff\xc3\x00&\xff\xec\x00*\xff\xec\x002\xff\xec\x004\xff\xec\x007\xff\x85\x008\xff\xec\x009\xff\xc3\x00:\xff\xd7\x00<\xff\x9a\x00=\x00;\x00I\xff\xec\x00W\xff\xec\x00Y\xff\xd7\x00Z\xff\xec\x00\\\xff\xd7\x00\x89\xff\xec\x00\x94\xff\xec\x00\x95\xff\xec\x00\x96\xff\xec\x00\x97\xff\xec\x00\x98\xff\xec\x00\x9a\xff\xec\x00\x9b\xff\xec\x00\x9c\xff\xec\x00\x9d\xff\xec\x00\x9e\xff\xec\x00\x9f\xff\x9a\x00\xbf\xff\xd7\x00\xc1\xff\xd7\x00\xc9\xff\xae\x00\xcc\xff\xae\x00'\x00\x05\xff\xae\x00\n\xff\xae\x00\r\xff\x85\x00\x0f\x00D\x00\x1e\x00D\x00\"\xff\xc3\x00&\xff\xec\x00*\xff\xec\x00-\x00^\x002\xff\xec\x004\xff\xec\x007\xff\x85\x008\xff\xec\x009\xff\xc3\x00:\xff\xd7\x00<\xff\x9a\x00=\x00;\x00I\xff\xec\x00W\xff\xec\x00Y\xff\xd7\x00Z\xff\xec\x00\\\xff\xd7\x00\x82\xff\xd7\x00\x89\xff\xec\x00\x94\xff\xec\x00\x95\xff\xec\x00\x96\xff\xec\x00\x97\xff\xec\x00\x98\xff\xec\x00\x9a\xff\xec\x00\x9b\xff\xec\x00\x9c\xff\xec\x00\x9d\xff\xec\x00\x9e\xff\xec\x00\x9f\xff\x9a\x00\xbf\xff\xd7\x00\xc1\xff\xd7\x00\xc9\xff\xae\x00\xcc\xff\xae\x00%\x00\x05\xff\xae\x00\n\xff\xae\x00\r\xff\u007f\x00\x0f\x00D\x00\x1e\x00D\x00\"\xff\xd7\x00&\xff\xec\x00*\xff\xec\x00-\x00^\x002\xff\xec\x004\xff\xec\x007\xff\x85\x008\xff\xec\x009\xff\xc3\x00:\xff\xd7\x00<\xff\x9a\x00=\x00;\x00W\xff\xe5\x00Y\xff\xd5\x00Z\xff\xe5\x00\\\xff\xdb\x00\x89\xff\xec\x00\x94\xff\xec\x00\x95\xff\xec\x00\x96\xff\xec\x00\x97\xff\xec\x00\x98\xff\xec\x00\x9a\xff\xec\x00\x9b\xff\xec\x00\x9c\xff\xec\x00\x9d\xff\xec\x00\x9e\xff\xec\x00\x9f\xff\x9a\x00\xbf\xff\xdb\x00\xc1\xff\xdb\x00\xc9\xff\xae\x00\xcc\xff\xae\x00'\x00\x05\xfff\x00\n\xfff\x00\r\xff\u007f\x00\x0f\x00D\x00\x1e\x00D\x00\"\xff\xd7\x00&\xff\xec\x00*\xff\xec\x00-\x00^\x002\xff\xec\x004\xff\xec\x007\xff\x85\x008\xff\xec\x009\xff\xc3\x00:\xff\xd7\x00<\xff\x9a\x00=\x00;\x00W\xff\xe5\x00Y\xff\xd5\x00Z\xff\xe5\x00\\\xff\xdb\x00\x89\xff\xec\x00\x94\xff\xec\x00\x95\xff\xec\x00\x96\xff\xec\x00\x97\xff\xec\x00\x98\xff\xec\x00\x9a\xff\xec\x00\x9b\xff\xec\x00\x9c\xff\xec\x00\x9d\xff\xec\x00\x9e\xff\xec\x00\x9f\xff\x9a\x00\xbf\xff\xdb\x00\xc1\xff\xdb\x00\xc8\xfff\x00\xc9\xff\xae\x00\xcb\xfff\x00\xcc\xff\xae\x00\x12\x00\x05\x00)\x00\n\x00)\x00\f\x00)\x00&\xff\xd7\x00*\xff\xd7\x002\xff\xd7\x004\xff\xd7\x00@\x00)\x00`\x00)\x00\x89\xff\xd7\x00\x94\xff\xd7\x00\x95\xff\xd7\x00\x96\xff\xd7\x00\x97\xff\xd7\x00\x98\xff\xd7\x00\x9a\xff\xd7\x00\xc9\x00)\x00\xcc\x00)\x00\x10\x00\x05\x00)\x00\n\x00)\x00\x10\xff\xd7\x00&\xff\xec\x002\xff\xec\x004\xff\xec\x00\x89\xff\xec\x00\x8b\xff\xec\x00\x94\xff\xec\x00\x95\xff\xec\x00\x96\xff\xec\x00\x97\xff\xec\x00\x98\xff\xec\x00\x9a\xff\xec\x00\xc9\x00)\x00\xcc\x00)\x00\x12\x00\x05\x00)\x00\n\x00)\x00\x10\xff\xd7\x00&\xff\xec\x002\xff\xec\x004\xff\xec\x00\x84\xff\xec\x00\x89\xff\xec\x00\x8a\xff\xec\x00\x8f\xff\xec\x00\x94\xff\xec\x00\x95\xff\xec\x00\x96\xff\xec\x00\x97\xff\xec\x00\x98\xff\xec\x00\x9a\xff\xec\x00\xc9\x00)\x00\xcc\x00)\x00\x0f\x00\x05\x00)\x00\n\x00)\x00&\xff\xec\x00*\xff\xec\x002\xff\xec\x004\xff\xec\x00\x89\xff\xec\x00\x94\xff\xec\x00\x95\xff\xec\x00\x96\xff\xec\x00\x97\xff\xec\x00\x98\xff\xec\x00\x9a\xff\xec\x00\xc9\x00)\x00\xcc\x00)\x00\a\x00$\xff\xec\x00\x82\xff\xec\x00\x83\xff\xec\x00\x84\xff\xec\x00\x85\xff\xec\x00\x86\xff\xec\x00\x87\xff\xec\x00\x1b\x00\f\xff\xd7\x00\x0f\xff\xc3\x00\x11\xff\xc3\x00$\xff\xec\x00,\xff\xec\x00-\xff\xf6\x006\xff\xec\x007\xff\xc3\x009\xff\xd7\x00:\xff\xec\x00;\xff\xd7\x00<\xff\xd7\x00=\xff\xec\x00@\xff\xd7\x00`\xff\xd7\x00\x82\xff\xec\x00\x83\xff\xec\x00\x84\xff\xec\x00\x85\xff\xec\x00\x86\xff\xec\x00\x87\xff\xec\x00\x88\xff\xd7\x00\x8e\xff\xec\x00\x8f\xff\xec\x00\x90\xff\xec\x00\x91\xff\xec\x00\x9f\xff\xd7\x00\x16\x00\x0f\xff\xc3\x00\x11\xff\xc3\x00$\xff\xec\x00,\xff\xec\x007\xff\xc3\x009\xff\xd7\x00:\xff\xec\x00;\xff\xd7\x00<\xff\xd7\x00=\xff\xec\x00\x82\xff\xec\x00\x83\xff\xec\x00\x84\xff\xec\x00\x85\xff\xec\x00\x86\xff\xec\x00\x87\xff\xec\x00\x88\xff\xd7\x00\x8e\xff\xec\x00\x8f\xff\xec\x00\x90\xff\xec\x00\x91\xff\xec\x00\x9f\xff\xd7\x00\x13\x00\x0f\xff\xd7\x00\x11\xff\xd7\x00$\xff\xec\x000\xff\xec\x00=\xff\xec\x00D\xff\xec\x00\x82\xff\xec\x00\x83\xff\xec\x00\x84\xff\xec\x00\x85\xff\xec\x00\x86\xff\xec\x00\x87\xff\xec\x00\x88\xff\xd7\x00\xa2\xff\xec\x00\xa3\xff\xec\x00\xa4\xff\xec\x00\xa5\xff\xec\x00\xa6\xff\xec\x00\xa7\xff\xec\x00R\x00\x05\x00R\x00\t\xff\xc3\x00\n\x00R\x00\f\x00=\x00\r\x00)\x00\x0f\xff\x9a\x00\x10\xff\x9a\x00\x11\xff\x9a\x00\"\x00)\x00$\xff\x9a\x00&\xff\xd7\x00*\xff\xd7\x00-\xff\xbe\x000\xff\xc3\x002\xff\xd7\x004\xff\xd7\x006\xff\xec\x007\x00'\x009\x00)\x00:\x00\x14\x00@\x00=\x00D\xff\x9a\x00F\xff\x9a\x00G\xff\x9a\x00H\xff\x9a\x00I\xff\xe5\x00J\xff\x9a\x00P\xff\xc3\x00Q\xff\xc3\x00R\xff\x9a\x00S\xff\xc3\x00T\xff\x9a\x00U\xff\xc3\x00V\xff\xae\x00X\xff\xc3\x00Y\xff\xd7\x00Z\xff\xec\x00[\xff\xd7\x00\\\xff\xec\x00]\xff\xc3\x00`\x00=\x00\x82\xff\x9a\x00\x83\xff\x9a\x00\x84\xff\x9a\x00\x85\xff\x9a\x00\x86\xff\x9a\x00\x87\xff\x9a\x00\x88\xffq\x00\x89\xff\xd7\x00\x94\xff\xd7\x00\x95\xff\xd7\x00\x96\xff\xd7\x00\x97\xff\xd7\x00\x98\xff\xd7\x00\x9a\xff\xd7\x00\xa2\xff\x9a\x00\xa3\xff\x9a\x00\xa4\xff\x9a\x00\xa5\xff\x9a\x00\xa6\xff\x9a\x00\xa7\xff\x9a\x00\xa8\xff\x9a\x00\xa9\xff\x9a\x00\xaa\xff\x9a\x00\xab\xff\x9a\x00\xac\xff\x9a\x00\xad\xff\x9a\x00\xb3\xff\xc3\x00\xb4\xff\x9a\x00\xb5\xff\x9a\x00\xb6\xff\x9a\x00\xb7\xff\x9a\x00\xb8\xff\x9a\x00\xba\xff\x9a\x00\xbb\xff\xc3\x00\xbc\xff\xc3\x00\xbd\xff\xc3\x00\xbe\xff\xc3\x00\xbf\xff\xec\x00\xc1\xff\xec\x00\xc9\x00R\x00\xcc\x00R\x00\x01\x00\n\xff\xd7\x00\x04\x00\x05\x00=\x00\n\x00=\x00\xc9\x00=\x00\xcc\x00=\x00\x02\x00\x05\xff\x98\x00\n\xff\xd7\x00\x03\x00\x05\xff\x98\x00\n\xff\xd7\x00\xcc\xff\xd7\x00\x05\x00\x05\xffo\x00\n\xffo\x00I\xff\xdb\x00[\xff\xd7\x00]\xff\xec\x00\x02\x00[\xff\xd7\x00]\xff\xec\x00\x02\x00\x05\xff\xbe\x00\n\xff\xbe\x00\x1e\x00\x05\x00=\x00\n\x00=\x00\x0f\xff\xbe\x00\x11\xff\xbe\x00\"\xff\xb4\x00F\xff\xf6\x00G\xff\xf6\x00H\xff\xf6\x00I\x00\x14\x00J\xff\xf6\x00R\xff\xf6\x00T\xff\xf6\x00W\x00\x06\x00\xa8\xff\xf6\x00\xa9\xff\xf6\x00\xaa\xff\xf6\x00\xab\xff\xf6\x00\xac\xff\xf6\x00\xad\xff\xf6\x00\xb4\xff\xf6\x00\xb5\xff\xf6\x00\xb6\xff\xf6\x00\xb7\xff\xf6\x00\xb8\xff\xf6\x00\xba\xff\xf6\x00\xc9\x00=\x00\xca\xff\x8d\x00\xcc\x00=\x00\xcd\xff\x8d\x00\xd0\x00\f\x00\a\x00\x05\x00=\x00\n\x00=\x00\x0f\xff\xbe\x00\x11\xff\xbe\x00I\x00\x14\x00\xc9\x00=\x00\xcc\x00=\x00\x01\x007\xff\x9a\x00)\x00$\xff\xae\x00,\x00)\x007\x00R\x009\x00R\x00:\x00f\x00;\x00)\x00<\x00R\x00=\x00)\x00F\xff\xc3\x00G\xff\xc3\x00H\xff\xc3\x00J\xff\xd7\x00R\xff\xc3\x00T\xff\xc3\x00W\x00)\x00Y\x00)\x00Z\x00\x14\x00\x82\xff\xae\x00\x83\xff\xae\x00\x84\xff\xae\x00\x85\xff\xae\x00\x86\xff\xae\x00\x87\xff\xae\x00\x88\xff\\\x00\x8e\x00)\x00\x8f\x00)\x00\x90\x00)\x00\x91\x00)\x00\x9f\x00R\x00\xa8\xff\xc3\x00\xa9\xff\xc3\x00\xaa\xff\xc3\x00\xab\xff\xc3\x00\xac\xff\xc3\x00\xad\xff\xc3\x00\xb4\xff\xc3\x00\xb5\xff\xc3\x00\xb6\xff\xc3\x00\xb7\xff\xc3\x00\xb8\xff\xc3\x00\xba\xff\xc3\x00\x01\x00\x00\x00\n\x00\n\x00\n\x00\x00")
+
+func third_partySwaggerUiFontsDroidSansV6LatinRegularTtfBytes() ([]byte, error) {
+	return _third_partySwaggerUiFontsDroidSansV6LatinRegularTtf, nil
+}
+
+func third_partySwaggerUiFontsDroidSansV6LatinRegularTtf() (*asset, error) {
+	bytes, err := third_partySwaggerUiFontsDroidSansV6LatinRegularTtfBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/fonts/droid-sans-v6-latin-regular.ttf", size: 39072, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiFontsDroidSansV6LatinRegularWoff = []byte("wOFF\x00\x01\x00\x00\x00\x00a$\x00\x11\x00\x00\x00\x00\x98\xa0\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00GDEF\x00\x00\x01\x80\x00\x00\x00\x16\x00\x00\x00\x16\x00\x10\x00\xd2GPOS\x00\x00\x01\x98\x00\x00\x06$\x00\x00\x12\xc0\xf2ZM^GSUB\x00\x00\a\xbc\x00\x00\x00\f\x00\x00\x00\f\x00\x15\x00\nOS/2\x00\x00\a\xc8\x00\x00\x00^\x00\x00\x00`\xa0\u04f5ecmap\x00\x00\b(\x00\x00\x00j\x00\x00\x00\x8cmag\xdacvt \x00\x00\b\x94\x00\x00\x00\xf3\x00\x00\x01\xfc9~>Lfpgm\x00\x00\t\x88\x00\x00\x04'\x00\x00\a\x05s\xd3#\xb0gasp\x00\x00\r\xb0\x00\x00\x00\f\x00\x00\x00\f\x00\x04\x00\aglyf\x00\x00\r\xbc\x00\x00J\xeb\x00\x00o(I;\f|head\x00\x00X\xa8\x00\x00\x003\x00\x00\x006\xf5\xf5 \xd3hhea\x00\x00X\xdc\x00\x00\x00\x1f\x00\x00\x00$\r\xc4\x05\x8ahmtx\x00\x00X\xfc\x00\x00\x01\xe6\x00\x00\x03LmsT\xd3loca\x00\x00Z\xe4\x00\x00\x01\xa8\x00\x00\x01\xa8\xbe\x8a\u06c8maxp\x00\x00\\\x8c\x00\x00\x00 \x00\x00\x00 \x03i\x01\xd3name\x00\x00\\\xac\x00\x00\x00\xb0\x00\x00\x018\x14\x910\xdepost\x00\x00]\\\x00\x00\x01Y\x00\x00\x01\xe7\xa2\xc2\x0f;prep\x00\x00^\xb8\x00\x00\x02k\x00\x00\x02\xec\x82\xdc!\x13\x00\x01\x00\x00\x00\f\x00\x00\x00\x00\x00\x00\x00\x02\x00\x01\x00\x00\x00\xd1\x00\x01\x00\x00x\x01<\xcc\x03\xac\x1cQ\x14\x80\xe1\u007f\xb0\x1a\xed\xdcF\xb5m\u06f6m\xdb\x0ek\x86\xb5\x19\xa7\xb6m\xc6\rj\x04\u0573\xc2}g\x99\xef\xf2\b\r\xb0\xa8LC\xb4\x85\xd3V.&\x8c\t\x10\x8b\xa1\x01\u0682Y\xcb%\x06\xc9\x1f&\xba\xfc\xb4\xc4\xfe ?\x98\xad-\u0556Z\u007f\xf4\xea\xea\x93^]_\xab\u007fq\xc7\xea%\xc6p\xaf\xb1q\xd6\xf8\u3558C\xcd\xdd\xe6?3/X1\xd8;\xd45\xdc>|\xd7kl\xfd\xf1\xe3r\xfc?\x91\xf7\x91\x02\u02f2\xfc\xf8_5\xb5\xaa\xfb9\xd6Hk\xbeXo]\xb6^Z\u007f\xec\xadV\x8e\x95couj:\xb7\u0771\xee/\xf7\xb4\xec_^\u3505\xde\u038c\x92\xe8\xf0\x94\x932-C5\xf5s\x94\x9e\xe2\xa8\xf2\x19MU\xfb\x94\x9e\xea\xbe\xfa$~\xa8\x1f\xe8\x94# \xc0\xc2F#\x8a\u00a0&u\bROX4\x146\x8di\x82CsZ\xe1\u0446\u0394\xa1'\xbd)O_\x06P\x89\xc1\xa2\x1aC\x19NuF1\x86Z\x8cc2u\xd9\xc86\x1a\xb3\x83\u0774d/\a\xe9\xccaN\u0403\u04dc\xa3\x1fW\xb8)\u0577y\xc0\x04\x1e\x89i<\xe7%\xd3y#f\u0450\x9a\xb1\xf3r\u05a3\r\xc3i'\xbb=\xb3\xe9 \xff\x8e\f\xa7\xb4\x1a\xbb\x86\x8e\xe3Z\x03\x00<f{\x8f|\x04\x8f\x99\x99_\xd0\x18\x12Wb2\xf6E\xa0\rGhff\xb60(F3\x86\xc9T\xbbK\x9dv\xf3e}v\f{v\xcdT|\xe7\u07f94\xff\u07393s\xa5\x19bn\xf4p\x90G>\x85\xd13A\x89XF\xa5\xbajj\x82\x1f\x06\xb3\xc5Z\xe3\xd4QO\x03\x8d4\xb1 :;X\xa6~9+X\xc9vc7\x1b\xa3\x85V\xdah\xa7\x83N\xba\u8987^\xfa\x19\xd1\xef ?\n\xfe\xec\xe8\xef\xfc\x9fGy\"\xba)xRfS\u0129\xce8]\\\xa8|\rkY\xc7z6\xb0\x89\xcd\xdana+\xdb\u062e\xbd\xfb\xa3g\x84?G\xbf\t\xfe\xce\xffy\x94'\xa2\r\xc1\x93\xe2\x14=\xa7j\x1d\x1b\xdd\xf1\x1a\u05b2\x8e\xf5l`\x13\x9b\xd9\xc2V\xb6a\xf4\xe0\xa4q?d|\xf0\xcf\u0608Fc\x1a\xd3\xd9\u038f\x83t\xe3g\xf2GG\xb1V~O\x11\xa7\x86-\xcf\x043\xc4Z\uaa27\x81F\x9aX\xa0\xfd2q9+X\x19\x1b\xf9\x8c\x91\u01f9\x8f\x11\xd2\xcc^\xbal2\xf9\xbd\xdf\u007fT;\xc5\u075b\xcat\x9eV6\x9fZ\xe5u\xd4\xd3@#M8C\xb0]\xbb\x93\xc6\xfa\x90t#[\xbb\xfcY\xed\xdf\xf9?\x8f\xb2\x905\xace\x1d\xeb\xd9\xc0&Nj\xff!f\\\x1e\x11\x92\xcf\xf8\u06ee\xfe\xf0\xad\xcd8\x1f\x92\xe1\x8a\x1f\t2\xb1\u039d)\x9cusy&\u015a}\xc9\x19S\u07d93\x97\xee\x8cx\xabwfTl%\x14\x9a\u0152 B\xfa\xf7\xf9^u\u007f\x1a\x12\xd6\xfa\xe3z<\xe1\x1ed\xab\xcb%\x8f|\n\xf5)\x92y1%\x8eK\xc52\xb1\\\xac\x10\xab\xc4j\xfdk\x98\xc5l\xe6P\xab\xae\x8ez\x1ah\xa4\t3\x90\xf2\x19\u06a5\xcdn\xf6\xb0\x97}\uc9d9\x16Zi\xa3\x9d\x0e>p\xfeN\xb1\x8bnz\u895f\x01u\x83\f1\u0308\xf1\x0fr\xcc\xef\xe3\xae\ub939\xf9\x90H\x90n\xd62\xf9c\xaa\xd9V?3\x9c\u04eb\xd7\xfb\u1115\x9a\xad\xec\xaa7\x1cE\u028b)\xf1\xbbT,\x13\xcb\xc5\n\xaa\xa8u\\G=\r4\xd2\xc4\x02\u05d2j\xe5\xef\xd2f7{\xd8\xcb>\xf6\x93\xecM\xf8\x81>\xc9\u0786\x03\xea\x06\x19b\x98\xf8\x1c\xb9r\xef\xef\b\xe9f/\x13Oy\xc2\x13\x96\xad,\x97<\xf2)TVD1%\x8eK\xc52\xb1\\\x8c]\xb58\x87\xe4o\x86\xb7S>\xa1\xbb\xb4\xd9\xcd\x1e\xf6\xb2\x8f\xfd4\xd3B+m\xb4\xd3\xc1\a\xfat\x8a]t\xd3C/\xfd\f\xa8\x1bd\x88aN\xba\xd6\x0f\xf9m\u04b7Q\xaeVy\xe4SB\x19\xa9\xeeS\xb3\xfa\x16Zi\xa3\x9d\x0e:\u989b\x1ez\xe9'\xfeF\xcbN\xb2\xea6%d\xf4\xb8^\xd9\xcas\xc9#\x9fB\x8a\xdc\xd9bJ\xfc.\x15\xcb\xc4r\xb1\xc2\xfcV\x89\xb3\xf4\x9d\xado\xec\xc9UWG=\r4\u0484'7\xf5*\xd4f7{\xd8\xcb>\xf6\xd3L\v\xad\xb4\xd1N\a\x1f8W\xa7\xd8E7=\xf4\xd2\u03c0\xbaA\x86\x18fDn\a\x89\xaf\xc6I\xe1j\xac\xf6\u03aaa6#\x1c$~\xe7\u0185w\xaePi|6G\x05\x11#\x8e\x8d\u05c5\xe5i\xe1\x98\xd9\xceT\xc8.v\xb3\x87\xbd\xecc?\xe1\xf8\xe1}\xa94~<\xb7\u02e5\x05W\x94\xa6\x85\xe7+\xb9\xb4>\x93\xad\xc30\x9fq\xe1\xf7\xb5\xe0\x8ao\xe3\xc4\xd8JkN\xbej\\\u07ff\x82W\x82?\x85\xfb\x8e\xc9\xde\x1e\xe9\xd6\u042f\xf9\xbd+\xbf\x91}\xc8\f;\xb5\x02e\x95T+\xab\x11g\x8b7\xfb\xb5\x1c\xd1\xe7 \xf1}\xca_\xae\x97\x95\xdc\xe7\xdeRf\xb5w \xbb+\xe7\xec\x8d+\xb2;s3\xd9\xc9\xec\xa2\u033e\x92\xd9E\x99]\xb8\xf9\xac\xf49\u0215sf]\xf2 duB\x1e2\vN\x8b\x1f\x8aY\xe1\xbaNK|C\x86;\xbf\x1b\u0677e\x84#e\\\xba\xb6\xf0\x9a\x16\xb28y\xbe\xe1\bYIG\xa8g!\x8bX~\x03#\x85;\u0404\xa7e\xe1\r\xf4\x9e\x90r\x1f\xf1\x8b -z&a\xef\xf7\xaf\xe8\xb7\xc1\xe3)\xf6\x80O\x8b\xf3I\xb1;I\xb2K\xbf\xf5]f\xea\x91\u007fp\u056e\xe9\xbf\xcc ;\xf5HI\u07e9\u079bL\x92[DL\xb3f'\x9b\xc9p\xe7\x9a\xf8\xcd3c\xc3\xcez\xf8\xaao\xdf\x13\x9e\x96)\xdaM\x8d\xfd\xd51#\xe1[X`\xf5\xdf\xc0\xf70|\xb3\\\xf9]\x9co\xbc\x87\xe1\xdb\xe8\xfb\xe6\x8cc\xe3_\x8f\xf0\xcb1\xda{dC\xacnL\xf8\xebC\xc69z!\x88P\xe0\xf9v\u0141\x1d\x99\xd6\xe1/\xf5\xc3A\x84_\x87c\xa6;\xca\xe4\xf7\xd1\xce \xd7\xca\xcd#\x1f_\xaa\xa0P,\xa1\x8cJ\u007f\x996\x8b-\xb4\xd2F;\x1dt\xd2E7=\xf4\u048f|\x83S\u0465\xb1\x9c?\x12?\xb5\x1a&$\x9c9\xfc&\xe2\xef\x1d\xf3\xf2\xb7;\xf1\x1f\x87\xbb\xfd\u07c6\xef\x00\xe8\x11\x93\xb0\x00\x01\x00\x00\x00\n\x00\n\x00\n\x00\x00x\x01c`fQc\x9c\xc0\xc0\xca\xc0\xc1:\x8b\u0558\x81\x81Q\x0eB3_`Hc\xfc\xc4\xc0\xc0\xc4\xcd\xc6\xc6\xcc\xc1\xc2\xc4\xc4\xf2\x80\x81\xe9\xbd\x03\x83B4\x03\x03\x83\x06\x03\x10\x18:\x06;3\x00\x05\x14\\\xd8\xe4\xff\x890\xb4\xb0\x173\xbeQ``\x9c\x0f\x92c\xf1b\xdd\x06\xa4\x14\x18\x98\x00\x9b\xf6\x0e\x82\x00\x00x\x01c```\x02bf \x16\x01\x92\x8c`\x9a\x85\xa1\x02HK1\b\x00E\xb8\x18\xea\x18\xfe3\x1a2\x1dc\xba\xc5tGADAJANAI\xc1J\xc1\xe5\xff\u007f\xa0\x1a\x05\x86\x05p9a\x05\t\x05\x19\xa0\x9c%H\xee\xff\xe3\xff\x87\xfeO\xfc\xfb\xf7\ufaff/\x1fl~\xb0\xe1\xc1\xfa\ak\x1eL{\xd0\v\xb4\x01'\x00\x00;\x03#\xf4\x00\x00x\x01\xad\xc6\x03l\x9dq\x1c\x05\xd0\xf3\u007fo\xb6\xbd\xd86\x16k\u0782y1f\u06f6m\u06f6\xbdF\r\xcbX\x8d\xaa\xb0Q\xf3\xa1f\xdc\xf3\u00fd]\x06\xe9ij\xe7\xf7\x86Z\xd7\xf9}\xe7\\\xcd\xe94\xd1 '\x88\xcbh\xfe\xa3A\x91\x8e\xd4\rx\uaf6f\xc8\a\u0330\xc7\x057lS\xe2y:\xab\u0481\xcf\xfe\xa5\aw\xddp\x14\u4933-\x9d\xe6^\xfa\xe40\xb8\xe2\xbe\x136hr^\x93E\x96;\xe9\xad_\xf2\x01\u0337\xc2F\xe7\xfd\x94\x1f\xc6\x01\xa20\xc6?\x1b\xd3\x1c\x12\xaa\xb4\xaf\x02\xe7\x1d\xf4\xdcy\x87B/\xe7\xc30\xb2\xa3\x9d\xcd\u0335;{\x1e\x0f\x1d\x85\xcc&\xc5\u0786\x1e\x84=\x96\xd9\xe1&\xa4\xed\xa0\xd6\u03b8\x89\xdd\x0e\x01\xd0\xf9}\xf5Y\xfd\xe3J{\x9c\x00\xcbl\xd1\xe4kx\x9c\x9d^\u05fc\x0f\x85\xe1\x1c\xce\a\x9ew~\x1f}\x8dVD{\xac\xc8<K\x00\xa7,M\xf8\x00x\x01uSG\x93\xdbF\x13\x1d\x80Q\x19Td\x15\xbe\xcf\x1e\xb8\xc5U\"\x95s\x84I\fDZ\x91AU\x039\x01\x9b\x8a\xeb\xd3^\x9c\u04de\x1cf\xe5\xff\u0490/\\\x9f\xf4\a\xfc\x1b\x1c\x8f\xde\xe3\xfa*\xf7\f\x01e1\xf6{\xdd\xfdf\xe6\xf5\xc0\x17\x91\xbc7\x1a\x0e\xfaw\xef\u073eu\xf3\xc6;\xbd\xee\xf5P\x04\x9d\xf6\xdb\xfe\xb5\xabW._\xbax\xe1\xfc\xb9\xb3gN\x1c?v\xb4\xd5<x`\xa6\xb1\x1f\xde\xf2\u07ac\xef\xae9;\xb6o\u06f2yS\xb5R.\x15\v\xb6\u015a\x02\u0098\xe3L\x8c\xc5\x19\xe8v[\x1aCBD\xf2\f\x11#'*|\xbe\x06yl\xca\xf8\xf3\x95>U.\xbeP\xe9\x9bJJ\xe5\xb4\xe5\xf0\xcb\xecr\xab\xc9\x05p\xfc5\x00>\xb1\xee\xf7%\xc5?\x05\x10q\\7\xf1-\x1dS\x87\x01\xdb\bx\x1eupQ\x1f\a\x1c\xad\x98\v\f?\x19+\x11\a\xa4\x97n\xd9\u0701\xce\xc2\xe6V\x93\xa5\x9b\xb7P\xb8\x85\"<\b\u02e9u\xf0\xaae\x02\xfb\xa0\xb8\x98\u06ac\xbaM/\x8b\x85\x86H\xe6\xf1n_\x8a\xc0\xf5\xbc\xa8\xd5\xec\xe1v\bL\x8au\x8c$\x96;X1\x92|Io\x9d\xad\xf2\xb4\xf9H=\x988l6>\xb2u\x1e\xe6\x93\xf7$\x16\x12\xeaU\x05\xa1\xd4\xf7X;\x82\x87 \xc0C_\xfc]\xa7\x93/`\x13\x02\x81G\xb4\xea\x8d\xc1\x93un<]\xd2\xc2R\xc3\x01\xae6\x18\x1d\a\xd6\xffy\x9eI2\xa6\xdcp6\x98\x0eC\xb2W\xa9\x10x\xa8b\x95L\x1e\xaf\xcc\x02w@\xa5[\xb7\xaaeA\x0e\xb3\xbb\x12-\xe2\u007fYu1|\x10\xa1\x13\x8f\xad\x8b\xd9a\xc3\xc1\r\xdc\xd5\u007fW\xa2\xdd\b\xf98!\x86>\xd7\xc0;\xefz\xb5(\xaf\xb9\xfb\xba4##\xb0\xac=\xf5<}\xf0\u0549\xcff\t\xe0J_N1g\xb3\xeeC\xe6\x1f;\x12\xa1\x1d\xeb\u0323<\xb3\xe7\x9e\u03ac\xe4\x99'\xed1xd\xc6P*,6z\xf3 \xc8\xe3\xd5\x04Wf\x91'\x1f\xe9Q\x80\x83\xdb\xffu=P;k\xfc\u00b1\xc8\xd4r,P\xed\x12\xc7\xd2\f\x96u\u05f3\rtSt\x8br4\xa0`\xfa\xb7\xee*J\xd4v\xf2\v@2ZG\x80\x88\xb3\xcf'\xe3:\t\xf0V\x13\xbbG\xa6\xa3\x1fI\xf4\x03\n\xfc$\x9b\x91H\x8f\x1f\xa3\x8e$\xa6\x11-\x05f|x\f\x96q7\xb4\xf3y\x9am\x89\xa5\xa14-Y\x1b\xee\xee \x8b\xe7\xb2.<&\x02\"\x81\v\x15\x9b@\xc4Z\v\xfar\x8d\x9dz\xfc{z\x9a\xbb?\x9fb\xa7Y\x14\xe8\xe2\xbd\x1d\x89\x85\x19\xa1\xe4\xfc\"\xbe\x19\xbb\xf3\xc8\xe3E.]\x0f\xfd\x88\x06\x1c\x81\\\x88\xf0\x90q\xe8\xd0\ufd1cgVD\xbb3\x927\x86p\xa3\u007f_\x9e7\x1b\xc9\x13$G\x1e\x8b\x17d@\xbaS\x19\xbarXmT\xb9\xb4\xddBD\x85\x0e\x11<\xa4\x00\u0697\xe9\x17+\x8d*}\x1d,OY:\x11%\xb8\xb4\\\x96W\xd36\xf0\x10\x17\vAVG\xf8yQ\x02\x85F\xa7\x9b\xab\x955$\x9dN\xd7\xf5\"o\xfaj5mJ\xf3la\xea\xa8jS\xbbY\x8ab\x8eE\xe2l\x92\u0454\xf1\xb2\xae\xef<\x97\xb0\x00\x11\x8c9\xfaw%\x9d\xcd\xd8c\\\xce\xcc0\x9eg\xb3\x1a=\x87r\xb3\fB\xe6QZ\x83\xdcL\f\x8f\x10z\x06_'\xfc\f\ucf90\xee\xe5i\xae\xaapc\xa8\xb48d\x82\x8cv\xdeC\xa6\xaf\xb0\u007f\xbe\xe6j\xca\xd2\xcf3\x84\tp\x87\x87\xd3\xe7Y\xa5\xbe\xaf\x9f\xe5\xf1E-\x02\xbdy\x05Cy\xd9T\xdf\x18\u022f\xdd/(\xc0\x9d\xec\x86uc\xd4n5S\x9b\xb5S\xb0~\u89fe\xf5\xc3\xf0\xbe\\s\x18\xe3?\x8c\xe4C\u06f2;q;J\xf7SN\xaeq\xc6|\xc3\u069a%\xd2\x00\xae\x81V\x1a\x10\xa8\x9azw\xcdgl\xc5d\x8b\x860xnb1\xc3Us\xcebs\x13{\xca99g\x13W\x9cr\xbe\xe1\xf4\x8b\xa6T\x1f\x93\xc7\x12\xb8\xe0\xf3z>_Ec\x15G\x81v{/9B\x1f\v-\xb8J\xee\xc0\xd5\u0532\xcb[q3,\xb4q\v\xb45\u007fM\xf3\u05e6|Y\xf3\x15h\xa3\xb5\xd7j5\xbfP\x8e\x80\x8dz\xeb?v\xf0\xf3\xb7\x00\x00\x00\x00\x02\x00\x05\x00\x02\xff\xff\x00\x03x\x01\x8c|\t\\SW\xbe\xff\xf9\x9ds\x97\xec\xb9\xd9\x13B6B\b\x18 \x90\xcb*K\x02\xa8DD\x04ET\x14\x88\x16q\x17\xadmm\xebX\xb1\x8em\xe9\xaaS\xb5\xd6.\xe3t{]\x1c\xb5\x1bc\x1d\xffUg\xb1\xb3\xb7}\x1dg\xeb\xa7\xcf\xfa\xe6u\xfa\xfa^\x17;\xd3\xcet\x91\xf8?\xe7&(u\xfe\u02cb\xdc\u071b{!\xf7\xb7\xff\xbe\xe7{\xce\x15at\xff\xa5?\xc3n~\f\x11\xe4@S_Ap\xe9B\u00a2\xb1&%\u05c8k\x97\ub80b#\x86\x03\x1c\xc6\u0731K\xa7\x12\x1aQ\x93\xe4@\xfd\x90\x05\x13\x14\x8f~\xfe\x1b\x88F\xe4\xa8t>\xd6W^\x16\x81 \x91IE#\x96c^l\xb3\x1ap0\xaf\x14C\xe7M\xf2\xb9\v\u05bcRwN4\xcfj\u034b\xe6\xb8K\xf3\xac\xf0(\xe7\xfc\ua542\u0280\xd1\x18\xa8,\bU\xe6IR^%\xa2/\x8cv\x92\xa7\xf0\v\x8a,\"\xaaN\x04\xb9\xfd\xa2\xa8~C\xfd\xae\x1aG\xd5\xc3\xeamj\x82\xf6#\"\x91w\xc9\x05\xc2\x11\x01c\x91P9d9*C\xb4\xef|_\x9f\xb96z\xbe\xbc\fH\x90\x04\xe8\x06mE\x9b\x8apI\u0475E\xfc\xd8\xf8\x05,\xb1\x8d\xddCF\x88\xfb\x82\xde\u00cd|\xe8\xc1\xc4BBrr\x9cv\xafG\xe4\x04\x87Cp!\xe08\xfey\xa73`\xf3\xe5\xaa8\xb5\xd5j6\x1a\xb4\x9c\xe5yM\xa7\x04\x92\xa4\u04e9;5\xa0\u0245\xa4\x1e\xf4\x87u*N\xe7C\xd2a\x93\xcbf\x8a\x9b\xe6\x98\u0399\x88\u03a43\xf1\x0e\x8b\xa0\xe1QT\x8e\xcb\xe6\xda\xdah\xb4\xcf$\xcb\xd4H1e\xd7\x17\x8bQa\x99\xcc\xd1>\xe9?\x1c\xb51\x93\xd9Qk\x92\xa3\xecPV\x8e\xd9%\xa6E\xc0F\xb5\xb0([e@\xd9d\xa2l6\xa0\x1f\xc9\xef\xe3\xe0L\xffz\xee\xfd\xdd\xe9w\xe6\xee\xeaH\xa7\xc1\u04d4\xfe\x18\"s\xef\x9f\v\xa1\xee]\xdd \\\xfco\b&\xd2\uf42d\xe9c\xa3\xe9n8\u0136QH\x8e\xc2\xd1t'\xdbF\xd3\xc7 \x89\b\xdari\x94\xfcQ0\xa3\x12T\x85\xe2\u8944\\\x11-\x82\xa2h\x00\x02\u0086h=\xd4G\xbd\xe0\xb5\xf8E\x10E}\xe9\xfa|#\xb5\x1a\xbe\x84\x00!\x10Q\x93^_\xbd\xfe]\x17\xb8Xp\x94\xa9\xb4I\x97l\xb5\x16\xd5\xd7[J\xabU\r\x85\x9b\x02\xa1\x80/a0%}>og\x00\x8c\x01_\x00\xab\x02\x15\x96M*\x83J\x10x\x15\xfd\xa3\x175\xfa\xa4\n\xd1(\x92\xa3&f\xa3h\u007f\x1f\xb3MD\xf9@\x8dg\xa6\xe6\x90M2\x8d\xb3\xbe\xf34\xd2~G/o\x8c\x9d7\xd52\v\xf6\xc9}4\xf2\xe8?j,\x1ao\xa2-XIC.\\\xe9%\xb2\xa9\x94T\xd2P\xac\xae\x94m^p\x88\xa5\x106y\x89XA\xaf\x9a\x1a\x01\xac^\xec0\x19\x80\xfc1\u05b7\xb3\xfb\xce\xd8P\xaa\xdb\x1fX\x90Z\x1e]\xb4\xa3gJ\xf9\xe2\xeds\xee\x1c|\xa6\xa5\xb9\xe6\ued85\xb7/.=j\x8d\u0310\xfb\x16\xa7\u0366\xc2\xe6\xf2E\xf3\xe0\xd5\x19\xd7vW\xeb\xfe\xf2\x8e\u069cc:$\x05rL\xf0\x82\xb7y\xfe\xfa\xb6\x96\xe1y\x95\ua5ce\xf2S|\xbb]EB\xba\xd7\xd7<oM2P]R`N\xdfeX\x86\x1f\u03ef\x8d\x16\x98`\xa3\xb4\x88\xc59\x8f\x86.}(\xc8\xfc/\x91\x1ayP\x18\xd5Q\xbb\xf7\xbdP/5\x1e\xa3\xb9'\xd77\xd67\x16Z\xbd/\xc5^\x0e\xbeT\xd8dl\x02\xfe%\xcd\xcb\xe8%\xc9\uadd6Y\x895.4:Cc\xd5?\b\x8c\x95\xb8\u0218\xf1\a\xe2\x98KD\xf1\xf3\x9f\x9dW\xb68\r.\xba\xef\x93\xfe\x8d\xbe\x9b\x94\xf0\xab\xa9)/\xb3X\xedr\xcc$\x05\xf3\x04>\x9b\x9a\x95\xd9T\x85\xff\xeb\x155\x04\xe1\xab\xd6\u0387\x1f\xeel\x85\xd7\xf2\xdb6\u0359\xb9\xa1\xbd 8sc\u01ec\x8d\xb3\xc3p({\xe5L\x90^i\xdb0+{\xa5=|\t]<\xfb()\xe6\xf0\x93OB\x1b$\x1f\u007fr\xed\xa1\x1b\xe2\xf1\x1b\x0e\xad]\xfb\xec\xf5\x8d\x8d\xd7?;\xde\xf6\xe4\x130S\xb9\xf0\x1c\xbb\xf0\xdc\xc4\x05\xf2\x9d\xaf\xdahZ\xd2\x17A\xeb.}\xc8o\xe5\u007f\x8dL(\x80\u6851\xc4\xec\xb0\xd3\xd1\xc6\xcd,\x9e\x99\u0534V5\xb56\xfb\x9b\xa1\xaa\xb9\xaa\xd9\xc3\xd7\u0577rI\u050a\x8a\xa5b\xac*.\xce\xf3'!9\u07d3\x94\xf2\xfcy8\xaf\xa9\xa9\xdc\xdc5\u01ee\xfc\xad\xb1\xb5\xbe\x8e\xe7\xcag\u068c\x9d\xe5(z>N3\x8d\xfe\xc4Y,1\x93Ig\xfa\xe8Q\u007f\xdfy\x13=\xaf$\xadt^:oR2\x92\xc6\x17\v\x99FRI#\x88\x1a\xca\x12\xa3\xa1\x05\x06b\xa3gC,\xccX\xb4])|\"4\x92j\xd9@D\b\x86\rD)\x83OI\x81\x8a\xfc\xba\x9e\x9a\\W\xb4yJ\xcf\xe0\xedS\x97u'\xfd\xe9\xad\x15\x9d\u0579\xc1\xe6Tzk\xe1\xec\xe1V_}In\xac\xff\u0385\xf3v,.\x8bu\xaf\xab\x87\x94;\x92\xe7\xd6\x1c3\x16U6\x85\xc1v\xfe\xe9\xf2\xd4\xdaou\xac\xfa\x97M\r\xdc=T\xb3\x96P\xb011\xa3(\xbf\xa1\u0635\xe8\xeb#\x8e\xc2*\x1f<\x10\x88'\xe7\xd7T-n\u02bf\xd0q\xf3`\u03d4\xfc\xd9\v\xae\xa9\x9d\xb5y^$2o\xf3\xac\u013a\xbe9\xf9\xe9\xbb=\xf5\xd3:\xa2\xcd\xc3\xcb\xe6\x17\xa5\xdf>T\xd2Z\xee\xae\\\xb1\x17\x01\xab\xbb\xc0\x8cO\u0414D\xee)\xfe\r\xfe]\x9eD\xf9a\x1eO.\xb8\x18+\xe56\x9a)\xb6\xd4*\xd9\"\x9b\xad\xaf\b\x01\x9a\x9b>\x81#\xf4{,('\xa1\x17\f\u007fU_\x88\u04f3\x86/\xf9/P&4\xff#F\x83\x91\xd9L\x160\xb3\x9f#XJ\xe6\xe6\xb7m\xec8t\xf7\xeeP\xeb\xea\xe9\xcfvll\xcb\xc7\xe5[\xff\xf6\xde[}\xa7\u04f1\xcf6\u007f\xf8\xef\xbf\xed\xef\xfd\xcd\xf9\v,.\x005\xd0\xefw(\u07df\x9b0\xd0\xef\xd7^8J\xcf\xda\f_\xf0_\xb2\x1bH\xff\xc6\ue42d\aA\xe60\x1c\x96\xbd\x04;\xf2gm\xecxv\xfa\xead\xfe\xae{\x0eul\x9cE\xef\xf0\xad\v\xe7\u007f\xd3\xdb\xff\xdb\u007f\xffp\xf3g\xf0\x9b\xd3}o\xbd\xf77E~\xbc\x99\xb3\nVd@\xf9\t\x9bO\x02\xaa\xbea\u0130\xcb@T\x06\x9f\x00\x82@\x85\x88\u01e2}@#\xe5=\xc5\x02!\ao\x11\xb5\x10\xb6\x84\xaay\x82\xf7G\xe0\x9e\x9c\xf4m\x9f\xbfp\xf4\xd1c\u007fM\x8fz\xe0\xf6\x88`Mo\x1e>\x9d\x9b>\x9e\x82\xa1\xf4\x81\x14\xcc\xc8==\f\xa3\xec^C p\x98{\fiQQ\xc2)\xe9AP?K>A\xe0G)t\x10\x11\xa4F\xdf\x17\u020b\xd4\xde\xe7Y\xc3\xe8\x8b)]\x16h\x1b\xa0AI[\x83)\b\x1f\xa4\xb7\u008e}\xb0#\xbdu\x1f\xbe}\x1f\xecLo\u0657\u0796\xb1S<\xfd\x05\u0704>F:T\x93\xb0\xben\x00\x89\xeap\xd0@\u073a\x88\x0e\xeb\xe0\x01Ad\x05[/Y\x93\x03\"H\"\x88\xc2\xc3:\x14\xfd\x88\xdd'\"\u007f\x14\xebc\xde\r9\f\x84\u0670\x1aV\x1b\r\xe1\xa8\xec\xba\xd3\xe8q\xdbU\x1f;\xaan\xfe\u0596\x9a\x86o\xef\xd8\xcaz6\xb3\x19\xbc\x89\x9b\xf1MTd[B\x8d\xf9\x04\xeb\r\xaf\x00\xcd1\xa0I\xf4\x1b\xea\xee\u0280m.\\\x807\x9f~\x9a\xfd~\x06o\xa0\xaf\xa8\x0f+\x13\xee\x11\xdb.\xdbA\x1b1\xd9@\xb3\xef\x14z\x03\xe1\n4\r\r\xa2\xeb\x10\x87\xa8\x88c\x14o \xfe!\xa3\"[\xa4\xaf\xef#&X\xf5U \xe3\xfe\xab\xf1\xc5\xf0\xd5\xd0\x02\x90\x15!\xfc\xbe\x12\xdf\xde\xe7\x01\xb32\xab\xc6\x04I\x88\a\u0110\x8c\t\xe4\x9aX\xb4F./cE\x0f\xbf?\xfe\xee\x8b8\xc0\x8fM\xd4#\x8c\x96]\xfa\x90S\xd1zdAaT\x90\xb0y\x87Q\x91T\x04\xd6a?\x05\x03\xc1MF\u0475\x89w\xd1\"\x1cg:+\u0157\xc5 6\x00\x95\x0fhA57\x02\x95\x18\xcc<\x8dx\x99V\x8fL!1`N%o|a\xdb\rG6\xd5\xca\xc3\xcf\u07f2\xf9\xe8uS\xc7-\xde\xe65\xb3g\xaf\x9d\xee\xf3M_;{\xf6\x9af/~\xe7\xf9\xf4\u007f\xfehh\xe8G\xe0|\xfeyp\x9e\x1eZ~:\xfd\x9f/\xec{w\ufb36=\xe7\x1f\xd8\xf7\ue7b6\xb6=\xef2\xbb\xbe@\x05}\x8d\n,Q\xbb\x06\x12f0\x82\xc1\x80\u059f\x84K\x80o\x01@ \x81\x1f\x12\xc0\t\xa07\n\xc8I\xd3\xe5\xd7\xc0\xda-k\xac&\x99\xda5\x104\xb1\xc44\x10#\x84A\u01af\x1d\x05B\xc0\x94\xe3\xf6\xda\xf6\xa4`\xdb>\xb2;\xb2l\xe9\xa2<s\x8e\xd3m\xbei\vD\x14_\xa6\x10\"\x17h\x1f\v\xa2\xfa\x84?\xa8\x1av\xbbCR\b\xf2\x86!\x00&\x93\x1f\x00Ty\x92~\x93]\xc4y\u05c1\x93\x1a(\x16?O1\x115\x92\xd2\xef?\xa2\xc8(z\x9eZ\xbd\b*\xe1ry\x15\u00cd\xe4J-\xa5 \xe8\xc2\xc5\r\xd0?\xeb\x86y\xc5y\xf1\x9e\u0281\a\xa7\x0f\x15.Y}CS\ua875u\x95}\xdbg\xa5\xdf\xc7\xcf?\f[\xbbn\x1b\xd9\xde^\xd7\x1b\xf7\u03ee\u07dc\x1f/uW-\u07fdx\xfe\x81\xbd\xfb\xba\xd2gU\xd98\xbd\xf4!\xf9\x98\xcaZ\x8b\xfa\x12\xda@Y\xa0\u031c3\xac\x0e\x0f#\x96\n\x85VG\x12!u\x9d\xbf\x0e\xe6\x98\xc1,\xf87=\x17\x80\x9b\x02\xa0\r\x80*\x10\xb0E\x8b7U\x8a\xb6Mf\x83\x8b\u58e2C\xc6tL\x15\x1a\xe4\xb1h\x84u\v\xd67&\xc0\x88\x172\xf1Y@\x01\tL\xf8<\x02\x95\xec\xf0*E\xc9\xe9\xd2y\u05f5>\u007f\xac\xe9\u06ff\xb8s\xdd\xe9\xf9\v~\u0677\xe4\xb6\x05E\x95\xcb\xeeY\xb4sg\xd7-\xf3\x8b\xf3\x9b\x97\u052cy\xbcmIA\xdf\xfa\xad3\xd6>\xbe\xbe\x86K\u037cqa\xadN\xb0\xbf\xbc;u\xf0\xbaD^\u0273\xa5\xb1\u00b6\xb5-\u04d6\u01bd\x0f\x14\xb6\r5T\u032d\xf5\xb6Tm\xf5U\x159\xab\x96\xeeD\x189\x10\xe2\xe2\xfc\xabHC\x1d\u07d1(V\xf7\xb0$\xc5\xebM:\xad\xe8'@!\xb0\x94\x03\x9b\x9d\xb7;\xb1s\x80\a^-8\xaf\x03\x9e\xc7&Q\xc0,P\x98\xba\xf2\xf9\fpe(\x9b\xee\u82e25\x05{\x05MAS\xa0\x12(L\v(\x01\x14d\xad\x8f\x8b\x9f=:\u0787\x1f8q6\xbd\x85p<\xa8E\x9b+G\x9b^\x0eI\x86:\xbfK~\u007f\xb1\f\x06k\xb6\\?\x94g-//\x95\xc6\x0ff|\xb4\x83\xfa\xe8\xef4\x86\xa7P)\x9d\x059\xc3<\xed\xeb\x10\xce\xcf/\\\x19\x84EA\b\x06/\x18\xc1\xc8\x1cf\xa6`\xd3\xe8\u0644\x90-|]\xbe`\xdb$i\xb2\xaeac\x00V+d\xea\x18\x06\x1dY2\xd2\b\x83I\x05\x83A\u010c\x1b\nX\x12\x8aa\v\x83\u068d\x80\x03\xd7<\xb7-9\xed\xb6\x9f\x8e\xc8\xd7,\x9e\x1b\b,Zv\u03549\xdf\xea)=\xfa\xb4;\x1e\xaf\xb5\xf5V\xe3\x17\xc6?\f\xfbW\x91\xed\xd5k\x0f\xae\xbav\xec\x96\x16\x8d\xc5k=\xe4\xc8w\xeaC\x1d7t\xdd\xf7\x00\xafRs\xb5\xf8\xe8S\xe9>\xc1\x90\xa9\x1b\x1bi\xdd\xd0\u0418\x8b\xa08\xaaN\xf8\xcb\xd7\xeb\xf2\x9a\xa4&p\xd4\r#$!?\"\xa8\xeaz\x8fG,\xde\x14vI\x9bD\x86\xe3\x14D\xa2\x94\x91\x18\x15=v^i\x97\x1c\v\x13\x87\xad\x14\xa8\xbc\x9c(7\x92o\f\xb2&\x15\x14\xd6R7\xda*\x97\xdc{f\xa7\xa5\x94\xc2\xe8\xe0\xc2H\xef\xe8`\xcb\x14+\xd1Yk\xdb\a\xea\x06\x0e\xac\xadk\xbc\ue261\xc1##m\xf0v\xfd5\xc9p\xa0\xf9\x9a\xe6\x96\xe1\x8eHh\xe6z\xbcq\xd5\x1b'\x9f\xb8i:\xe6E\xfe!\x9d.\u04b1v\u01de\xce\xfcxIN\u0775O\xae\xbevl\u06f4\x8e\x83\u007fM\xbfR4o\u06c2\x19\xc3\x1dS\xa2\xb3Re-;W\xb7(~\xebE\x88\x13\xa8\xdf\x04\x14y^@\xac\xbe\x9a\xa8\xfa\xc0\xab$\x15`\x1e_G2\x15\x87\xb52\x96.TEVl\x03\xac\x9d\xd9\x00\\X\x1e7\x90C\xe3gy\xe9\xa9\xdd_\xbd\x8d\bZM\xed\x86h\xbd\r\xa3\xa9\xa8\x8d\xe2\xbfy\xde`l\xbdQS\x98\\\xffc\xfe-\x1e\xbf\xcc\x03\xcf\x1b\u06e5v(\\\xefj\\\u007f6\b\xbf\n\xc2q\x16\x1f\x92\xcb\xef\xc2.\x8dwe\xcd\xfe\x1a\xbc\xa8\x06\nkjj\x925\xa4\xe6\xfe\x16(h\xe9i\xc1--\xa8d\x93\xd5U\xb7\t]6v_\xdfi\x9a\u02b5\x99\xaaD\x8fh&3\x19\xe9!\r&\x96\xd5W\xa2G\xf4\x92\t\xabW^\x01~dRU\x8f\x82\x01 O\xb0M\x00\xc6\x02\\\u067dwcs\xe1\x8cT\xcd\xd4\xe1\x05\x95-7=3\xb4\xfe\xb9\xeb\x1bJ\xdaWN-\uf247Z\xae\xdd\xfb\x9a\u007f\xda\xca\xe4\x8c5\xc9\xfc\xf0\u0321\xb8\xf7\x96\x11\xb0\xaf\xde\x1al\\ \x97\u034f\xe7\xdf\xc2\xff\xbax\xe1\xb7\x17\xb6\xac]0=\xd7\xd7>p\xc3\xcc%{W\xd6T-\xff\u0392Y7\xa6\xdar}3{\xd75/\u0631\xb0\xf8\xeb\xa7*\x17\u0143\xc1\xa6%5\x15\xdd\u0244\xcfP\xff\x10\xe9^\xbd\xbcvnBv\xda+\x9a\xbb\xab\x96\xafF\b+6\xe5h,\x16\xa1\x06\xda!\xbc\xb5\xb6a\x14\x97(([\xaf\x93\xfc~?\xf6W\\\xefv\x8bS6\x85D\xe9z1gr$\xcaJG\xcb\xc0*\x8e\xe9\x9e-iJ\xaa\u007fc,\xc1\"p\x9218n\"\x14K\x8bY(\xde~x(\xc2\xeb\xad5\xed)%\x10\u36de\x1cZ~x\xa4-\x1d\x9a\b\xc4i\xeb\x95@$3V\xbd\xf9\xea\x937\xd2@\x14\xf8\x87\xf5\xba\xfe\xef\xfdns~ci&\f\u007f\xc0\xc2\xf0o\xd0Z\xd8=9\f\xd74#\x84&\xb8\fnH\xe9\u04cd\x89\\\xa9h\xa4hW\xd1\xc1\"\u03ab\xd9g\xfdgx\x91\xd02|\x11|\xc8%e0F<\x832\xe4\xf7b\xff\a\x98a\xfa\xff\xc1\x8e\xff\x1f\f!\xbb\u00d5\x01\x83!P\x19\x0eU\xb0\x13\x15\b3\x9c\xa6\u022bC~\xb44\x11\x95\xf2F\xf2v\xe5\x1d\xcc\xe3\x1c\xfbN\xe9\xdf\xd0\xe3A\xfduz\u0729\x87iz\xa8\u04c3O\x1f\xd5c\xbd\xfe\x9b \xcet\x05\xc4\xe5>d\x962@.~\x05\u02b1\x90f\xaf\xf7&C\xba\xaby\x9aoB<\xd3\u055aL\xc6|\xf8\xa3\xab\xb5P\xb0,\xfa\x98\xc3\xdc;H\xa0u\xbb\f\xa9\x12*H\x00\x00\x06\x9e'\xc20\u0686p\x19k8\x9c\x9f@'\xd9@F\xc8\x1bt@\xc1\xc7\t \x02\x02AJ/\xdd(3Q\u983f!*\xcb\xe0T\xfa*\x15\x19*\xc1\xa6\x06\x0e_\x1c$\x0f\x8f\a\xf0\xb9\x8f\xe1\xe9!8\u007f0\xbd'\xfd*\xc2h\b\x8es\x98|\xa0\xf0EK\x12\r\"V'\xe8/\x9fA\xf0C\x04\xcf \xb8\r\xc1\x16\x04+\x114#\xa8E\x80\xb8\xef\xfb\xf8(\x8f\xb7\xf1\x80x\x89\xc7\x02\u03e3\xef_\x000\xc20`@Q\x05\v1\x8a\x81E}\xf6%\xb3Z\x90\x01\xb1@\xb7!\xf20\x93\x84t\xef\u075b\x1e\u06b7\xef\x9ft\xe7\x15\xdd\x05\x10x\x0e\x80\xa0aa\x9b\x80\xcb\xd8\xc8\x01\xff\xffu\x97\xaf\xd2\u0762f\xca\xc3\x10~w\xdc\xcfn\v\xf7A3\xac=\x98\xf6\r\xa5\x17R\xddC\x97\xfeLB4\x9f\x19\u007f\u0418\b\xc4\x0e\x14\x16\x86g d\xd5\xce\xc8m\x886\x80U\xeb0\"\x10\x10*y\xa8\xda\"u98\x14\xa7\u06bd\xc7(\x16\x86\xc0XJ\xb3\xfc\x96\x15\xcaL\xa9f\x93\x11\x18\\F`\x06\xe2\x81\u007f\x8a\x17\x971\xdc\x1c+\x9b\x16\xb1yk\xe7\xd7\xcc\xdb7#\xdeubi\x1f\xadM\xee\xaa\u03aa\x8a\xe6\x02\xc3\x0f\xff\x99\xf3\v\xd5.\xe9\x9c=\xa5\xa8e\xfa\x9c\u02b29\xb5\xbe\x8a\xbc\xddS\xea\xe4\xd4]\vZV\xf5vGKZ\xe2\xcd\xc5\xe6\xf4\x9b\xffL\nb\xca\x05\xb4\t\xdbioY\x80V\xa2\xe1D|\xa1#\x15\xf69`[\x18\x1c\xe1\x193\xc2\x0e\xd2Q\xeeG\x80V'VC]\xa2\x03:\x8au\x8b\u0362y0\xd7h\xf6\x99O\x9a\x89\x80rA4\xe7\x9as\x13U\xf3Hb\xfaL\x14\x95O\xc7O\xb3!>5D\u007f\x9ft\x9a\xe2\xd0\xd3\n\xb49MM\xb2\xf1\xb4\xc9A\xaf0\a\x9c\x96NO\xaaxWU:\a1@.\u063e\x01\xe79\xe1r\xf1\xab\xb61\xe8\x9f_\xc0\xa0\u007fU\xbe\x1c\xe3\xecf\xb0\xda\u06558(M\x1c\v\xdb-\xa1\xda\xf6\xa5SKfV\x04\x04\xce\\\u057a\xa8r\xf6\u6e51\xba\xe1G\x97\x95\xf4\u039d\xeep\x00\xd8\xf2\"\x8e\xd2\x19Qg\xcf\xfe7\xb7<\x93N\x1f\xe9\x9d\xf3\xe0\x9f\xefo\xd8<<\x18\xe9\xf9\u00ed/\xa6\xdf\xff\xf1\xd0\roC\xf5\xe9\x87A8\xb9\xfa\xa2m\xf9\xfc\xea\x8eX\x0eg\u021d=\xa5my<\x17\xbf\u0778u\xe3\xd2d\x917\xd6\x14\f5\x97\xe7\xd6,\xbf\xb7g\xf9\xd37OS\x19L\xaat\xca\xee\x96T\xa4rZ\xa1\xb1a\xe5\xdd\x1d\xf7\xbe\xb3\u007f\xce\xf0k\xe9O\x1e{\xe0\xbf\x0e\xce58}\xa6{\n\x8a\x87~\f\xae\x17O\xc0\xf4\x8f\xefX\xfe\xbf\u049f\xa6\xcf\xee\xdc\\2o\xd3\xf4q\x95~j\xff\x8d\xcc'\xf4\u017d\u00df@\"\xb2\xa2o'\xf2\x05~\x06\x86\x19V\xc0V2S\x053\x01T\x80\f\x06\x82\x90$\u0088\xb8K|C$J\xb1r\n\x9a\xa4(\x89\xa2\xddh\xf7\u0663\xf6\xfb\xec\u07f5\x9f\xb3\v\"\xe1\x14\xc4\xc0\xe1\x01\x83_cH\x1ax\xab\x95'\x1c2\xa3x,^\x1b5\xd7F\xce\x03\xc5\v\xfdl\xb4P\x13\xa1\xc9bb\x89B]\xd8\u05e7\xbc\xc9\fJ0\xca\x17d5\x90RBY\x17\xfa\x95\xbe\x83\xe3\xe7\x1e;\x81]\xcf\xe2\x9c\xf4\x8a=\x82\xc9lV\x89f\xb3I\xd8\r?M\xd7\xf1'\xbe\x9a\x86W\xc3\xd3\xe6\x8a\xfa&\x9f\xaf\xb9A6\u0454B\x04\xbdF\xf5\xba\x9d\u019a\x03\xe5\xa1(Z\x96h\xd4z{y\x01\xde\x13>\x17\xf0\xefX\x1a\xe7OY\xbc\xc14b\u00a6\x15\xe5\xdb\xca\xef+\xc7R98\xf3{\x1d\x83e\xda`\xea&'h\x9d\xa0r:Q~\xcaa\xceK!2\xd1E\xfb\x95\xa1\x82\xf4w\x8a\xe9\xfa\xa4\xbf3\\\x11eU\x86\u0555\xc0D\x9e\u0672\xd8\"`\xc9b\xd3\b\xb8 0\x11]\xaf\xc1}#?\xde\xd1\x1cn[7}\xfaM\xbd\x15M[\x8e\x0e\xa7\xdd\xc7?\xeb\xbev\x86\xef\xc0S\xe7@\xb3p\xf3L\u007f`\u05b7\x96\xf0c\xe1\x05\xf7\xach\\;\xb7Z\xad\u0455\u0339\xb1g\xf0\x91uSI\x9b\xb7nQ\u074d+\xc7\x1f\x18\xbfP\x98\\\xdeP\xd3\xdf\x12\xca\xe0\xed\xad\x14\x13\xecW\xc6o\xed\t\xeb\x11\x03\x18\x126g\xd2`p\x1e\xf7C\u02bf\x81\x82\x82\t\xaf\xf9\xfd\xa1#!\xe0\x17;\x87\xf2\x03h\xc0\xc3\xe95\x03\x16\v\xab(\xf4\x87)\xc6|\x13a\xfe\xa0\xef\xe5eW\x80@\x15M\x052y\x14lgt,q\xad9\xbc\xa5\xa5\ue1a37,:\xd8\x11\ue63f\xb4\xee\x89\v\x8f\xb4/x\xe6\xab\xc7\xd6\xfedNG|\x0f\x1f\xee\xda\xff\xa7\xd1{\xde\xde\xd7\x11t<ft\x18\u0135g\xc0\xfe\xccS`=\xb3\xbex\xca\xc3\xfeRV\x17\x14_]\xa4\xbe\xd2!\a\x1b\x93\xeb\x17\xa3\x15.\xc9\x05\xd6^a\xd0iI\x89\u011a\x12\u030a\x03\x14\xf9\u898c\xc9\x05.\x180\x05\xd8`\\T\x06d&\xd9O\xbf&5\x96\xfe\xc7\xd3\xe9\xef\xc0\x03\x0f~qx\xe0\xa7\u0377\x1c\xbb\xfe\u73c1\nt\xf8\x83W\xd2\x1f\xfc\xb0\x9f\x1f[\xf2r\xfa\xb3\xb1\uf73d\xb3\xe5\xebQ\xc8Wl\xc7\xeeO^\xa5\xf7\u05e2\xe6D\x81U\x05*\x15ph\x85^\xd0\xf4\u00a0N=0G\x00\xa3pD\xc0\x94\xea\xd6\xf0\x03\x98h\x06 #\x8e2v\u0728H\x15\x93\xfe\x12c\b\x94\x8d\x80\x19\xa9\x93\xd9\u022b\xe3j\xfc\x8f\xf1\x1fc\xc7\xf8\a\xb8\x81\x1f{\"]\xff\xd8\xf8\x17\u07f8\xa7\x1amH\x98\xe8\r\x8d\x04.\x11\x18!\xbbhW!\x849\xab\x86B\x1aB\xb4FmT{\x9f\xf6\x88\x96\x13\x05D\xe5\u0468\a\x8cL\x9e\xb80,\\\x128\x95\x90\xc8\xf1$\x85\x84dK\n\x02b\u04b1dSD\x8bD.\v\u05dfu\xeaFzZ\xa1\a\xb2\x12\xc2\xf6\xe3\x13\xe2Q\xe1\xc6/>q%\x96\xfe\xaa\x8cu\xaa\x13\xdeHDW\xd4k\xc5+J\xa4\x12\xf0-\xd6\r\x15G\x06\x10\xca\xcf\x190q\xf9\x03\xa2e\xc2\x0e\x13\xaeQ(}\xc6n\x99\xae\x04KU~&XHp\x12\xaa\xac\xa6\xd61\xc0\u007fTo\xb8\xe1\xd6Y\x8f\xfc\xf5\xa9\x9e\x811\xd0>7\xfc\xab\x85\xc9\xfcy\v\xfbJo>\xb1\xad\xb9\xfa\xc6Wo+\x9e\xd9X\x9d\x93>K\xb8q\u065ck\u046c\xfa18\x0e\x1f\x02\xfb\x8fW\x15Oy\xcc\xe4u\x18Xp\xdd\xfa\x87\x87{x\x95\x96\x87\x97\xb2v\xe5\xce*\xbelH\x04\xd5\u040b\x96\xebO\xe9\xe1\xa4\x1e\xfczPq\xbd\xfc\xa0\x8e\f\x18\x99\x8bU\x1a\x81\xf0\x99\xca$+|q6\xab\xfb\xd8.c$:\x1c\x96\xe9\xbb\u031d=>>t\xfc8>p\x1c?;\xdeC9\xd2\xfdx\xa5\xc2C \x84\a\x95{-H\x14h\xf5\x11=\u07a2\u007fH\xff\x9c\xfek=\u05ed\x87\x88\xbeN?KO|z\xc0*\xad\xa6\x97\xc7?'@\x1d\xfbEB\xd2KI\x052\xa89\x81\x10\r\x93\xe1t\x8c\xfe\x00\x95\"\xd2w:\xf6\xe9\xe9\xd8@\x1f\xc3\x12\n\x9dRm\xa20\xcd&\x9a\x1cxp\xfc\xe3C\x87\xb0\xf9\u0421\xa1\"n\u007f\xd1\xd0P\xd1\xd7+\x8b\x98\xbf.%\xd3[`\x93\u00a5F\x13\xb9\xe7l\x90\xb2m\xb0\xe1\xa8\r\x8c\xbd:B\x90N\xd2aQ\xa7'\xe2\x00bt9\xbb\v\x9b\xeaS\xa8A2\x89\u0560\xba\u04aa\xe5\x91\xdbs\xf3:JB\xb3\x1a\n~X\xb7\xea\xfe\xf4\x16\xbd\xf6\xa0Zk\x89-\x9cFY\xb4\xfeU\a\x96\x97_\xce\x19\xee1%g\a\x13%X7\xa4\x03\x1d\xd2h%\xad\x16\xd8x\x18\x8b\xf4\r\x19\x8e\x1a \xca(\u02cc\xe5\xf5X\xd2JI\x15\xeb\x10:z\x80U<u\x01\xe2\xa9\xfa\x99\xf9\xb5H$\xeb\x02\xa5=P)\xe9\xbbl\xaa\xa5\x9f\x98;@T\xdcQ\r2p\x8f\xbd\x95n\xb8\xeb\xf8\xf1\x9b\xe0'o\x8e\u007f\x81\x8f_;~\x8c:%\xf44\x96\xc7wL\xce-\x1e\x05\x13\x16N<\xa2\x80j\u048b\x06\x05 d\x00)\u026b\u012b\xf2\u0572B\u00fev\x9c%\xe8W\x17\x9e\xca\xfc\xbd\x10\xa5\u007f\xefBw%,U.\x068\x1d\x06\x95\u0398\xac5\x80\xc1\xd4\xebbN\u0325\x1f]\x88\x9dDz\xbdN--w\xcfq\x83\xdf\rF7\xa8\xb4\xec\x17r\xe8\xa5\x02-h\xb1\xaaW=\x98\xe3\x04\x90\xd4\xe6$\x18\xb4\u0124\xa3\x16\x18\xa3\x1ft*%\xfcb\x11\x1a\x81r\xc4$+\xda\xc7\xfa\"\xfdJ\x10R\x0e\xca$G\xe4\xc8yz\x86\xc6c__\x00\x82v\x87\x17l\x8c\xa4\x01\x19XtVTUWU\a\x81\x04\xd3\xd3U\x02\xc7\xf1\x87\xc0\n\x0f\v\xf0(X\x8fs\x84#\xaat\x13\x8f\xdaf\xc6\ufabd\xb8\x8f\x1f\xfbz!\xf7\xf4Wmds\xc5m\r\xad3\xbf\xc6\x19=y\x83\xd2#\xbb\x12E\x86B\x00\xb0\xd1|q\x1du\xc1}.@\xb4\x04\xe30u+Q\xf7j\x06\x9dv,\t\xce$\xd6\x12=\x93\x9e\x1e\xea5Y\xe9\xe3rdB\xf4l\xf6\xf4)\xf9sE\\\x19\xe4\x82p)\xa1\x11\xc6\x1b~?^\x9e\x11\xf5,\xfe\x95H8\xc6L\x1e\xe6\x8e\xcfno\xba\xb7\xf6\xe2\xfbT\xc8\xf6\xf66\u007fKKc\x0e\xf1+\xe3@V\x8b\xf8\x8dY\xbe\xb6\"\xe1\xf7\xd2\xdePt\xaa\bN\x16\xc1\x86\"\x88\x16\r\x14a\xebb\xcdPap\xc0\u0239\x06x\u02d56\xa1\xc8\xf2?do\xf9\x8d]\a?z\xe8\xf1O\x1eio\u007f\xf4\xc2\xe3\x0f\xfd\xf7\xc1\xae\xaf\u07ecX\xf3\xe4\xb5\xd7>\xb9&\x16[\xfd\u0135\xd7>\xb5\xb6\x02\xbf\xf3L\xfa\xbf\u03ac\xa5\xfd\xcb\xf1\xec\xb3`\xfb\u025a5?M\xff\xf7s\xa3o?\xd8\xd5\xf5\xe0\u06e3w\xfe\u906e\xae\a\xfe\x84.\xf73\x99\xda\xd5@#hF\xa2\u0636\xb8\x10\xd5 6A\xbb\xc2\xfd\xba\x1b\x12J\x90\bF\xb1W5\x98cL\x95\t\t\x01\v\x82\xe8J\xa9\x89H-\x9aa2&\xeav\x06ed\xa8\xc8\b0\u05f3\xd1\xf9e\\\xc1\xc9\u0577\xbc\xbe\u007f\xdfqX}\u06cfn\xa9\x1f\xef\xd8\xdew\xd7\xe2\xd2'\x0e\x1f\xe44\x8b\x9f\xde>{\x9c\x92\u0235\xeb\x0e\xa6W\xf8[7v\xdd;\x9a\xb1gz\x99bO\x0f*G5\x89\xbcBjO\xf9\x94\f'e\xd8 CT\x1e\x90\xb1w\xb1u(V2\xe0\xe2\x82\x03\xbc\u0462F\u0478\xfc\xcf6\xa50';\x1f\xfb?0n\xf9\xc0\xbd}\x91\xd1\u079bV|_6\x15\x99\xff\u007ff\xde\xf1\xef/\u007f\xbb\xa0\xff\xbe\xfa{g\x9e\u0646\xf1\xff\xd4\xde\a\xa9\xbd\x8d(\x17\u075a\xe8Q\x1b]F\xfc\xa5\x11\x8c*\xad1i\u0529u \xea\xc0\xbeX%:E,\x8aj\x03|`\xf8\u0480\r\xec\xaaA/\xe9\xbdq\xef}\xde\xefzOz\xcfyy\xbf\x17$\xe8\u0143\x1e\x1d\x91R\b\x81\x8an\xb9)B\f\xc0\xaaT\x16\x01\x9e7_F\x80\xbf\xa9\x89Q\x18\x1b\x8b\xb2s\xac\xc9FX\xd1V\xdc\xe4\xb7gX\xef \x84\xafp\u01b4\xdf\xc2 h\xd2\xe5]+\xab\xe1\u07b7\xd3\xdf{\xef\x89\xde[\xbaB\x8c\x88;\x88\x97\x8c?\xc1\x8f\xfd\xe6\xcd\x05\xb7\xf65Z\xc77\xe2%\x8f\x06\xa7\xaf\x98\x9e\x1cLx\x94z\xbb\x92\xf2\xa9?\xa7=Y\xa6\x18%\xcc\bTS/ZQy\xb2\xf2R%NUB\xbc\x12\xa6\xf4\xaa\xddC\x15\xa6)|x \xdf\xcf\x19Rj\x96\f\xf2y\xfaCK+\xb0\u039c\xf1\x9e\xccP\xddeB\x9bP`\xc7d\vg\b\xb0,\xaa\vfy//!?\x9f>rl\xd3\xf0\u99bc\x05\xa9\xa1\xd8\xc1\a=3o\xee[\xb4c~Q\xe2\xba\xef-\xdd\xfcj[K\u04d3\vo\xbe\xcd;cS\xf7\xe2\xd1%Q\xb8}\u90eb\xab\x83y/H>\xa7\xf1\xc6\rU\x9d-\xf1Pp\xde\xcaow/\xbcs V\x12|\xd8\x13\u0658\xaa\x9d\xd7R\x17\xc8oO\u0752\x99\xcb\xe1\xcc\xd4o\"\xeaO\u010cjxC\rs\u052f\xab\xb1\xa4\xf6\xab\xcb\xd4\xe4\x88\xf0\x89\x80\xbf\u0370\xba\u060b\x13\xe4]\x82\x8d\x04T\x84,\xc0+\xf0fL\xf0\x04\xef\x83E2\xc0eqO,\xc3\x18\xd3\u0111\x18\xab\x9dm\xa3\xac\x99\xd3&\x1a\xc0\x1b\u007f\x98\xee'\xe9\xf4\x00o~\"\x8bu\x8eQ\xac\xf3\x0e\u007f\f9X\xef\xb4\xf7\x82R\xfe\x86]G\\Xr\x81\xa1W;\xe84\r\b\x16\x1d\x1b\x01\xc42Yp9\tL\x13\x04\"\xeb\x9c\xf6\f\xa8\xe1\xdei\xde\xf9\xf3;F~\xb2s\xda\x0f\xbf\u007fd\xd1\xc8\xdcB\xe0\x8f]l\xbf\xf6'\xbb\xe6\u03be\xf7\xb5\x9b\xc9\xe1\x8b\xc9#\xa7\xaa\x96\xdd\xd1E\x8e!P\xc6^w)=tmB\"X\xad\xe6P\n6\xc0Q\xb8\x00\x1c0\xed\xec\x14\xaf\x83\x04`\x88\x1a\xb6\x19N\x1a\x88!!\xa8\x93<\x1bc\xbd\xc4\xf1\x1cQ\x1f\xbb\xf4\xee\x8b\x1aSR\xcdZ\xaa\x86^RcbF@\x94\x86*Ghef\xa3\xadHv\xb4\x95%%\xa8\xe02\x04\xe9F\xf3\xb7\x11\xaa\xc9O\u03e4\x1d?L\xbb~\na\xcf\x14\x93\xb1\u0517\x99,\xbb\xb8t\xf13mm\xcf,E(\xe3'!\xadp\xf9\xe7\xc6$\x15\x1dWHF\xda\xe1^\xa6\aF\x11X\xaf3\xd3C@\xec\n\xb2{\xd8\u0393\xcbNG\xe9Qn\xc8*\x02'N\x13_\x12\x89\u0205\xac\xa1\xfc\u0434Pw\x88\x17\xed\xa1\x90]$^=2\xc0\x06:3{\x8aj\xa7\fQ\xa8C\r\x92\xc1P<\\\xbc\xad\x18\xfb\x8b\u02ca\xb1\xb1\x18T>/\xd3\xd1\xe2\xb5\xfb\xa9\xbev\x89\xeaj\xd7#/\x11C\xa1\xac\rB\xac-\xd1\xd3!\xc9cF\x8a\xf6&j\x04\xb6\u03cc8\xfb.\x8f9\xcd\x0ej\aJ\fPt\xac4\xd8+o\xcc4\x16/qP^\xcdBmDhu+\b\v\xa2\x01D\x12\xbc|\x85\x14\xfd\xf4=\xa3\xc7e\x118\x9dd\xd1\xfe\xec\xb5\xf4\xee\x13iC\x8eV\xa7\xd5j5.\xc3_O\xa4o\xf9\xe99\x9d\xd5d\xe0y\xa3\u0561\xa7\x96|\xbaf\u00ea\xfe\x82\x82\xdekV\x94\x93ki\x03~V^\x1b\xad\xae\x90\xab\xa3\x1b\xaa..\xa1\xd7o/\xbdf\xd9\xe2\x82\u0432\xb5\xc3\xe5\u0658H)\x98r{\u00a3\xd6H\x1a\r\xaa\xa6(BU\xc3\x03\x8f1\xbd\x0e\x1b\xd0\b:\x85\x88B{Z\xa9\xb5\x18\xd2\xd2\x1b\xf5\x8cS\u0726\xe7T\xa2@-\xf1\xa2 d\x86\xe2\x12W\x88!\xac\x02\xac\xe2\xd4\xf4T\x16\xef*\x83mj\x97X\xec\x1b\xa3q\x16\x1f\x14u\xd1\xcf\xce\f\xabO\x014\xfd\x91\xe9\x0fp\xa9\xb7\u048fR]\u963b\xf7\f\xb4C\u01eb\xe9\xc5x\xcb\xf8N|\x11\x1f\x1f\u007f\x13G\xc7\u06d9\xe8\x19\xf9\xab\xa9\xfc*\xb4)\xe1\xfaD\x03\x9a\x84Z\x97T='\xc2~\x11\x12\"\xb8E\xa01#2\u0462\xa2\xc8\xc3\b\x869\x18\xdc\x18\xb0\x841\xe2z7\xf3\xb7\xf3\x0f\xf0dN\x96\xd7\x13\xf9*\x04\b8\xb3\x98\x89jsm\x1fd\xe7\xeb\xa8\xe8t/3\xd93\xf4\x1e\x1b\xae2Ii\xf5\x05\x19\xbb\xa1\xfbg\xe9\xe6\x1f\xa6\x9b\u007f\x89\xdf\xc2\u007f\xbe\xb8c\xfc5\x1c%\xb7#\x94\xc5\xed\x84\u0173\x9av@\xbf\x9a\xb6\xdd\x15t\x94\x15\xd7\xce\xd1~W\u02e9T\x1c\aC\x1a\x91\x1b\xe0\tVeFz\xb5\xf4\a\xe8\x00/J\x1b2\xdd\u0162\n0\xcfLy\x04H\xfab7~m|6\xd91>\x15\xbf\xbd\x9b\xdb\xf6\xd4\uebf7g\xee\xf3D\xfa\x04\xaeU\xea[A\xc2\xc1\xa1\xbf\t\x9f\"\x90hz\x9f\x02\x0e\xf8\xcf\xf1\x17\xc2\xe7\xf0\xe5\xe5\xb9\xe6\x8f\x18-\xcfFe\x14/\xe1\xda\xf4\x1a\xd8{\xee\\\xfa\x84\xf0\xd5\u07af\xca\xd9w9\x10\xc2\x1f(\xf3\u0781\x1f`\x00\txDX\x1d 83\xf1\x1d\x05\x06\x96\xe5\x1a\x86h-\x10\x84\x9fc\xff\v\xe3\xefN\xcc|\x03\x92\xd3'\xe0\xe7\x8a,\xf9\t+A\u007f\x83OS\xc2\x06\x01\vj\xf4\xb9\xf8%\xf9\x9c\xfb\"\x8b\x9c~\x97\x91\xc4!\x9b\x82\x95T\x1a\xf9\xdc9\u0617^}\x98\u007f}\xef\x97\x02\xfb\x9e\"\x1c\xe2\\\xfci$ \xf3\x18!\xac?\n\x88\xcd?S?\xb0\x1b\xcb,`\x8a\xe0\x97Cp\xf2{\xe9#\xe9\xc7q\x88\xf1\x9d\xf8\xdcx\x00\xc1\xa5\x8b\xe9\x13\xa4\xe3\x12\x03Bf*\x13\x0fp\x1c\xd3\x11I\xf6o\x999I\xc7\xc5\u00c4\xae<\xb9[\xb1\x1f\x8cr\u007f$f!\x80\xf4\u021e\xd0 A5bD\x03\x8c\xb2\x8a\xf6\xe5\xfc\n\xa2\xbff3\x96\x94#\xaa\x94ib\x12\xf3\x8d\xc1\xb9\xb3\xe3\xd2\xdbR\xa4\xb4\xcc\xc6\xfd1w\xde\xc2.\xb7-\xaf\xab\xab\u0753\xc1\b\xfd\xb4\u007f>\xcc\xf5\xa3 \x8a\xa1n\u02b5CQkp~\x85\xb1b\xb8\x02\veI]\u03b1Ko$\xbczS2G\xa2\U0005a4e3\xeb\x91]\xf6N\u03d4\xb9\x92\xe4\x91\xf2;\xb1hG6\x14g\xfd\x94\x8euikQ\xc2!\x12\x91\xce\xf7+\x88\x97\x01\xde+\xccbU\x1c\xae\xe6_M!\xda\x1e\x1a@dk\x8d\xec\xc4\x15R\x05\x9a;R\xf1\xe9\xd7\xcd/{\xff\xc3c\x9e\uab8ay\xf75'\xda\xc6\x06\x87\xf6.-KG\x1bV\xb6G\xee\xeb\xbdy\xa6\u007f\xe9\xfe\x92\xa6)\xd6p\u05d6\xee'\x8e\xaa\xc4\xe9-\xbd\xd5\u03b2\xbc\xd1\u009a\xa2Ew.\x1b\x97\xb6\x15\u033e~\xce5\"\xe7\xaf\ud497\xf4d\xf4<L\xfbY\\\xb0\"\x1f\x8a\xa2\x9a\x97K\x92\xfc\x82\xf2\xf2c\x97\x8e%\x1c\x9a\x996)\xd4j\xee.\xb3 \xb3mJ\xa7Qc\xf7w\xba\x91D\xeb\xc1y\xa6V<\x03\xe1#\xf4\xfd\xaa9\u05a0\x18d\rN\x10\x056_\xe9\xb8B\b\xb19\xb1G\xfb\x0f\xac\xab\xaf_w\xa0\xbf.5\xbb\u03a1\v\xed\x1c\xc3\xf4\xa5rL\x9d\x9dru\xaeir\xbb\x9b\xd6v\u077em\x1b\u05df\xbc\xef\xb7w\xdfsv\xd7\u031c\xc8T\xff]\x825}GpN^aA\xb0\xbe\xd8\xf5\x80\xbc\xf2\xe1U\xcb\x1fYS\xfd\xa7_\xbd\xf1\x1b\xe6w6\xd7J\x86\xa9\xaf|hJ\xc2\xe9\xd1\a\x06\x02\xdb\x02X\n\x80=\xc9\xf7\xf8-]\x1a\xc9\u0545\uc4d0\xbe\xc2\xeb\xf3YR\xf72\xd7 PKgh+\xc0s\x97\x1f\xbd\xb5\xad}\xe7\vC\x1d{cU\x8e\x9a\xfa\xa99\x8f\xec\u06bd\xa7kGU\xd5\x16k|\xf4\xec\xbeG\xde\x1em\xccs\x1d\xd0X\x8c\xea\x9f\xff\xf6\xad\x1f\x87\\\x8fy\xbcW\xe6}\xb1b\xcf2:\xfe\xf0\x14 w\xabw~L\x8aAiR\xdbS\xee\xb3\xe5\xa2H\xa7]\x92\xfc\x9d P\x91\xe4+\xb6\x9c\x88\x8b\xd0\u05443\x1b\v\x01\xc3\fA\x16\x13\xd5\xd9Haa\u046d\xb2\xd7\xcdN\xd5\xf7\x1dX__\xbf\xfe@\x1f5i\xbd]G\b\xe6\xc6\xeeO\x9fi_\xd5\xe4\xc3Ys\u079f\xd7P\x9as\u0662\xc5S\xfdy\xbe\x9cj\t^\xfa\xf2\xc3\x1d\xa5\xfd\xf7\xf4\x17e\xac\xf9\xe6\xaf3\xf2\x93\xf3\u0516^\x14F-\x89\xc2`\xd2%-(z\xb7\b\x86\x8b \xcfD\xedYh\xeat\xe7E\xf2\xb01\x0f\x84\xbc<\xab\xafS#Y\xa9u\xaf\xf0[\x97\x89\x11\x06!'\x9b\u064b=\x10\xf0B\x96%'\x84F{\x80\xea\x82S\xeb\xc7v$\x9bo\xfc\x97\xe5\xd7<\xba\xben\xbc\x9d\u007f\xf0\x01yAW{\xb8pv\u05c2\u0535;\xb5\xf0\xa1\xbbv\xa1\xb5\xed\xde\u007f\xbd\xfd\x8e\xdf\xed\xedh\xdd\xfe\xf2\xfa\x8d\xa7\xc74\x16\x8f\xf91K\xaeYE\xde~x\ufd0d\x9d\xc5J\x1c\xd0\xd4\xc5\x17\x04\x1frS\x8e\xac\xe3u\xcf9\x0fNyF<\xbb<\a=\x9c\xcf\x13\xf7\xcc\xf1\x10\xb7{\x9btR\u0092\x94\x83[\x89H\x8c<\x9b\x15:\xc2s<\x8f\x88D\xfc\x84\xf1i\a\x89 \x10\xe0\xe7\x88(\a\xc4\x1c\xa3\xb5S\x0f\x98\xe62U\x90R\f\xe7c\x19>\xa4OY\xa7J\x11c-\x03\x8d\u0675\x10\xc1\xca\xeao\x80b\x03\xd5X\xc6w}\xfe\x83\x1f\xfd\xa8d\xfe\xb7:\xea\xae\tG}3\v\v\xa7\x16X>'\xa7/\xc6\xc9\xe9Y\xd3Rk\xee\xe9\x0e:\f\xf7hM\x96\xb2yM+3k Ci+\xb9H}\x10\xa7\x9d\xa7\x1f\xfdK\u00a5\x8f\xf1\xf3Z\xab\xcd\xd1T\xf5\x86\xea\x91jR\x1d\xad\x8e\x86\x93\x9eE\xad<\xeb\xe9\xb3iO\xe7y\xd0x`\xdc\x03G=p\x87\a\xfc\x9e2O\xc2C<\x9e\x94/\x05'S\xe7R\xf8`\n\x12\xe1\x04\xa5\x18\u0098\x8f\xe9\xb9\xfa\x9e\xb9\x1aM\u07929\xf5\xc5\x1dF\a\x88\x0eG\xbd4}N\x9e\x1b\x90\x91rKTS\xe6\xc8\u04f5\x922OD\xf1\x0f\x05\u0267\xfb\x18\xfca\u02b2\xc6\xcfV\xbd\x9cVV\xbd\xb0\xe9\x126b\xa0&\xb0\x89W\x96\xbed\xd6H\u05b1\xc2\xf0\xcdys\xa0\xe5\xae\xfa\xca\xe0\x01\xb2\xa5A\x19\xeeP\x83Y\x94\x1cT\xd6g\b\xe4\xe2Os\v\xa2\x03w\xf7\u064b\r\xa6\x80\xdb\xe4,\xaa\xf1\x1d\xed\x1b\xe9\xcao\xba\xed\xd7w\xad9\xb8\xba2\u073c :\xa5*1=BW3\u0196}gih\x8e;\x9d\u0229[\x9a<\xfe\x8a\xb3\xba\xb7\xe9h\xb0=^\xb4d\xed5\x83+V\r^\xb3\x9ak\xdb\xe8\x0e\xae\x9b\u07be\xbd\xbf\x12\x88\xc6\xe5/t\xba\x03f!\u06b9\xaea\xe1\xddK+\xa6tnl\xad_\xdc<Ek\x99[\u0670h\x8a9\u0795\x92\x17\u077d\xacB\xab\xfe\x1a\x87\x12\xa5\xeeMkK\xa7\x06tR\xf1l\x92\u06b4ax\xf3\x96\xebnD\x80\x0e\xb3\xf1\b\xcdu\x17\x8a%<\xa8\xd55\xdf-\xb9S\xee\x1171\x1a4\xad\xda\xee\x1c\x89\xeb\xb4I:\xa4e\xad F\x03h\x82\xf6Pjf\xc0\x94Y\x84\xa2\x10\x1e\xa6\xcc\xd2\x0e\xbb\xcdD\x96\xac\xda\u0435\xbe\xc536\xa6\u04b8\xa6\xcf]R\xf6\x83W\xf0\x8fo\xbd\xb5bhOj\xfc5Z\ac\xbb\"\xf1)\u0593\xff:.g\xea\xcdA\x84\xe0z\xfe=D\x90\t\x85\x12V\xc9\xe2\xb7`\x1dj\xe5\xa0\xdb,\xce3\x1a\xb11\u04c7\xa2\xef)C\xbaXf\xb5\x97L*\xaa2\xb3z\x02u\x16\f\x8e\x8d\xfd\xa4\xa1\xc4\x1e\xf6\x98\xe2\xc5%\r\\\x1b\x14\xd5W\xe9s#\u07a9\xb55\xec\x1e\x97N\xa4\xad\xca=,(\x80J\x13.)\xe8\x0f\xe2\\c\xab\xceJ\x88\xae;\xcf1\xcf\xe7\xd3\x1b\xc5N\xe4fE@\xb9\x13\x83>\x92r3\xcb?\x11\x86\x96\u0277n.\x8b;r\xaa\x82\xee\u04a0e,/\xb9\xcerE\x8a\xb4\u0560\u0763\xd1\x1a\xc3M2\xf7\xd9\xd7\xce\xd9[\x16D\u0141\xc9be\xecO.(k6\xfb\xe9\xc0\x8e\xe30!\xc24\x1e\x94\xacp\xb0\xac\x90x^2JQ\t\x8bzu\xab\xa6\u06e8EH!Ti\x1e\x88\n\x15'\x12Ac#4\u8cc4b\xa6\xabe\x11\xae\xb2\x8a\xa8\x96\x01$\xa8f\xa0v\x82R$\xd0s;\x84\xdeJ\x0f\u00e17\xd3G\u05fd\xf4\x92\x84\xab\x9f\x85U\xe9\xd0\xf8n\xf8bn\xbaW\xb0\x8eW\xa5?\xca\xc8\a\x83T>\x82r\x12\x06\x89\xf7\xf3\x18\xb5B7\x87\x91\xe2\x13v\xab\xac;\x98\a\x04\xeb\x84N\xc2\xed4\xf7\x8b\xd1\xf2D<\xa8i}E\v\xfb\xb4Oi\xf1\xa8\x16Vh7k\xb1VkG\xad\xc5\xf3K/\x94\xc2\xeb\xa5\xe0/\xed,\xc5\xc6RP\xb9l\xad\xf6\xee\x92`N\x0eg\xec,\xf4I\x0e\xa3=\x13u1\xaa\x99\xf2\x00BF\xb1,#\xc3\x18#\x06\x8ac\xdf\b\xc3\xc9\x01\xe9\xc8\u0123c\",\xf97\aW\xcd\x1cj\xf2\xfe\xe0\x9aU\xb3W\xc6\xddc{r4\xce\xe69\x8bJo\xfcn\x81*g\xe6\x82T\xec\xc8\xf3,L\xa3\x8bo_8\xfe\u0615\x80\xe5\xda\xf6\xb0p]\xd8\x1f\x9dVb\xcf\x06m6o\xa8\x8eNT\x96\xc8E\xad\xce\xf99RN*g$\x87(i\xe32r\x9dV\ua8ab\xd2\xe6\xff\x905\x8e\xab\x93\x86\x8959i&\xcb\xc0\xee\x9e\xed\xcf%\xf4\xde\x16\u05a1\x13\x9e\x9c$Z\x10H\x04\xde\b\xbc\x1b \xc6\x00\b\u05a4\xa6\xc7\xef\xe94J\x8eN\xfe\nd\xe8\x9f\xc4cM\xee\xcd\xfc\xa4j\u0155\xb4l}ax\xc5\xe1m\xad-\xdfzQ\u064f\xa3\xd1\x03\ang\x1b\x0e\x8f\x9e\xdd\xdd\u07be\xfb\xec\xe8\x1do\xed\x9e5k\xf7[w\xbc\xf9\xd6[o\xbe\xf9\xfa\xebY\f\x96\xb6rq\x05\xbf\x94\xa1\xaa\x84\xb74\xe9^\xc0\x10C\x81$\xe8Z\xf5\xdd\xe5\xfeN\x93]2\x18u\xeeH'\x8f\xec\n\x00c^\xcd\x14\x93\xac]x\x86\xbc\xae\x10\xa8\x8eI+\xc5\b5\x978\x19\x82e\xa0\x17\xc3\t\xd4^\n\xf4\xaa\u03e2\xb2\xed\x93A\x835'\x92\x05\n\xe9\x88P\xb5'\xd8P\u2780\x10\xe4\xed\xd2\xfe\xbb\a\x8a\xae\x800jW\xaa\x03\xa6:H\x19\x1d\"~>\u051a\xaf\x00\x1fC\xd2\xdeS\x9e\xef\xce3\xfa\xb5\x9dn\xa9\x18Qm\xb2\u04c7\x93\x81\x0f\r\u016b\xe0\x8d\xe3\x1b \xa8Z\xbe\xcc_\x1b\b\xae\x9c,\xe8\xd0\x15\x00\xd4^\xefP\xb9\xef\x1fc\x95@\u01f0\xd17\xe1\xcd\x03\x13\xf2\xbbK\x1a\x82{\xbe\xfc\x05\x9c\xb5Lu\xfb\xf3\x188\xba\\OTT\a;jJh_ ?\"\x98\xa1\x01\xac\u032e\xb9Em\x92\x10g\x99\xb3\xd39\xe2$&}\xab\xa1\xdba4\xeamf\x91a\xe2\xd3Y]b\u06493\x1a*Y\x1009V\xf1\xa8'\x99\xe3\u032d\u02c9\xaf\x9cU4\xb6\u01eer\u0576.\xe4\xfay\xfei^\x94\avv\x8d\x1f\xe5\xda~\x1e\xe9l\b\xb1uu\x14\x87\xb1\x98\xa8D\xc9DI\xc8\u04ba\x8bVz\x8c\x16T\u01eb\a\xaa\xbf[M\xa4j(nU\u007f\xd7s\u0103==U\x05E\x9d\x96b>OR\x1b2Q\x1b\x8b\xd3jv>F%\xa2\xab\xc73\x94\xb0|\x15\x8b\u05c8\xff\x9f4^|\xea\xba\x03\xa9u\x0f\xd7\xf9\u06bb\x17\x157-\xae\u0371V.I&7uF\xaa\a\xef\xeeY\xfa\xbdd\xbci\xb4uh\x99\xa3\xa6\u007fFrc\xe7\x14(\u9f31\xab0\x98\xf7\x14#\xf2\xecEu\xf9\xbeXy\xcc\xe7\xabo[\xda2c][\xc1\x94\xbc\xfb=\x91\x96\xc6`Ei\xd4\u3b5f\x95b\xb6\x0e\\\xfa\x10\xdf\xc7\xcf@\x1e\xd4\xf9\xbcK\xa9\xd8Q\x95\x96\xe2\x18_\xdc7\u01c7\x1d\xeeV\xab\xcf\x1c5c3\x92(X\x96\x8eJ\xa7\xa47$A\x90r\xccs\xecV\x87\x11uj\x95\uc533\x80\xecL\x9f\x9c\xb5\xbd\x9c\x8d#[\x16ESP\x16\a\xd9\xc6&0\xadv\xf8\xca\\2%\xa8\xd6\x17\x96U\xb8\x1aW\xcf.~\u884eU`M\u007f\x18\xdf\xce\t*r\xa7\xa0S\xf3\xfe\x8e\x9d\xcb\xf1\u05ae\x8e\xbf\\\x1c\x1d\u07f1tYf\\\xce\u0580sm(\x87\xd5+p\xb4\xe6\xcc\u03d5rS\xb9#\xb9\x846\xc1n\xb7So4O\x1e\xf1\xc9\x13Q=y\x94w\x85\xf4cG\xe4zw\xa6P-\xbesItl\xf5\xb0R\xbc\xee\x8f\u010b\xac\xa5\xcb\xf6\xaf\u00bf\x1eo\xa0\xd5k\xf9\x9e\x14\x9e\xfa\xf5\xd8e\x9e\x84\x9c\xa52\x98\u043aW\x90\x8961\xa3\u01904!\x15}Gj5\x18%\xf6L\x95\u0656d\xfbD.\rV\x89\xbe,'-\xaf[>\xb1\x90N\v\x18-Q\xcb\x1c\v\x111(\xe4\x1f\xb4\xaaAm\x84,:\xa8e\xe4\xce\xe9\u02e4W\xe44\xa3\xfe2\fW Cd\xc9\x19\x8e\v6\xa7GO\xbc\xa6\xf5z]\x9c\xc8;\xbd^\xedk'\u04a3\\\xdb\xf8#\x81\x95kS.Wj\xed\xca\x00\xbe\x86\x8a\xacp\x80\xfc\x9f\xa9\xbcQ\xf4\xe3WP\x94\u02ab\xa3\x92F\x91JM\xe5\r\xfb\x15\x12\x90\x1e\xfa}\xec\x84O-1=$#;\xad\xa6'\x8c\xce\xee0\x84)S\x97\xb0\xd16\xbe\xd8\tN?\u0747\xd5N\xa7:LL%\xa5Y]\xd9>a\xa1\xba\x96J\xa5\xa5\xe5\xfe\xf2\xb2rl,\a\xd1lb*\xdaM%>5U\xd2d\f\xbb\x04\u05d0\xeb\x06\x17q!\x89\xaa\xab\x10VqF\\e\x98\xbe\xac\xce\x13<_\x84\u03a9\xfe\x13\xcf\x17 \xa5\x84r{\xc1\xc9\xe4^\xc6&\x93\xadC.<\xcd\xe9tz\xc1`\x14\fz\xadK{\xe8\xad\xf4\xfb'wh\xacf\x03'\xf0&\x9b]\xf3\xe2O\x0e\xa9\x1dv3'\x10\xbd\u0666\x1d=\x9e\xfe\x0f\xbc\xd2\\\x12\xabpMm\x8cO\x8d\xad\x0e\x8d?Lmy\xacd\u054a\u015e\x9c\x05K\a\x02x\xcd\xf8\u07bc%\x03\v\u99d5\xeb\xa28\xa9\x04\x03\xa0 B\xe4mj[-z/\xf1\xbdQ5\xdcF@\xe0\xe0\x1f\x1c\xbc\xc7A\x15\a\x1c\xff\x9f\x02\b\xe4}\x04420|\x81\xe1\xbf0\xd4b\xc0\xb0\x86\xdf\xc2\xe3\x05<L\xe5\xdbx<\b\xd7\x01^\bP\t\xd3\x01\xf3@M\xc5\x13\xad\xa0\x82\u007f\xa8\xe0=\x15T\xa9@%&\ucba4\u021e\xe3[#n\x11\xf1\x02\x11\xa6\x8am\"\x05S\x92\xbeL\x8fw\xe9\x8f\xea\xb1Q\x0f\xc2\x1f5\xf03\r\x1c\u05c0Z\x03\x9a:\xed,-.\xd4\x02\xaf\xb5Q\xb0\"\xda\xc0\x98y\xfe'\xb3\u05b6\x8f\xad\xb1\x93\xfe\x8d\x1e\xd0 cC\t\xc5\xe8\xcehv\u045d\xa4\x9c31\xdfd\x8f\xcb\xcbP_\x9f\x1ad\xb7\x02\xc0\xe8\x0f\xecO\u007f\xf7\xf5\xaf\xbez=\xfd\b\\\xffz\xfa\xb3\xf4__\xc72v\xa4\x87\xe0\xc0\xf8\a\u3fc6\x97\xd2Y^Q\x93\xb6\x92s\xd4Fyhp,OR\xa9\x90\xc1\x98\x8d\x1a\xb6Oxh\xd4\x18%\xa31\xffd\xfe\xeb\xf9\x9f\xe4\x93\xce|0\xe6G\xf3\xe7\xe4\x13\xd1\tH\x99rF\xf4\u03c2\xb9\x9d6\xb7\x01\x19\x152\xdf$+!sZ\xbe:Q\x18\x8569\x0e\fd\xd2\xea\xff8h\xfe\xd7\xef\r\x1e\x17\xf5:ow{X\xc6t\xe46\xf5\\\xd7Y\xd1\xee\xb6%\x82e3*B\xc6Z\xea\xf6\x87\n\x17.\x9c\x1bt\xf5,\xedg)\x14\xee\xda\xde[\xae\x15v\xf3\xa2\xa38Qt\xf0\n\x0fYIuRS\xfe_\xab~\x80\x00Q\xa9\xf5I\x92Y\rJ\x13D\x14)+9\xa0\u0766%\xfb\xa9\xf7\x18\xe5N/\xab8L\xaf\xff\x80*\x1e\u01c0\x15&\xd5,\xea\x92\"7\x877b\x89\x1ea\xd5\x1c\xb0\xb1\xa6\x11a\x1buU\x84\xb2\xe0\x8a\x82\x11\xba\x97\xbf\xc1]V\x8e{\xb03\xad\xc6G\xc7?\xc3\u07add\xda\xe8w.\xbey\xe5\xf9,6\xbf\x1fF\x89D(\x87\xe7\xff\xe1\x0f\u007f\x1a\xb4\x18\xff.\xe9@\x174~\xfeG\t\x8c\xd2\x00\x1by\x17\xe5|\xee\xfa\x82\xff\\\xf8r\x822\xc8>L\xf1\x17Y\xfe4\xf6\xefQ\xc6\xccX\x95%\uf912a\xbd\xcaX\x15\xddg\n\xba\x8d\xb1J\xec\xf9\n\xf8\xccY\xd2T8{\xc7@\u054e\xad[wT\r\xec\x98]\xd8T\xe2\u073ci\xd3f\xa9\xac!\xa8\x87}\x10h]\xdf\x01\x1d+z\x1e\xeaY\x01\xb3;\u05b7\x06`/\xe8\x83\re\xe9\x97Vm\xb1\xea\xac7\xafF\b\xe0\x83\xb4\x15oS\xf0yI\u0087x(\xe3\x13\xfc\x06~\x84\xe7\xf0\xb3\x8c\x0eH\x90\x11r\x8a\xf0\"\xc1n\x84X\x14\xb3\xb9<\x16\x92 \xb3g\xb0\xf6\xed\x13\xac_\xa0,W\x8a\xf7S\u074b\x98\xee\xfa\xfc\xfc\u007f\x88\xe8\u04dc\xbf[\xc9.\x0fx\xb8\x9c\xcf?q]r\xe1?\xba\xc0\xe52\xe4\u007f\x1e\xfcR\xff\xb9!C\x9e\x9a.\xeb.\xcb\u007f\xc9\xean\xa1\x10\xa7\xb2\x14\xa8\xca\xcabk\xa62\x05n6\u0698\xd9\xd8I\xacl$\x95\u765e\x13\xfa\a\x9aR\x8dW,\x00u\xabo\xa6\xdamY\x05\xed\x8a\x1d\xf6*vH\xbfX\x91,\xb1RK\xa4_P,\xb1O\xb1\x04[\xbf\x8a\xdb8Lz\x95gx\xf4\x1e\xf6\xfc\x8eD3\xd8\xf1}\x8dO\x99L\x92,I\x9f\x8f\xff~.\x9b+\x88\xeb\xe7\xe8\x87\xf5\xf7\xe9\x05=\xa2\xe2~\xfa\xb3h$v\x1e\xb2\xabU\x81\xb1gL86\xb0c\xe8!C\xf1\b\xac\xedas\xa8\xba\xa4\u021e[_W\xe3\x1a\xdc\xe3\x89U\xb7DC\xd5\xd1B\xe5\x84\xf3\x9a\xbd\xec\x04\xbeK\xb2\xebyK\xa0\xd8\xf5\xd8Z^\xef\xb2~\xe3Sfmw\xfa.\xd8\xcd\xf5+\u03e97\xbd\x82P\xf69\xf52\xd7A:\xf9v\xca\xc5a\ue001d\xa6\x83\x8cl:\b\xd1\xe7\xd4\x11\x9b \x101\xa2>\xbb\xeaqu\x9a\xaaA\xcbU@\xfe,}Z\xfd\x13K\x90\xae\\-\rZ\xad\xc1\xd2\x1c6\"\xc5O|\xfd>\x9f\x9cX\x98zy\xd13\xa0\x13\x14\x9b\x1d\xa7s\xab!\u051b\b\x99\xc9\f#\xc7iB\xb6p\"\f\xde$\u0494i\x12\x9a74\x9c\xa0qo2\x9a\x8d\x81M<\u6552\xa33\x9a\x93F\xde\xc8\x13I$.\x14g\x10-\x9ay\u0799m\x99\xe0\x92\u03b0Ua2C\x0e\xf9\x02{\xae\xf9\xaa\u01d9'\u04d4\xe4\x86\xf5\xed\xa3\v\xee\\VQ\xb9\xf4\xae\x9e\xd1\xe4\x1d\xa5\x95\x94\xa8\xacse\x89\xca\xdfz\xf1\xcf~\xa3\x9f\xb5\xf3\xb5\xd1{~y\xc7,\xfd\xa1'H\xc0\xa1\xf0\x95\xbf\xf8\xed\xbf\xfe8\xe4\xfc\x1e\xd3c\x1aB\\\x90\xff9*D\xd7'Lz\xd3p\xd0h\xf4\x19\xb1\xe8\xa3\xef.\xe2`\xe5\x92ve\xba\xffY\xa2LP'\x1d\x8e)\xd2\x14\b\xb8\x12ZC\xd2\xe5*\x92\x02\xd7\xeb\xa3y\xdb\xf2\xee\xcb;\x92w2\xef\\\u07a5<1/\x0f\u066fs9\xc5\u024fXP]L\xc0J\x89RP\"\xb2\xa2\xb5B\xa4]\x85\x91)BSf\xc0\xe9\x9eFy\x03\x04+e\x96\xf7\xf8\xc0\xea\xc3\xcd\xcd5\xf7\xcc*\x9b[\x1f\x80\x1b\xd3w8\u00b2\x1b\u007fx1P<\xb3\xd2{\xe6L\u076a\xef\xf0?/\t\xee\xf2D\xdcu\xfd\xcd\xe9?\x8e\xbe\u0578(\x11\x91\x9e:\xa0-\x9a\xb6\xb4\xe5\xec(L[0:\x10C\x18m\x01\x0f\xf9\x90\xbb\x8b\xc6z5\xba-\x114\xdcg\a\xbb\xbd\xf49\x9bQ\xe7\x14\xbc\x01\xa2B\x1b\xcc`6\xd7J\xb5\xc0\xf9\xf3\x9f\x1dA\x80\x98\xcf\xca\x05M\x12\xa1\x1a\u01c8\x0f|:\xc1\xe95\n\x9c\xba\xe80r\x83[\xcf\u02c7_W\u007f\xa2\u01bb\xd4\a\xd5G\xd5\u0127\x8e\xab\x87\xd5D\x8d\x94\aI\xce(S\xfc\xec\x91\xfe3}\x19\xfd\xd99f\x82>z\xf6\xd3S\u047el\xae\x87\xab\x1d\x99\xb5\x91\xd5\x0e\x85=\x13D\x87\x186\x00\xeb\x1fb\x98\xb2e\xd5W-\x8e8\x1e\xf4m_\xb6-\xba\xb6\xbe~M\xe9\xf6kn\xf5\x85\x82\x81m\xa9\xed\xa5k\xe8\xf8\xa7d[j\x9b/xg\xa8iAL^\xd4\\P\u043cH\x8e-h\n\xe1\xb7\xea\xd6D\xb7/\xdb\xee\xcf\xcf\xf7o\xa7\xbf\xba\xee\xf2\xaf\xe6\xfb\xe9\xaedm=\xfd\xad\x82\x82+\u007f\x85&\xb8T\xae\x9d\xd64;\u069bX\\\xe6\xa4\xf8Qg\u007f\xd6\x066\x9b\x8eS\xc1s\x18|\x180\u078f\x00\x89D\xdb\xfb\xa0\x15\xac\x92Q\aw\xea\x80-\x1fK\xe8\x88H\xe1^\xca(\x1a\x05s\xcaB\x90e\x9b\xf1>#.\xb3\xc0\x1b\f\x88\xfa,\xd8h1Z@k\xb6eg\xe9XL\xd0f\x9f\xfd\xef\x12L\xec\r\x94\xe5\xf82{\xd2?V\xdb\u01e6\xe6\xe5\xdaZf?\x16A\x99\x99;\x06\xeb\xd9?\xe5)4\xf6\x8f\x9e\xc12\xf4\x9eLo\xfb$\xfd\x16\x94\xa4\xdfz!\xb3\xfb\xaf\xf4\xceSlV\x8f\x0e\xc8\x1f\x1dM\u007f\x05\x02\xdd\x11\xc4^xR\x0f\x10Qm\"\x84\xd4P\xa6N\xa87\xa8G\xd4\x1c\x16\x9e\xa5g%1!\x8e\x88\xa7D^\x14\xd9\x1a)!\xd3\v\x98\u0110\x89\u324e`\xcav\x05\xd6\x17.~\x96v]\xfc\x1b\xab]7]\xfa;\xe9\x17|h:\xeaE7%f\xf1=\xaa\xae\x19\x81\x82\xf6\x19\xf53\x8a\x8a\xa4K\x018\x188\x1a\xc0\x81%\xa7\x96\xc0\xc9%0c\x06r\xccP\xa9\x94\t<e$\u035e\\\xb9\x80\x04\x15Z\\\xd0\xce\xf78z\u068b8}ug\xa9\x8d\x91\xd2,\xc521\xc6\u061d3\xfd\xff\xbb\xb2\xeb\x00h\xe3\xc8\xda3;\xbb\xaa\xa0U\xaf\xa8!\x90\x04\x02\x16\xb4\x88\x0eZ\xba\xdch6\xb8ba\xc7-\x9c\x1d\xb7\xb8\xc5\xe7\xf8rN\u03a9?\xa9\xbet\xe7z\xba}\x17\xfe\xf4\xc4\\\xb0\xd3\xeb\xf5\x1a\x9b\xbb\xf8\xbf\xde\xfb\x9d-\xfe\x99\x1d!\x04\xd65S\xb4\xc8\u07fe\x9d\xf2\xe6\xed\xdby\xef{\xc2y%Q\x12k\"Fyx\x98\x1c\u3452\xb9\x89i\xe2u\x05\xcc\xf9\xacG\xe9M\u0412\xf3\xe9\x90\xe8\x9f7\xcd\xd0\f\xe9\xd0\r\xce\xf2\x06\xef\xa2A\xf9!\xf0\x81D]\xeb\xcd\u0757m\xb2\xd7'\xf1C`O\xa9\xbd\xa4\xba\xa0sq\xe3\xd6\xfbF\xb6\xd2\xe7\xc6H\xe7p\xad\xcd \xae]\xbc`w_\u027d\x05\U0004d240\xb9\xc4oq\xb6n\x1dp\bA\x1b*\x11\x97J\xe5|p\u05f2\xe6\xf5\x1d\xc5a\xdfM\x05\xa1\xc6zWE\x99\xe0.h\xedY\xd7R=\xd8Q\xa5\x0fn\xeb\xe9\u07be$\xec\xf7=\xc8\xe3\xecM;^\xfa\xee\xf2\xf2*\xaf\xb7\xa5g\xc3\xca\xe2xC\xad\x87\xcf/\xaa\xa8+\fJ\x8d\xf5\x1e\x95\xb7\xbc\x81\u03a9\xc8\xe5\xa1Q\xee\xbb@\v\x1c\x84\x11\x9b\xf7\xa9\x13X?'\x14\x9f\"c*\x81>\xc0*\x00\x8fn\xb3\x1d'\xb9#X\x91\u021a%\xd4\x1f\xd9\x04;\u007f \xa7O\x91MJ+\u0763,\x9e\xb3W*\u0585C\r\r\xa1p\x1d\xdcW\x176\x05\x9c\xfa\x86`\xb8\x8e\xdb]SY\x15\x8bE\xa3\xb1\x9a\xca<G\u0405\x8f\x00@`\x03\xae\xf5\xd0!\xdf'Z\xc1 \x18\x95\u06b93N\x9e/t\xe2\xaf\xe0\xe2IP\r'\xaaa\xf5\xf2\xb6\u0260\xe6\r\vx\xc3\xcb[\xbc\x16\xc1r\xd82f9n\xc1S\xee\xd5{G\xbc;\xbc\x9f\xf0r\xf8}oy\xf7\xeb\x8d\xfd\xaf\x97\x13.\x87@\xf9\xa6\x84\xc30En\x1cS\u0621\xdeI\xdf3\x90\xbb\\V\x16v\u0593p\xd6\xdcC\xca+d-\x94\xe3\xc0\xce72\xe8`\xf3Z\xc9\xefnN\xb6\xdbj\xea\xeb\x1c\xf6\xaaXS`\xd3\xdd\x1b\u015a\xcb\xef\xd9\x10\xbf\xb6\xb1\xa5z\u0745\x97k\xd6\xdd\xf8\xa5\x89-[&\xbet\u3e9a\xec\xe3m\x1bO\xfc\xfc\xba\xeb~~b\xe3\xcc+\xeb.[\xba\u007fQ\xcf\xfe\x81\x882\u03e0>\xa25\xea\x94mW=\xbay\xe3\x97\xf6\xb7\xfb\u0747\x9d\x05\xa9\x97\xe7\t\xb9a},\xb6\xfe\x06|\x9c\x91B_\xe9^Y\a\xd23m\xdck\xc0\x03\xcaA\x8f$\x94C\xfe\x1cp\xeb\u074c[\xe0\x05\xaf\xd0+\x1c\x16N\b\\\xd19\xad\xcd6\xa2\x85\u068a\xf2\x8fx\xde\tC\x1f\x01\u0144\xe9#\xe7\x87 \x8e'\xf8\xf4T\xbd\xcco\xd3c\xdbL\x12[q\f[\x8e\xbc\xc1\u041c\x80l0\x13\x8f%;\x8cr V\x94\x83\xb2\xf0'\x05\u0190P\x17\x88$\xaa\u0777\x8c]\xd6\\W\xb9\xaa\xb4R\xdc\xd3th\xdf\x1bbG\x891ZZ\xd8\x10q \xf7\x805\xe0\xc8w\x8aK\xc4M[9\u059b\xa8w[78\x8bF\xafJ5\xc0zd\xf4D\xdcb\xb9\xa5\xac\xb5\xac\n0`\x00\xecFw\xa0\u05c0\x02\xe4\x83\x11\xc9\xc0\xb0\xf9\xbf\xd0\xf4\xb1#,\xc3jX\x8dB\xab&w\"?\x0e3\xaby\x9e?\u039f\xe0\x91\xe2\x17\xc7\x11D\n\x80\xf2\x95\x1a\r\x87\x10\xcc\xe3T\x10\b\xa2 \xe7\xec\xd0\xd2)\x94ND\\\x8aH4\x1d\xa9\x99\xa2\xc1~\x1b2)a1}\x19\x80\xb1=\xbf\xfe\xf5\x9e\xd4[\xf0\u04f0\xe6\xca_\xfd\xea\xca\u051bL\t|\xb0'\xf5\xf9\xd4\xe7{\xe0}\xae\xd9\u00d9\xba\x05\xc8\r8l)\x8b\x98G!\xb6\x8d\xf0\x18\vob\xe1\x01\x16\x0e\xb1p\x11\v\xebXhd\xa1\x9a\x85,\xfb\x04\xf7\x14\x88g\xf1\xa9\xd2\xe4x\xd9Z\xb3\xcc]\x17\xfe\x86\xdc\x17\u007f\x06\xaf9\x06\x00\x98\x9e\x9e\xa9%`T\x00=\x00\x80\u036c\x1d\x15\xf0\x80\x06\xd0\x03^\x91\x0e}\xde:n=mE\xe3\xb6\xd36\xc6f\x85\x03\x16\x9dMg=c\u0459-\x16\x9dN\r\x1cg\x9c\xea3\xac\x85\x05N\b\x9c\x13\xce\xf7\x9dH9\xc6B'\xebd\xbd\x9d\x93\xa0\x1cN\x94\xc3\xf2\xbe\xc6I\xaf\xce\xfe\x06\x00V\x97\xd5\xe2T\xbd\xe1\xc2`\xde\xe9u\n\xce\xc3\xce1\xe7q'^vr\fg\a\x8e\xe2pN\x97\xd3\x15\x94^\xaf6-|=\xc8\x12k\x9bYw;\xc9P\x122\n\xb9Qe\xad?\x9a$\x84\xdf%w\xb1\xfa\xa3\xfa\x88\x1e|\xf5(\x17\u045f\x86\xf8\x8e5\f\xe9\x06l\x04r\xc4\xe2Zm\u0132\x06\x10\t\x1cb\x15\xfbwk\x92\xf9Ibu\xef\u0495]\xf0vWy\xbd\xb7=f+\xf5k4O\xbd\x9b|\xe0g\x0f?\xf8\x8f_\xfc\u01eb\x11\x81D\xe7\xc2\xc6k*\x17\u0547\xf3\xafX^\xdc]g0\xc0\x91\xd4C\xe8\xd0'S\x93\xff\xc5:\x84\xd3\u007fW\x98Y\x85\xe2\xa1\u007f\x9e\x9b\xc1*\xfe\xf1G6Oa\xbe\x99\xae\u06c3h\x88!\x1c\x01\x93\x1cW.\xf3<\xa6)9^\x02\u034fV\x02\t0\xc0\xf1\xa4\x9e\xf7\xf1\xcc9\xfe\xb7<\xb3\x9d\x87\x80'\u007f\"\x05\xcf\a\x9e\xe4d\xfa\x1a%\xcb\x11m\"\xeb\x95p\xa3\xe7\x11\xd3\xe6\x8f\xd7\xc1\xe8\xe0\xee\xd6\xd6\xddC\xd1\xe8\x10y\x1d\x8c\x1e\xf4Tw\x85\xc3]1\x8f'F^\xab=\xecX\xe6\xbfw\rVU\r\xeej\ruV{<\u055d\xa1pw\xcc\xeb\x8du\xcb\xed\xde\x04@\xbaV\a\x0f\x1a$\xbf\xde\x00y\x95\n\x17\xec\u02030\xbbfG\xfe\x13yYe;\xc8@\xc8$t\x1a{\x99W\xbe\x83\xb0\t\xb3Kx\xa4\x0e\xa1\xfbg\xcbx\xa4\xfe\x8e\u0245\x10T1\v\x99m\xd87\xf7\x00I\xb2\xa8\xa6\x80\xcd\xd7\xeb;\xecc|\x12\xf6H\xddS\x90\xe7\xe5\x84?\x1dI\xa4S\xb9\xb5\xe7\x8d\x1f\xba\xcf\xc3\x1f\xa6\x1f\xa9\xd3O;\x11J#'\u05d6\x19~\xc1y\x04?\x1e\xfa\x99m\x17O\u007fP\x9f\b\xf3m5\xe2pyO\xcdu\x03M\xeb:\x8a\xdd5\xbd\xe2\x9d\xf0ff\u138fZ\x06\xdb\x1b\v[\xa5hpme\xab?\xbe\xba>:4\xb8\xba\xf6\x01\x00\x81\x97\xa9g\xb6\xe0\xf6U\x82uR\x13\x02\xf8\xd9V\xe1\x99\x02\xc02\xa5\x88&\xa3cQ&J\x1a\x1a\n\xe9$\x87/\xa1C\x8e\x8f\xe8*K:\xcf:9\x95\xd3i\f\x06\u0397}h<\xcfk\xcff\xd7U\x98\xa2M'\r'\xf4D\x03~\xd3(\x17\xe1Q\xccqP2\v)\x86\x0f\xe6\x95T`z\xfa;W\xac\b/\xbdz\xa8\xeb`}\xfc\xda\xd8\xfa\x15\x1f\x1bY\xbf~\xcd2s@p5\xae\x13;\xdd\xcd\x1d\x8b\xcb:/\xef\n\xb0?\xe9\x19\xb5\xdbF{\x9a6t\x87\x1d\xde\xeb\n\x83K\x17,l\xdf\xd9+\xf9\x04\x8f\xae\xa4x\xc4V\xec\xe4\v\x9b\x96^\x9aW\xa4\x00\xdc'\xf8\xbc$&\u24bc\xa2wh^\x11\xa9\xfbc!\x14[x\x83U\x10JqZQ|I\u007f\xe0\x00\xfbG\xf7\xe2\xfe\xfeB\x8b\xab\u007f\xc5\xd2\x02@d\u0271\x1e#\xbb\x10\xb8A\xadTH\xa2\x92\x83\xf8>\uf6f9\u04db\xdd\xdd\x05\xcb<N\x17\xc2A\x12\xad\xa5@\xcd\x13\xf78\xcd>\x88\xa6\xb7\x94\xe1\xec6r \x14\xa0\xcf\n\xb3\x99\xf3\x1bF\xb7\x0f\\\xd1^\xf0\xf4\x1d.M\u5b5b\x13\xa3\x01\xc80\xf0\xe9\xa7\xe1\xd1\xd9\r\xe5;\x96.\xab(\r\x86\x03\x83\xa5\xa9\tE\r\u025fI]`7)\xcc\xc0\x84\xdb\xe4g\xef\x01\x1c\xd9\b\xe9\xe3X\x05\xc7\xe5\xc3{\x80Eo\x81 _\x8f\x19\xc8\xc8\b8\x00\x04L>\xc1\xfaM\xd6!\x9d\xb5\x99\xf4\a\x83\"\xe3h\xf8\xd9M\xfb\xdf;\xd0<\x98\xbco[S\xeb\xbe/n`\xc4\xd4\x05\u0141\xbf\x1dE\xa2Q\xdc;q\xf3\x1dg\xf6G\x01\xad\t\xc3$\xe0m\x88\xc4\xe3D\u0269\xb7\u042a0\xec\xbf.\ts>]\x12\x86X\x81\u007fC\xcdf\xbe\x9e\xe3\xf9=\x902\u00fb\x01\x00\x0eP/y\xcd&\x93\xe5\xb0q\f\x87\x1a\x8c\x8a\xfck\x81K\xe14\xdel\x91\u053a\x84\xc5b\xd2\u0702\xb0Q\x13p\xba\x03\xf1\x16p\u007fi\xfd1\x83(\xebd\x962\x12\xef\xb8VTz\x10\xbc\xfb\x96c\xd6r\x9e\xaf\xd2w\xf79+\xe2\u016b\x0e\xd4\x13o 5\xb5n\xab\x02mE(Re\x0f8M\ua4fbU\u0392\x06\u04968\xb3\x10>/\xe7\xfeWK\xfe^\xfda=\xa3'+G\xa7c\xa6\xc0a4\x86\x18\x1f\xaaD\fb~\x98\xaf>\x0f~\x80\x17\xf8;q\u0676L\x91eB\x1f<h\xf1\x16(\x17o9z\x1baH\xe8\x82\u05b5$)\xf7N\x86u45\xd5Y\ra\u00c2\x11j\x87\u06d0\x9e\xb9\x89{M\x8e\u007fV|\xc5y\x8e\xa6\x85\xaa\xf9\x04\xf0\xf3~h>\xa7\xf1\xd9>\xe2&\xdc\x1f\xf1\xd4W\"\x19~\xc4\xe2F\xfeM\xf4\x93\xb9\xa9d\u0276\x8e\xf8hO\xa4d\U00076396\x8f\xf5\x94\xa5\x1a\x16\r\r.Z48\xb4\x88\u0776\xf4\x93+\x05a\xe5'\x97.\xbdfEE\u014ak\x96\xee;p`\xdf\xfe\u077bI{\x96\x81\xdd\xe8X\xda\xf7\x19\x92\x84\xb4\x83\xa3\xfc\x05\xcbh\xf0\x17\u04aau\x808;$9GB\x888<\n\x804\xf8+\xdb\xe7!\x1b\xf7\xb3>\x0f\xa9\xe9\x15M\xbb\xc3S\xf2\xa3b\u0204j!G_\u0431\u051b\xc4\u04415\xa9-\xa9\xb7\x88\xf3\x03c\x8c.\xb5\xb1\a\xae\x81kzR\xeb]\xb3\x87\xc4/\x89\x03\xc0\xe1\x9ck}\x10\x1c\x04@\x1f\x02\x1f0\v\x010(\xc1\u05d8\v\x17\x9f!\x11d\xc4X\xed\x889e\x85cV\x18\xb7B+\x94\f\x10\x18\xa0\x01H\x00\xbf\x0e\xc7\f\xc3\xe4\a\xff\x8a\x818\xfe!2\u02f0\u0307\xa8\xcc_Q\x991Y\xe6\x95H\xc42\u00d2\x9d1\xdb\x19`\x86fx\xd2\x00%\"k\a\x80T\u070c<\"L\x96\xe5\u0172\xde\xe5\xde\xc0\xb2\xf6\xa4\xdb\xf70m\x1f\x8acYMR\b1u\xb8};\xea`_\x1d\xac\x83\xe3\"\xfc\xbc\b\xaf\xc5vB\x84}\"\xac\x14\xa1O\x84\"\xbf\x18\x0e\x1b\xa8\x93F\x84g\xdaJ\xfc\xed\xd4>\xd4\xc1\xae\x95\xb9\xe6\x1d\x92q\x86k\xae57\xf3\xcdP\x85\x19\xe7D\u007f\xf4\xbc+Q\xa0\xb5\x85B\x98q\xae'\x94s \xe0\xe8.f\x9c\xcb\xf7\"\x92\xf3\xf8\xee,\xe3<\xcd-\x9fa\x89\xdat0\x93\x1dD\xf6}\xe6o\xcd1}\xfaP\xeb\f\xe3\xbcv\u0671Ni\x800\xce7\u05f9b\xfd2\xe3\xfc\xf9K\xf7\xed\x8a\x1bV\xf7/\x9ee\x9c\x8b\x81\xdbK\x1b\u0111\x1bWtl\x91\x19\xe7-\xed\x11\x13\x14\xe6\x19\x86\xe9i\xcamV\xee6\x06A\x91<\x86\xed\xd3/\xc1\x01`\x19g,\\\x10o\xa2\xdf?\uecb0\xcab\x18\x89\x01\xfc\x9d\x03\xbf\x17\u0702\xf1&I\xcb\xf8\xf1\t[-\xaeY4\u0205\x9f\x04\xdel\xf9\xd3\xe3\xee\\\xf2c\x19\xfc\x19\xa0H\xcbw\xe3\x13\xa0\xa7,\xa7\xfcH\x06?\n\xfc\x18o\x93\xf2\x11\xe3\u1088\x81\x96\x12z\x069e\xce9l\xfa\x1c\x058\xed=\x04\xaa$\x1fb~\xe3\x84g\x9d\xb0\xcf\t%'\xf49\xa1\x9ex\xd5\u0409\x18\xe0\xb5\xcc\b\u0268\f\xad\xe19\x9d\x02@1$\xf3jL\x98\x1b^\xaa0it\xab\xa0\x01\xea\x11kz\xc4\x04\x8bL\u0566e&\xa4\x87\u041c\aM0\x0f\xffB\x9c\nl\xb6\xb0\x1c\tJ\xf88\xb5)\xa9@I}~R\u04eb\x81\xbc\u6106Q\xe9qB\xbb\x02\xb1\xba$'\x13j\xa6\x04y\xe3Ev\xc0\xc9W\x94D\xf0\b\x93\x96R\xf7\xf1\xbfCGO\x9f6@\xba\x8bD\xb9\xb5(\x003\xfcZB\x82S\f]T\xa5\x8a\xdfz\x9e\x19Co`*\xab\xf5\xe2\u03d9\xe6\u007f\xec\x81wl\x95\xd9\xe1i\xca-|\x95y\x98\x8e\u03e1\x94\x99\xf0\xa4\xf1\xf8\x04\xe51\xbd\n^\x00\x00h\x9f\x86\xbd\xa5Ev\x1f\x19\a\x8a\x939\x84\xf2\u0706\u04fa\xf3\x8c<\xb7\xd8L\x05\xb1\xab\xf6\u02b81\x0f\x82\xf4l\xe5\xc2\xef\x05q:\xb7\u040eOX\x98g\u0320s\u02df\x9c\xfe]\xb6\xfc\x8b\xe3\xe6\\\xf2#\x19\xfc\xe8\xf4\x9f\xa8.0\x90h\x1b\x84y>\b\xe6\xe9B\v\xe1\xa7\xca\xd7(\xa3}H\xfdo\xf65\x1e\x9e\xdf\a\xc2g\xbd1\v\xbfwz\u007fV\x1fF/\xe9\x83\x01\xe3\x1f\xc9\xe0I\x1fx\x8a\x97/\xc0\x98\xf3\xe6\xe1%\x8c\xdf'\xf7\xa1,\u0747\xfc9}\x00\xf3\xfb\x00\x18 \xa4\xb9\xe1z\xe0\x05\xc3R\x83\u04e93\xacVm\xf6\xfb\xfc\xd0^\xb0J\xa7\xd7C\xdd\x06\x9fK\x9f\xb4\xf3\x80D&\xc1vp\x02\x9c\x05\xd3d\x8b\x8d\x10\xa3\xb1\x84\x82\x11\x9d\xd16\xc2d\x18\xfc\x84\x15-\xd2\x04\xee\xa8\x1cB\xa0\xf9S$\xe4G\xd9\xe4\x964\xb5<PLi\xe5D\xd3D\x1f\x10\ue99c\xf24\xc1\xfcnV%\x93\xcba_\xea\xa4L0G\xc5\xccm\x84[~R\xe6\x993GF\b\xc7<\xa5\xfbl\xca\r\x8b\xe8\xfcq:y\xedW\xa5\xd7\xfeM\xe9\xb1\xf2\xe1\xb1\xd2\xf8\x05\u035c\xb1\xa2\xbcGyl\xa3t\xee\xc02j[\u00b2myl\xbc\"\x9c9#\x17~/d\u04b6\xa5\x1a\x9f\xb0\"\\\xf1o\xe4O\x82')^\xbe\x00W\x19\u0389\x8fe\xf0g\xc0!\u069eJ\f'D\x84\xaax\x8e\xf6D2\xf8Q\xf0\xe8\x8c\xed\xaa\x92mW\xb8I3w\xae!\xb6\xb6\xe5\xe8\x87\xecA\xa0\x05G\x9f\x03\n\xccb1\xdb\x12\n\x925`\u01e1\x16\xa0\xc7\u007f\x01\x1f>R\x93#59B\xcfR\x10\"\xa0J\xfc\x86\x94\x0f\x95\x1c\x87\xb4\x10\xf6\x91h\xaaF\xc32\x8c\x0f@\x00|\xa0\x0f\x10\xe2\xccC\xe9-X\xb5\x02<\x05\x1cq\xb2\xc9j\x10\xf17\t\xda\x19\xe4/\xec`\x80\b\xfe\a\xc9/5\xacUC\x9b\x1a*\xb1\xcf\x01\xdfJ\xbdr9l\x86m[R\xa7`|S\xea\xe5\xd4\xe4f\xe6\xeb0~y\xea\x15\u06329u*5\xb1\t6\xa7\xcel&}A\xb8\xff\xe3\x98gy\x018\x01\x99\xf15RC\x89\xb7\xd4\u00faB\xab\xa1C\xabc\r\xec|\u05a5k\xb5aS\xd4[\xe2)e\xcb\v\x93\x0e\xa8\u04f2j\xa7\x95-O\xe6\xa9)\x8d\x8f\xa43\x90\x92\xa6\xb3<L\x03}\x03\u07c1\x95V\xa3\x85\xb2\\I\x90!8[\xa0\xa1\x16\u2d2bt\x9d\x12N\x1f\x824\x82\u0359\u05ec^K\b\xaf/]\xd7s\u00eau\xab\t\x19s\xedg\xda\xfa.<SQ\u0274W\xee\xea&<L4\xba\xe2\xe2\xcb\u00aeN\xc2\xcd\u47bc\xeb\xb2\u0507\xcf\xc8\xfc\xd7\xee\xc3=\xb7m\x80\xa5/\u02d4\xcc\xd2\xe0\xe1\vSG>\xe8A_v\xfb0\x1b\xf3F\b?}aY\x81\a\x134\x89\xcePn\x9d\xaccui\x1dn\xa6\xf6\xc7.\u06df\x89q\x8f]\x9b\u0459\x1c\xf8\xbd\xe0Lz\x8d\x14\xe1\x13\x12v\xcf,:\xa7\xfcIp [\xfe\xc5q_.\xf9\x91\f~\x14\x1c\x9a\xb1?~\u0646\xda\u02f4 \xc7\xfd\xb4V\xbeFS\xbaMU\xb4M\xc4d\xc1\xcb\u053c\x92\u0274)\x9b\xfb\xab\a.\xd0$\xf9m\x98_\xeb>\xee\x86z74h\t\xe3\xb7\xc00\xa2p\x8dh\x15\xf8KI\t\xbf4\\Bn\u007f3,j\xfc\x92\xc5\xf8\x15-bN\xce\xef\xf3'\xe7r~\x91\x8ep~S\x93\xf89!C\xfa\x1d\xbb\x1e\x00(sB\xf6(\xbc`\x11\xd8&%\x94]\x15\xb1n\xc0;\xbc\x0e\xc1\x81\x1cR\xbe)\x91\xac\xd8^\xc1\xf02c\x04\xa9\x1c\x15\x00T8PkQ\xb7a\xf9\x12\xfd\x12\u07d2\x89%H\xean]\xb6\xb8H\x19C\u0586\xben\xd8j\xf1\xf69\xad\x94\xec \a,\xd2\xe9Q\xe4P\x10\xc8\xc6N\x84ld\xd3.\xb0YA\x89\x9c\xb9j,9\xcc$\xacR\x17\x11\xfd>\x12_\x14\x8f\xe8B]\xf5u+\x9a\xfdu\x1bo\x19\\wS\xcc\u065aX\\\\\xd7_m7D\x12u\xf1\xc1\x98\xb5\xa4%\xd1R\xe2oZ*V\xadh\v=\x1d\xdfy\xff\x9a5womb\u007fY\xbfrASm\x8d\xc7\xe2\x0fU\x05\x8b\x13\x03#-\u02ef\xee\x0f\xa5\x93\xd9\x1c\xe5R\xb8\xa8\xb1\xae!\x10\xeeh\xef*\xad\xe9\x8d\xd74\xb4\x97\x95\xb6\x94\x98H\xba\xfe?z\u0613[n\x19,\x0e.\xbe\x92\xcc=\xe5\f)\xfcx\xee;d_\xaa\xfdN@,\x9eh \x16\xef\xfcx\xbd\x98W\x98\x99\xfb\\\xf8\xbd1 [\xd48>\xe1:\xb1>\x83\u0385\x9d\xfc\x11\xc5\x12\xe1b\xa3x)\x96\xfbq\x06{\xe6%\x8am\xc4\u0612\xa6\x859\xb0\xdf\xcd`G?\x04\xd4\xea6\x19\x82\x88\x11\xc4n\x8a&\xf0\xacv\x1c\xcd\xe0O\xcf\xe0\xeb\b\xbe\xb2Y\xcc\xc6\x03D\xf0\n\xf2\xfcP\a\xbaA\x1f\xf8\xb8\xe4\x14\u030b<\t\xb6\xad\r,N\x04\xdd\xcb\az\a\x92\x03\xc7\aP}\x02\xc8\xf1\xfb\nL\xa9\xd2\xe9\xc0P?h\u04f71m\x9e>\xc0\xeaY\x86\xe5\x17y\x171\xcaE\x8b\f\xfe\xa6>\xa1\xac\u068a\xab\t\xf4\xd9\xcc\x06=\x903\x00\xa3\xf2o\u00b5\xa6\x95\xc1)\xd9J\x9f\xa9/\x82\xff\x93\x06\xc1\xe6\x13\xad\xac$\xf8:\x9f\x98B\xe9\vtO\xd1*\xce\u0430`\x9a\xae\xb2v.\xff\xea\xc8\x17#\xe2\x177\xaf\xbbwk\xfd\xc5\x11\xee\x8e;\xaa\x06{\x16\x16\x87\x16\xf5\x0eV\xdd\xf8fK\xe1\xe2\xe4\x95\v\xbb\x0f\xae\xaa~i]o\x86\xa1\x85\xae\xbb\xe2\xb0\x16~\xdbY\xbb\f\x8as9Z\x83\u00c3\xc3\xf3\xe9-\xbbv\xd7\f6z1\x9fk`\xcd\xd0,y\x8b\xb9,Mz\x99\x9e&y\xb7\x84\xfb\x84\xe7\xa3+\ud7f6Q\xffT\b\xfa\xb8\xfc\x8c\u007fJy=\xb2\xfe$\xb2u3,\xeb\xe6s\xd8;\xe0x\x19\xfc\xcf\xf0{\a\x00\xf5\x0e\xf0\t{\xc3\x15\x19t.\xec\xe4\x87\x14K\x84\xa3\xca\xf0\xa5XY\xdf(v\xf4{ }\x97'\xfa\x03\xc2M2:\xa3o\xd3X\x14\xdc,\xcb~%\xed\x93\x0e\x02\xd2r\xc8\x1a\x88\u037ew\\\xc3\xce\xf1I\x9f\x04\x80i\xcb\xc2\uf76e\x04rk\xa0\x1e\x9fp%\xab\x99\xebcN\xbf\x84\xf1\x83Y\xf8\xc9\xd4\v\x14/_\x00\xe4\xb1\xf3\xf0\xbf\xc6\xf8b\xb9\xfd\x14?J\xf0\xf4\x9e\x90\x8f\xbb\v\x01k\xbf\xc4'\xddNr\xce\x15\x01\x10\x02\xf5\xe0J\xa9\xcb\x18N\x80\x80\xcf\xea`\v\n\xed\x05\x85\x85\x05v\xa4\x01\xcb\x1b\xa5\xc6\xf7\x1b\xcf5\"\xbe\x11*\xa28\t\xbd\xc1\xe7\bXY\x9b\xdf\xef.\xef\xe3\x8dxO\xe4\x14\xcfT\xf2\xd0\xc6\xdbx7\xacM'\xa7\u04f8\xb9A\x9c\xa9W>\x93\xab\xfe\u007f\U0010123c\x85=\xd6y;7\xe4>\x8f\x99\xca\\\x88\xfc\xae\xf5@\x92z@k\xe4\af\xb9z4\x9b}\u02c9\xc3\xdd\xf1\xbd\x0f_\xbe\xe9\u0788\u02bb\u007f\xd54X\xf8\xdd\xf0\xa0\xd0\xd5zU\xe3\x8f\x17N\xb6o\xef-{\xb1\xb0\xeb\x8aEK\xb6u\xf9\xfd\xdd\xdb\x16\xe3<\xf7\xe6\xff\xf9\xc1\u077dm\x87\x9f\u06f7\xef\u066b[\x1b\x9b\u063d\x13\xfd\xf7\xec:RP\xeb<\xe8K\x94\u0778sO\xeb\xfd/\xfc\xf0d\xdd\xc7\x06\xa2\x15+\x8e\f.>\xb4\xaa\xea\xb5\xf4\x9c\xb1F\xd9^\xf5S{\xf57:\x03~<\x03La\xa5\xd66W\u007f\xd8ry\xbe\x06\xa8\x1e\u007fG\xd6c\x9f\xac\xc7\xdf\x1e\x0f\xfa\xe6\xf9\xa1\xf3\xf1{\xfb\xa8n\x96\xe1\x13z|\xc1\f:\x17v\xf2\x1fY\xb2\xff>\x1e\xce)[n7\u015f\xf9Q\u059a\xba8^R\x9b\x13\xff\xdd\f~\x14\xf7\xd3\xf14bJ\xb0\xea\xe33\xfe6\ueade\xe7\xe3\"\xb0\t\xfc\x95e\xd8\xc7\xe5\u0727\b\x18\x91,\x95\xe5\xb0\xf0Q\xbb]\xf7\xe8\x10\u0684\x980\xaaC\f\x92\x13\x16\xc38\xd9\x0f\xb0\xa1'\xf4n\x88U\xc4\xed\x86\xea'\x80\x89\xf0\x81FL'M\x13\xa6\xf7MJ\xa5\xc9\x04\x9e\x80O\xa5\xe3)Xg\x04\x12R!\x89\xber\xfd\u00e9\xe1t\xb5\xc3\u007fS\xff\x12WB\xbcx\xca\xe8-\xb1\xdbJ}F\xa3\xaf\xd4f/\xf1\x1a\xe7\xff\x8d\x03\x1a\xc7R\xbf\x0e\b\x9e\xfc|\x8f\x10\xf0\v^\x9d\xce+0\u07df\xf7\x06\xed\xe3\xee\xe9qV`o\x03NP\x04\u02b1\xef\xdb\x18\xf2\x86\xb1\xef[\x9c\xb0\u066d\x16\xa5J\xa3V\xe5\x83\xe5\x82$\xbc/\x9c\x13\x10/@\x85+\x91?T\x11\xf6\x84\xbcl\xa4\xb0O\xa9\xb1[X\xcej\xd4G\xfaTdY\xbc:\x15\u007f5\xcb\xf9];\xd7\xf7\x95\xfb@sk\xc8j\u0224\xdep3\x9e\xaf\x82\xab\xa6\x8eo\r+\x905ph}\u01d1\xbex\x17!u\xc4wV\xe1\xe3\x96\u038b\xc0d\x85\xb7\xb8\x17\x95c\x8d\xef\b\xa5vy\x13\xe53\x1c\x8f\u0636\x85G\x12\x94\xe6\xe1.\u063a\xe0\x9a\x05\x1f|j\xd9\x11\x919j0\xbe\xf7\xc1\xf1\xcb.\x1e4\xe8\xbfNuA\xce)\x97um\x05\xd5\xe3\xcf\xc9V\xcd%[\xb5\xfb\xc6\xfd\xae<GZwr\xe3\xf7\x8e\xd05\x12\xc2',w\xf93\xe8\\\xd8I\x15\xc5\x12\xe1 \xe0\xba\x14+\xeb$\u014e2D'\x19X\x84\x95\x18\xb7\xe4\x1f\xe3.\x81\xe0\xb3}\\\x9a[+\xcb_C\u06e2\xa3\xf2\x05,\u007fs\xa0\x04d\xec=\xe5\xb6\xc8\xfcb\x9f\\?\xc6+$4\xcbE\xbd\bC>\xaf\u0145c\x1dQ7p\xb9\xca\xfa,\xbc\xd5\xdf\a8\xfd\x1cFl4\xc3n\x81s\xeb\x1eg\x11]\f\xca\xe2\xb9\xf4\x16\xb8!\x9b\u04326\x8b\xeb\xf2\xb4\nz\xb3i#\xe8\xe9lJK\x16\xd9E\x05R5w\x1a\xe61\\2\xfd\x96\u01ca\xf6{\xf4\xcbi\xcbO\x8c\t\xd4\x06jA\u05bdk\x86\xff\xc5.\xbc\x84\xff\xc5\xe7\xe2\u007fa\x1c\x86C\x06\u01da\xeeU\xf8\x81\x19\x14K\x06^\u01f2`B\xc5\xea>\x01xUR\u0168H\xf2\xa5\xf3\xed(\x14\x9co\xcf\x14\xe7\b\xc85u\x94\x81\x18\x89A\x11f\xfb\xbd\a\u012d\xd55\xa3\xe2\x01gG{#\xe6M4\xb6w:\xd8\xef\x16\xae\xab\xad]W\xe8\x92\xe3Q\x94\xe6\xce\xc0m\xf8ZU\x8a\xa3r,@\x92\xca\xcdG\u020eH/H\x02\x168\x8fT\x92T\u041bIF`\x9c\xef\xe5\x93\xf8\x0e4\xcd+\x15\xbc\xfbf\x9eKr\f\x87[2\xf5\rR\x05\x8d\xbc\x0e\xe7\x88\x0e(\xab\x83\x99dET\x15h^V\x15\x1dh\xf4\xf9\x1a\a\xa2\x95\xcbZ\x02{\xe2U\xb8\xc2c]U\x9c\xfb\x8a\xd8_\xe7v\xd7\xf5\x8ab/~\xad\xed\xad\x8e55\xc5\xf0Oz,>\xe0~\f\\Xs\x02\xbcM\xb016\xa0\xf6\xa9\x19\xa5\xda\u028d\xe9$\x9c\x9f\xaa\x93p\x1e\xb7Ng\x1aS\xf3\x00\x12\xa2\u007f\x94\xc4E\"S\"\xc9\xe5y[\xaeGH\u077d\x00\xd5 \xb2\xe1,\xea\x10\x93\n\xf7.\xee\xf2\x95W\xea\xb6p\xfe\xd8\u008a\xd2\xfe\u015d\xee\xf2\n\xfer\xf2\x17\xfb\xfd@\x04\x8ff\xd3\xfa\xce\xe2@i\xa0\xba\xa5i]g0\xf3y\a\xe8I\xf9\xf3\x0e\xdc\xcf\x01\x86T\x93Q\xe4%\x18\x86\x03\xe09\xf8\x12\x88\xd3\xe8w$\xfd\xb9\ah\r\xfd\xdc\x03z\x9e\xf2?>O9{\x9e\r}\x15\xf6\xc9\xf5^\x8a%[RGj@%\x95\u06d5\xa7\x94\xef)9e\xde\xdd0\xef~\x05\x02q\x1c\r\x9b\xc2jA\x8cw(\xfd\xf9#\xc5:]\xa8\xa2\xdaq\x03\xefvZU\xe8\xab\u0599\"\xbe\x1f\x8f\u558b\x85\xf10\t\xb7\xc3S\xf0=\xc8A\xc5\xfd\x80\xca\x1d\x9e\x12\x88\\\x98\xf9@\x886\x9d\\-\xf8\x06\x1d\xa9\x16\xcc=m\xad=p\u8aba\xa6k\xaf%\x82\xb3?{\"\xf6\x1c\u0411\xb8\x92\u019e\x98\x11}X\x16\x8d\xafE\xb2\xd1\xf5\x96\x84\x12_\xe5a\xf9*\x11Q\xc4W\x8a\xfc\xa7\x1f<\xc1\x90\xf63\x1f\xc8\xedw\x80\xf5R\xe2\x94\v\xdeJjd%]\xdb]\xc8\u011b\x93\xe6\xed\xe6\xc3\xe6S\xe6\xf7\xccg\xcdJ\xb3\xd9q\xb7.\xefn\x00\xfb \xad\x953\x01\u07c7J8w,\x1dy\xf7\x9b\xc8P\xcaI`\xc3rsp\xb4\x02\x1fQn\xf7\u0330\xfag\x0e\xe0\x17\xb3\a\xf8\xe2\xb3\xfft\xb8\xb3\x0e\xff]\xbb\x81\xb9\xcf<b\xdea>i\x9e0\xbfO\xdb\xcd\ub4ba\xed\xb8\x8e\xcf{:N\x97\x19Fy\x8e\xce\xca]P\x9a\x14\xf7\xe7\u02d5\x86H\xbbi\xb3\x87\xd3\xed\u039e6\u007f\xee\xf9c\x12\xfft6\xb3\x0ei\xadj\xe6\xef\xf2\xbc:\xc0\xd5R\xff\xfb\xaes\xae\u07fa\xd0\xe7]\xe3\xae\xd3.\x84\xbb\xc0\xf8\\\x95.)\x9d6\xa3\xc8\xf4\x84\xf4CA\xfaq\xab\xee\x9c\xee\xb7:D\xba\xc3du\x84tC\x91\xd6\bI\xa3\xb7'h\u007f\x1eN\xf7'\x92\xeeP\xbaG\u0279\x9fM\xe2\u03e5+\xd9}\x9a\xaf9s\x94\b\x82c\xf0<\xb3\r\xfd\x1e\x98@\x97T$X\x92\x96\xed8\xf3\xee=\xcbo,\xd3\x16\xa5\xde\x02\x93\x9a\xed\x9a\xe38\x04qV\xf3\x1b\x8dB\xf3~:\x1d8\x8f\x84\xa0\xbd<\xe4\xf5\x1c$\x16\xf0\xcc0n&\xfe=\x9c#\x14}\xac(>\x14\xad\x1a\x92\x8a\x8b\xa5\xa1\xaa\xe8P\xbc\x88\xf9e\xf7\x86xAA|Cw\u05c6\xb8\xc7\x13\u07d0\xe6t\xec\x86\x17\xe4\xf8g\u04d7e\xa6\x86\xe4U\x13NF\\u\\uBuV\xf5\x1b\u0574J\x91\xc9\xf7B\x90\x83@\x10d\xd6IV~\x17\xbe\xfa\xbct\xae\xec$\xaey\u05c9Ka\xf0\x8b\xb3\xe87h\x1a\xc95\x0f\x184\xe7Z,\xa1\x89\u4e948L\xe6\"\x13N\x85\x17p\xf4\xf4W\xbf\x9a\x17=%\xd7J=\x04\x00\xb3E\xae=\xe3\x9e\xf3\x99+\xd0\b\x90\u0323\xc8\xfe\u0215-\x17\xbe\xf9\x00\x8a\xa4\v\xcf0 \x8fY\u020c\xe1\xfa\xc2\x1a`\xc13S\xaaf\xa6\xb4J\x84lI\xdb\x18\xb6\xfe$2n\x99\xe2 {^\xcdk\xbdZA\x8bTZ-\u00dfW\xfe\x80\xf9a\xba\x8ai\xbaF\x03N~\xc1\u007f\x884\xcd<\x80\x13\xe9\u04dfSA\xaa\x0f`M\x84\xcc\u0621\xb1\xd4\r\xf0\xc0-\x87R\u007fD\b;\u007fv\xf5}H31\xb1\x9di\xbf\xf8\xced\xe9eU\xda\xe2\xd20O>{\xe8\xff\x01|@\x8d\xa4\x00x\x01c`d`\x00\xe1\x94=\u036a\xf1\xfc6_\x19\xe49\x18@\xe0\x84\xb8\xff70\x1d\xd3\x16\xf9o\xc1?\x11\xf6u\xec\xc5@.\a\x03\x13H\x14\x009l\v\xa1\x00x\x01c`d``/\xfe'\xc2\xc0\xc0\xc1\xf0o\xc1\xbfE\xec\xeb\x80\"\xa8\xe02\x00\x87\x94\x06]\x00x\x01m\x91\x03\f\x1eA\x14\x84\xe7\xf6\xbd\xbb\xda\nj\u06f6\xed6\xa8m\xb7Am#\xa8m\xdbf\xf4\a5\xc2\xdan\x83\x1a\xd7y?\xeaM\xbe\xccz\xf7\xcd$E\xac\x99\xba\x8c\xa4\x00\x16H\x05L\U000cb80c\xf6\u0158`9z\xfb\xab1\u023b\x84i\xae/Z\x93jJ%\xbd\x1dP\xc3-\xe0\\>,p_\x91\x91s\xdd\xc9~\u0495\xb4&Y\xc8\x142\x8c\xb4'\xfd\r\xdbOj\xd8\x1d\t\xa4/\xf2\x05\xaf1Ho\x01\xfa\x11\x11\xbd\x86q\xfe(j%D\xe45\"\xfe4\x8eW\"\xe2\x0e\xf3\xbd\"aC]\x1f\x9b\x0f\xdes\xed\x06y\x8bq\xba\x92\xfa\x9az\x94\xe7\n\xa0/\xc9\xe8/\xc6Q\x9d\x03$I\xcf\xffu\x05\xb4\x02i\xc9;\x06a#\xff\x9c\x85ZFk\xa3\x904\x0e\xbf\xeajo\x96\xd6@g\u074b\xddr\x90\u007f\xdeK\x1ab\x98[\x8fl\x9a\x0f\xf9\xf40v\xbb\xf4X\xeb\u0487'\xe5c\xb4\xbf;I\x11\xec\xb6y]m\xfb\xa9<#\xa5x~%\xda\U000efe78\xb6Qn\x00\xfeG\xbe\x0f\xe4\x91gH.3\xf8\xfe\r\xf3\xd1{F5\x9f{'\xbcg\xff$\xa9K\u0190l\xb6G\x1e`\x14\xffV&\u060a\x9en3\xea\u02a3\xb8\xff\xf4\xde\xe6\x14\xe1g\x19\x14\xdd\u07db\xeb\xa5H\x8eh-\xe7\xb0\u06ef\x86a\u6df7\x11y8_\xc3]@m\x9eo\xeb?B\rR\x94\xe4\x10\xbeg\xbe\xff\x8f\xe0J\xf8\u0772\xb0\x1c~\xc3r\xa8NZ\x93t\xa4&\xb3*\x91\xc8\xe1o\xf8\xafy\xa6\x96\xc5\xefD\xb3`fz\x05\xbb\xcd\xf7\xff\x11lG\xe7h\x16\r\xff\x84\x19\xdc6\xff\xa9\xa7\xc8k\xfa?$\x91\xc3?\xd0\x17\xea\b\xcb\xe2w,\x8bh\xd6T\xbb\x8b\x9e92(\xaa@\xeb\xa4\xc4\xeb\x8d,\x86\x03\xbd{B%2\t5\xc4a\xb1k\x8e\u0586\x97\xfc\xfbZz\x9b\xf2\a1\r\xcf=\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00F\x00x\x01\x00\x01\xba\x02J\x03\x02\x03&\x03V\x03\x86\x03\xbc\x03\xea\x04 \x048\x04r\x04\x92\x04\xe4\x05\x1e\x05t\x05\xf2\x06F\x06\xae\a\"\aJ\a\xf4\bf\b\xbe\t\"\t^\t\xa0\t\xdc\nP\v\x1a\v\x86\v\xfe\f\\\f\x9c\f\xd6\r$\r\x82\r\xb8\r\xfc\x0e6\x0e\x84\x0e\xa4\x0f\x18\x0fj\x0f\xc4\x10\x12\x10|\x10\xee\x11X\x11\x9a\x11\xd8\x12,\x12\xe2\x13B\x13\x94\x13\xc8\x13\xee\x14\x0e\x142\x14P\x14h\x14\x8e\x15\x02\x15d\x15\xaa\x16\n\x16h\x16\xcc\x17\xa0\x17\xe2\x18\x14\x18`\x18\xb0\x18\xca\x19<\x19z\x19\xc4\x1a&\x1a\x88\x1a\xce\x1b>\x1b\x94\x1b\xd6\x1c.\x1c\xdc\x1dn\x1d\xd8\x1e&\x1e\x80\x1e\xa4\x1f\x00\x1fT\x1fT\x1f\x9c \x00 v!\x0e!\x82!\xb2\"l\"\xb0#Z#\xc4$\x18$F$N%\x1e%6%\x92%\xce&\x1e&\x94&\xba'\x04'B'|'\xc2'\xfa(B(\x92(\xbc(\xe2)\x12)\x88)\xa0)\xb8)\xd0)\xe8*\x02*(*\x92*\xa6*\xbe*\xd6*\xee+\b+ +8+P+j+\xce+\xe6+\xfe,\x16,.,F,`,\xc6-H-`-x-\x90-\xaa-\xc2.\f.\xa8.\xc0.\xd6.\xec/\x02/\x1a/2/\xe2/\xf60\x0e0$0:0R0j0\x820\x9a0\xb41D1Z1r1\x881\xa01\xb81\xd22D2\xbe2\xd62\xec3\x023\x1c323\x983\xb03\xca4\x004P4\x984\xb44\xd04\xfc5(5\\5\xb86\x146~6\xc26\xf67,7J7\x94\x00\x01\x00\x00\x00\xd3\x00i\x00\x05\x00S\x00\x04\x00\x02\x00\x10\x00/\x00Z\x00\x00\x02\x1f\x00\xe5\x00\x03\x00\x01x\x01m\x8e\x83n\x03P\x18\x85\xbf\xd9^\x8c!\x9c\x15.\x9aW\xdbQm\xfb\x19\xfa\xd4=5\xf3\xfb \xf7\x02[\x84Xce}\x87\x15\xcea\xb8\xafr\xa8k\xb0\xafq\xcb\xf5p_\x9f\xd2lp\x8fe\xb8orJ{\xb8\x1f\xe2\xa1\xc3\x0fUJd\x88s\x89\x9b\bEj\xb8H\x90\xa2A^w\x95O!1!Ei\x12\xba/yP-\xf3\xf9\xfa|MhI\xf7%/<\xf2\xac\xb8$JCh^j\xa1\x8a\xb7\x89\u007f\xecNSW\x94y\xe7I\xd1\xea\u01e3\xb8\xb2*&6\xa1\xab$WJl\x9e\xcc\xf0O5\xf5\x9a\x10\vF\xbe\xf9\u0146[\xfd\x81W\xf4v\x17Y\xd5)\x8cx\x01l\xc1\x83\x01\x03A\x00\x00\xb0\xf4k\u06f6\x8d\x91n\xe1\x0e\xd4.\xf0\x89\b\xf8\x05A\x9c/\x12\"I)i\x19Y9y\x05E%e\x15U5u\rM-m\x1d]=}\x03C#c\x13S3s\vK+k\x1b[;{\aG'g\x17W7w\x0fO/o\x9f\u007fA\xf0\xb0\x05\x05\x00\x00\x00p2?fo\u0676\xed\xb5\xbd\x9b\xf5\xb2]\x97l\u06f6\xf92\xcf\xf9\xe5s3\x9ah\xaa\x99\xe6Zh\xa9\x95\xd6\xdah\xab\x9d\xf6:\u8a13\u03ba\u8a9b\xeez\u8a57\xde\xfa\u8adf\xfe\x06\x18h\x90\xc1\x86\x18j\x98\xe1F\x18i\x94\xd1\xc6\x18k\x9c\xfd\xb6\x99m\x8e\v\xd6\xfah\xae\xa5\x16\xd9`\x8f\xed5jZX\xa3\x96YV\xf9\xe5\xb7%\u0599\xef\x9a\x0f~\xdah\xaf\xbf\xfe\xf8g\xab\x03\xee\xb8\u5820\x90\xe5\xc2\ue278\xed\xaeG\xee{\xe0\xa1O\xa2\x9ez\xec\x89Cb~X\xe1\x85g\x9e\x8b\xfb\xe2\x9b\x05\x92\x12R2\u04b26\xcb)\xc8+*\xa9(\xab\x1a\xef\xb3\t&\x99h\xb2\xa9\xa68m\x8b\u9999a\xa6\xaf\xbe;\xeb\xa5W\xde{\xed\xa8cN:\xe5\xba\xe3N\xb8a\x9e\x8b.9_\xa3v\xbdJ6\x11\b\xb4\xeb\xd8 W\x8d\x14K\xa1\\1\xd28\x9a\xab\x14K\x95|\xa4\x98\xc8\x15\xff\x03@<hK\x00\x00\x00x\x01\x1cO\x03\x8c\x1c]\x1c\x9f\xdf{\xbbs\xdfW\xbd=\xfb^\x19\xd5v\xe78\xbb\xcdi\xcd$g[Qm\xbb=+\xaeg\xb6\u0728\x8a\xd9X\u01e8\xb6\xfd\x0e\u007f\x1b\xa9\xa6\xff\u007fP\xc1\xcf|\x1f\xf8N\xf6|F\xe1'\x84\u010b\xd4\u016fg\x99\u0531\xd5#\xaeQ1\xecZ1\x82\x11P\xd70\xfd\xc5W<A\u00e3\xf7\x8f\u021f{q|\xc5}\x14\xde\xdf{\x9f\x84\u0123\xd4\r\xf7Y\xa4\xfa<\b\xae-\xd7\x14\x8d\xe6k\x05Z\x83FS\xb5\xc9\xe8u[\x1c\xe7\xbd\x05\xbdd\xbc\atq7x7\xcev\x0fv\x93\x96\xee\x03\xdd\xc4\x18\x12\xafR\xe3\xbb\xff\x9f\xa9j\x1d\x0f;\b]\xdc\x0e\u078e\x81v\xad\x9d\xecl\xc7t\xf6P\xfbdv\xf9y\xe5|\xfey\x9az~\x16S\x97\x9f\xc3\xc09\x1c9\x1c\xc7SwZw\x12jj\x9d\u06fa\xa2\x95\x92V|j\u014c\x06\x88\x06\\i@G\x03\xda\x1a\x0e5\x90\xec\x06\u0328\x87\xa8\u01d5zt\xd4#\xbb\x1er\x02\xe2\\\U00051087\x19\x04\x97\xa9\xe0J\x05x\xc5\xf2\n\xa5BT\x18R\u02ed\xe5\x83\xe5z\xb9A)\x03+\xd3\u0288q\xb0t\xbc\x94\u0429'\xf3K\xe5\x19jQ\xc1b^X`\xe6\x05\xd6\xf9\xfc{\x00o\x02p\x06\x0e\x06\xc8\xf6\x006\a\xf0\u04cf\xf7~\xd4\xf8\x91\xed\xc7f?\xe4\xc8\xd5\x11.#\xa8\u02f0\x9a\xba8\x05\xa3\n\xd5(e\x1e\xeeY\xee\xa1S3o\xbb#\xa2\u0550\x18\xbf\xed\x0e\x9b\xa9N\xf9\xcei\xffQj\x9dS\x9e\xa9\u06ad\x8b\xb9b\u0377\x16X\xe9/\v\xde[p\u01022\v\xdc\x16l\xb2\xe0\x97\x19\xef\xcd8b\xc6f3\xe4\xa4D\xc1cVG\xbb\xc2\xc1\\\xa6\xd5\xccE \xb9`\x96\\\xbf\u007f-\xe6\xbf\x12#8c\xe0\xec)#\x8c\tF\xe4\x06i\x8f\xa4I\xef%\x83I\xc2\xde\x18\x18\x11\xc2\u0660\u04f1xqv(L\u0633u\xd9\x1a\xd0qT_\u4612\xa96\xbf.\x1f\xd5%\x97?\xe0\r\x02\xa7}\x87N\x9d\x92\u0493\xb3\xf5U\x0e\xaf^\x98\xec\xcb\xd6K'\x8d\xd4)c\xef\xa4aJ\x0e\xc6H\u9f89.\u0183\x00` \x06\x81\x89\x8bz\xc0\xd3#\xe2\xa8\xff\xee\x99=\x00\x18d\xd6imn+\xd4\xdb\xcd\x14\xf9\xff\xb6]\u07b8\x90z\xa8a\xb3\x14I\x1bmL6 \x899z\x19Z%\xd2lUkCbS\u0725\xa7\xb1\x00\xb9h\xf6\xdd\x00")
+
+func third_partySwaggerUiFontsDroidSansV6LatinRegularWoffBytes() ([]byte, error) {
+	return _third_partySwaggerUiFontsDroidSansV6LatinRegularWoff, nil
+}
+
+func third_partySwaggerUiFontsDroidSansV6LatinRegularWoff() (*asset, error) {
+	bytes, err := third_partySwaggerUiFontsDroidSansV6LatinRegularWoffBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/fonts/droid-sans-v6-latin-regular.woff", size: 24868, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiFontsDroidSansV6LatinRegularWoff2 = []byte("wOF2\x00\x01\x00\x00\x00\x00,(\x00\x0e\x00\x00\x00\x00Z\xd0\x00\x00+\xd2\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x16\x1b\xa5@\x1c\f\x06`\x00\x81\f\x11\f\n\xfax\xe76\x016\x02$\x03\x86L\v\x83(\x00\x04 \x05\x828\a\x83g\x1btNU\aj\xd88\xc0\xe0\x8d\xdb,\x8a\xd2H\xaaQ\x940\u028a\xec\xff/\t\x9c\x8c\x1d|\xe3Z&\x98\xa4\xe2(\x14E'\x12\x83 \x9b(\n\a\x93\x13;k\xef\xa9o,X(\x96ga\v\xcf\xd7\u06d0\xfb\x18\xea\xbff\x86(\x1a\x04\x04\xe4\xfa-\xd03\xed\x83\r-A\x0fI\x92&\x0fP\u007fV\xaf\xf4\x93N\xb7gV\xf2\td\x16\xceZW@':\xd3\v\xf9J\xa6\x86\a\xb7\xf5\u03d9\x19nt\xa3L\x05'\xd3\r\xb2d\n\x02\x82\xe0\x04\a*\x8ac\xe5Js\xa68\xca5\xd3\xcc\xcc\u0534\xa1\xd45\u05b8k\xdcUw\xbb1\xaf\xfe\xdfe\xee\u76fc\xa4\xbf\xa3\xa5\u033b29c\u0188\xc9c\xee\xeeJg\xdeJ2\xed\n^\t\x17M\x8a.Uw\xba\xd3\u06cfP\x85-o#M:\xff|\x0f@\x150\xfc\xfc\xba\xfa\xb3\aU3\xa6\u99d2\\\"\xa0\x01\x17\xe0\xc3\x11%\\\x01\xfcC\xbd\\\xf8\nMjT>m\nTz\xe0\xcd\n<\xc0\xca\x027\x03\xf7\xf5l\xf8\a\x80\x95\xfb\xbdf\u00d7\xe4\xc1~`TUU\x1d\xdfa\xb6\x06+hO\x15\xb9}\x05\x1cF\xd4\xf6\xc1\xb6\xe9\xb0|\x94\x11\r\x87:\u0550Ns\x95\xac'\x84aiY\xa3\xb6Qwg9>\xc9zGv\u0210|\x80\u481d\xa7\x84m\x17d(!K\xb1\x03\xcfv\x1e\xfdE\xa7\xcc\x1b\xd3\xc6\xc3\u07ae\xdd\a\x82\xb5\u00f2\x94\a\xfa\xb9R\xbf\xa2\xae\x90_V\xaep-K\xbb\x93\xcbd&\xf3/\x13}@\xf2\x17\x00r\xd9\xc3l\xc9\x01+4\xe6\xa6\nU\x15\x81\xaa0\xae\xb6\xc2\x16\xfe\xcd\xff\xad\x9c\x14X\xb1\xf6]:\xc1\xb2\xae_&\xebP\xad\xe9\xdf\xff\f1\xe4\xa6\x1e\xb2\x98\x95Y\xd4a\xe7.c\xc3\xc80i\xa1G\x88\xf8U\x05\x8c8\x10\xe2-\xfcv\x87\xe7\xdb\xd61\xbf@&\x87\xef[Q\x04\xacd\xa8\u07fc\xf9\xe1\xb0\x03\xcb\xee\x9b\xdc\x1a+\x8bB8\x16>\x88\xca:(\x94\xb4j\x9dW\x119\xf9\xa3w_\xac\x8e\xcfFU\xf1_I6\x16\x9c\x96\u04eb\xb1\u007feI\xee\xcfo\xf2\xa7\u01ab\xe1\xb4\xe8\xed\xc8\xf6\x89\xb1\xe0\u03ab\t0~\xa0t\u3b61\u03dd\xcaO\xdc\xd6p\xc0[#'>t\xe4\x9d\xfc\xa2\xd6\xd89\u0539\xd2y5\xbc\xad\xf3\xc1\u062e1\x82\x1e96\xaa\x1a\xfdmtV\u067f\x8d\x05\xbb\xd1\xfa\xb1\u0391\xff\x1a\x971f&^-\u4037\xff0\x19G\x8f8\xcc=\x12\xef\x109\x95\xedp\xca\xc1\x92\xfc\x11\x9fs\x99rg\x11\x1f0\xd8\u0104\x1d\af\xd0\xfcX\xc2\xd9Pk\x81\x89o\x12,\x04\x04\x11\x85\xad04\x8e\xd88<\xf0\b\xc1\x88\xed\xd1F\x90\x90ARP\xc2H\x92\x0e\xabY\xbb`\x06\xfd\xc8\x06\x8d\xa2\x197\x8de\xd6~|\x87\x1d\xa5p\xcci)\xce\xda\xd2\x19.\xb9\"\xd3uw\xad@\xe8\xeb\xee8ad\"\\;R\x8e(8\xd1d\xa81f\xe2,\x17\xbc$\x88\x8cRNP\xc2IJ\u0260RI\u0377\x05\xad\xdal\xd3\xde\xdb\xf1\xb1\x1d\xce\x0e\xbd\xfaz\xa7\xc9,\xec>\x8b\x96,\xdbo\xcd:\xa3#\x8e:\x16N\xc39\xbb\xb53\xdf\xf5GD>;l\xc2\x13A\x88\xbc\xd1\u0270\x83\x182l\u0128\xf10\x91ISv\xceM\xcfK3w\xad\t\xbe\xf5GD~_\xd8\to\xc4F\x06\x99$I\x92\\oyu\xe2\u0184\xa5@\xb4\f)\x18\xd5,\xb8\xb6.\xec\xd6a\u0456G\xaco\x1d\x19\xb5\x05\xea\xefknK[\xdb\xd6mmo\xc7n\xef\x8e\xf6\xb6\x0f\x15\xc9\x02\x95\xb5z!p\xec\xc6am$\x1ct\"@E\x9a\xe8\xfdt8\x9a\"\x02\x00\"\xe8gO\x83\xba\x8a\xea\x86O\u0631\x90m\x9f\xe0\x1b\u007fDd\x06\x83\x86\f\x1b1j\xbc\xbcZ\xca\x1bdl\u02ee\xc6\xee\x8d\xca\u0671g\xf7\xe6@\x85.k\xc1\xf8\xbdR#\xd7\xf8\xea\xacuQ6\xb2w\x88&\"8_\xc0\x82\x8c5\xd9\xeer\xfb\u04ac<2_;\xb4a\xa0\u0607#\\\xbc^\xc1H\xae\xf4\xe3d'\xe1\u028f\xe2&\x1e\xd5M\xdad\x93\"UZh>-Z\xb5\u0666=\u03fee\xffI\xb3g\xb7\x9b\xb3\u01fc\xbd\x16\xec\xb3h\u0272\xfd\xbd\x87\xef\xdaYgt\xc4Q\xc7\xc2\xf1{\xc2I\xa7\xc2\xe9=\xfb\xeaK\xf7\xf2\\%s\x83\x9fd\x17\a\xba\xa3\x99\xbe\x1d\x1a\x9fWp\xb9rEZ\xb2\xbdA\xddN\xae$R\x95\x9bH\x88\u049d\xafHbT\x82QUU\xed>\xa2/g\xddns\xf6\x98\xb7\xb7\x95\n\xde\xdb\xe1(\u1acf\xe7DN\xe6T\x8f\xca\xf9\u0272\x96#\xc7\xc6\xed\u137d+\xb1\xc3\x01\x17\xefk\x04\x95TZY\x12*\x8f\xa2\x19O\x98\xc6w+U\u8fbd\xf3\xcf\xccfw\xe6\xb2'\xf3\u065b\x85\xec\xcbb\x96\xb2\x9c\xfd9\u0735\xc9\u01ed\u01d8#9\x9ac9\xde\x13=iN\xa5\xabr\xdcP7\xb8\x12\x9d\xcf)\xb7\xbc\u0332\xac\xba[\xa2\x0f[\xe8\xbe.v\xa9\xcb\xddO\x86$Y\xabf]\x88l\xc1\xed8\xf1\u03bf\x88T\u9f6a\xa2\xa26\xeb\xb5\u0628\x88\x88lLk\x01\x8a\x88\x88\x88\x88\x88\xa8\x88\x88\x88\xaa\x96Ei\xd6\nq\xf3\u01a9$P\x930\x06uZ3gA\x8b\xb6\xd9\"\n<9\x93\xa7\x9b\xb0^s\u007f\xe1\xab!x\x13\xec\x8a\u05ac\xdda\xae{\x9e\x9e\xef^Q\xd4\x16%\x89J\xec\x9c\xd6\x15\x9em\xf95\xa4\xabJ&\xcdV\x12,\xa8\xd4\x16\xb5u)\xbf.F+\x91u]\x10\xcc\xe9&\x82\xd4\xc1X\x8e\xb3m\x8e\x1d6oE\xa4J\rhA\x02U\x14>eHJrL\xad\xbd\vX)O?\x9d\xb3\xb1(\xc3\xf9\x11z\xf0A\xd2I]\xeffbW\xf1\xb5\xed\xfb\xda\x01}\\~\xae=}:\xb7?\x1d\xff\xfeAh\xe2\u0283Ty};\x1b\u05ce\x92^\r\xa2\x8e\x85\xe9\x1b\u0632\xd5\xf6(\x95}^\x85{YC\xbb\xa8\x16\u027b\xe6X\xb5\"T\x9dFi \x94\xab\xccgCO\x19\u0590\xd8}\x83\x85\x18\xf3\x04Yk\xb4}\x93A\xff\xedW\x1b\xfb\xb7\x9f\x1e\x8d\xc4[\x1a\x93\x16\x06}\x91\rf\v\xd4\xe5N\x86\t>C\x18\x86\x8d\xd2JO\xa3L1'6\xaej\x1e\x84\xa0\xb2i(\xba\xd8\u05fb\xfdA\xbfx\xf3zE\xdd\xeb\xb3\xdfO\x04\\\xd3qg:j\x1d\xbc\u007f\xfe\xab\x16\x16\xaarUM\xfc\xffiP\xeb\xe2~\x13\u05a9my\xe5(\xaa\xc6~S\x16?\xfe\xda\xec2\u0748E\xf2\xeck\x82\xff\xccV\xdaR\xd3q\xb2\xf8\xb5\xf6\xda\x1b\xaf\xb4K\xa5\x83\xf7\"\xaf\xc9\x1aN\xfd\a.^\xe2\x83\x12l\x93\x95r\x92\x92\xa5\xbb\xb0\xaf\\\u0112e\xfb\xadYgt\xc4Q\xc72\xaa\x13\xd7j\x0f\xdd\xf2f<\xff\x0e\x88V\xa7W\xd5\xc3h\u04a4_\u007f\u073b\r\u007f\xf5;\r\xf9{W\xd9\xe1\xebHy\xf1\xd0\xcbB\xbb\\SH\xbb\xa3\xf3\x9f\xff\xac\xf4\x96\x9c\xf0\t\x88\xc3M\x93\xda9\xc6\xfc\x15\xd3\x1f7\x04\xf0\xdd\x01\xb0$\xc0J\x1b%\xb0\xc0\xbe\xcf^\x90m\xe93\x98\xa9\xb5U\x1e\xde,\bLn\x04\u021b\x15#`A\xa6\x1c\xa7\x84\x99=\x86\xf1\xef2w\x12`n\xf6\xcct\x9c\xe1\x9b\t!^\x8aO\xe2\x8f\vB\xe1\x1epo8\x12\x1e\tg\u007f\xfb\x96\\\xcf\xf8\x83\x13\xdc\r\xee\xb5.\xe2\xc8\xfam=W\xfb\xfe\xafo{\xf5\xff\x97/\xf4\x17\a^\xac\xbeX~1\xfc\xa2\a\xbd%\x1c\x1f\x15\xb1\xa6\xf2z\xde\x05\bw\x00\xbe\x06&w\xde\x18}k=o\x15\xbeK\xc8\x0e'\x92B\xbe\x11\x96\xc6\xf3\xec\xb8J\xb1\u017d<\ud298\xc6\xdd\"\xb2\xe5a\x81\x94#/\x0f\xb1\x03%V\x02W\xd1\x18\x89~R-q\xae\u010b\xf5\xa08\x9f\xf7\xd6\xfc\xc1\xdb\\\xf2\xdf,\u0307\x8b\xd4\x1d\xc4\bZ#k\r\u067a\x98j| \b\xf4qt\u03b3i\xa0*\xae \xb3\xc4\xc3:#\xcb\xf97\xa4\u075ef]\x17[\xab\xc6H\x03\xac\xc4\xc7\u007f\xdf\xc6v\x88\xf3\x18\xc4\xefE\x18u\xb7}\x81\xe7d\x18\xb2\x88w\u06ce;q\xde\xc2\x1a\xa4y\x1e\x17\xe3q9r\xfd\x9f\xf7\xd2Eb\xca8t(\xe3\xb2\x1c\xb7\x9e\xc3^u\x96\x99_c;\a\x97\x9b9[\xc0\xaf\xb3\xa4e\x9f\xa3l\x8cv\xcd\xfe:h\vF\x974$\xbb\x99b\xae{\xbd\x05\xca,=\te\xf8\x8b\xc8n]\x1d\xdf~\u03fbI\x89\x06\xa5\x0f\u0103d\xd0\x18@\x15\xa2V,Q1\xd1Cv\x9b\u0300*Z\xf1\x1b\xad\xb4\x82\xdab*\xd6xZ\x8eCG@\x1e,\xf4\a\xa7?\x85\x92\xa8^\xcd\xe2\x18|\x0e\"\x90\x97iL5\xac\xe3P\x1c\xafC\xe0dm\x06$\x1eJ*/I3^l\xcfH\xa2\x05\xc9d\xbc\xa9\xd5X\r\xa0\xd1|\x16<F\xac\xba\u007f+a\x06%\x03\xf1i\x12\xd6V\xf8+\x81<\u007f\x11\xf9\xa2l\xf5\xe8\xbbS\x1f\n\xe2\x823e\xf9\xba\xd8\xc7\u0534\\\x03\x0f\x1e\x11f\xd7\"p)\x89\aH\xb5,\xcd\xf31\xa5\nh\xb1\x86\xe8mFu\x8d\x0e\xf3\x16j\x13\x1c\xf4\xfc\x99n\xa1\xf8|x\x8f\xb3\x11|\xabs\xc1\xf9\xa8\xd1\xcbzy\xd8\x18\xd4U\xca|\xa8\n\r\xba>\xdf\xf9\u0528\x9ad8\x022\xb0\xf1\xeb\b0\xa6\x11w\xf35,)\x80#\x94\x1c#\xfa\xa6\xfbN\x8d\u07d8\x9e\xc8Y\xbe\xd6Wi\xc5Z\x8d\x91\xea\x10D\xb0\xa7\"CH*\x98!\u02b4\\\xb5\x92_\x01\xb9o\x17\x8e\xeb\xdeOJ\u051evE\xa4I\xa4:\x87\xeb\\\x14\x914\xa0zT\x80\x80\x1c\xa2\xb6\xf0#s4\xd0t\x81)M\xb6\u0275\x19\x8e*\xcau{\x1eSG\xa6:q7|'g\x16b\xbc\xd6/U\xb5\x9e\xb0}\xa6\u0644\x90\x95\xd1t\xe7\x040\xea\xc0r\x16B\u02f5E\"\x16A\x164EF\xbf\xb2\xe4r\xc1\x17\xd5\u008ej\xb8@G\xee\xcc0_~\x06\xf1Z\xac\x8f\u96c5\x97\x99\x14\xbeI\xe3\xd6\x00\xb2\x05$4Z\xd59i\xb2\x8ex\xf6\f\x17\u02a1e^\x94\xa0\x053\xbf\xee\v\xd5\xd4\xf5\xf6{\xc8\x1a\x9f{\xd6\x02\x8b\xedR\xd6\f<\xd7K)\xff\t\x91\xf0\xe6\n>\xaa}\u03df^g\xb7\xd0r\r\xa7\x02X\xc8\u0320\x14 9\x85|\\\x8e\x95\xd7S\x16\xf6\xac\xaf\xad\x89\xc6#\xd3\xdd\xe2;\xbcQ\xd7\xd2#pL\x9f $\xfe\x89\x8f4o|\xe6dz\xea\xe4\xb3\xca\u033b!2E\x1d\xf9>M\xa3\xec\x1e\b(\xdd*v\x00\x97)\xa4\u007f2O\x86\u0119`Y\x0e\u03c02\xec\xd91\x11\x01\xf0\xc3r\x01S\x02\xff\xe0C\xbai_\x04\xa8ZY\xea\xfeKw\xeb<a;\x9e\xcb\xd2s\x90\xdfY\xceR\x8eu\u0380\xfa\x0f\xdc\f\xa5\xdd\xc1\u26db\n\x13\xf2\x1e-\\\v\x99,/E\x9e\v:\xa7\x80\xd5\xe4VAX&8\xd8>\x14T\x8f\x8fUu`\xbeD\x93u'\xfd\xa6\x9e\xf5z\u00a1\x84/t\x14\xc1\nv\"z\x86Q\xe9Y\xf2\u01b0\xc8\xd8O\xbd\x10tK_\xb5>\xd2w\xa4\x8d\xe2{\u07fc\u0201\x12\x82(dK\u0176\xe5\xf4)\f3)\xf1z\\'\f6\xfc\x1a\x03\xb1;f\xce\u048e\x1d*\xe1\xcd\\\bL+D\xe8\xf0\xc8\xda+X\xa0\x904D\xa3a\xfa\xfcZd*\xd8\x06_@*\x9dz9\x1b\xa5\xa1Q+\xc3T\xc4\x12E\x88\xe0\x17P\xddc\x14\xa5\xcc\x1b\x06?\x1a\x8c0F\xf9c\xa33\u00d3P8\xc7<8\x01\xac\xab\u0486\x9d\x1d\xd4\xdeIm\xff\xe4*Z\x98*\x955}\xda\xc7i\xf7\xc3fGX\xff\x88#,\x05\xc4\bNd\xd7\xd2\x06\x04\x1eQ\x0580\xfa\u05de\r\x9b\xa8]\xb8\xcaW\xb8\x1d\xf6\xc7\xc0t\nY\xf3s\xeft\xf9\x1c\x12>rY\xde{5\xca\xefk\x181\xe4\x0e\xf4\xe7\xa8\x00\x1a:g\x81\x936bj\x15\xa3\x9c\xca^_\x9b\b\\]\x92Y\xdc\n\x9eI\"\xbeU\xd1\xce\xde\xf1C)(B\xde+\x98\x8f\xc0\xad7\xb5*)\x81\xb9\x89X\xf7(\b\xe1/\x03q\x10\x9bpLc\x06A_X\xdad2\xb6\x93>\x04`T\x82\xecW\xe0\r\xb3:\xe7\x9c\xf3k\xd17n\x02\x97W\x84g\xed\xd84\x8brS`yY1V\v\xba5\u040a:B\x19\x1e\xd7e}>w@z\xea\xcd.\x04\x88\x83BC\xd22Ir@^\x98\xa3|R\xc32/nD\x97\x11\xab#\xe5d9\xecI`\xd9!\x86\ae\xe3\x93@>\xd9\u029an\xa5\xa6vl\x91FJI\xa1\xf3\xaad\xea-\xbfrr\x14\xf0I\xf98\x15 _\x93\xa7\x04\xb2\x1a\x04\xe5\xba\n\xa6\r\u7ea6z\xc6\x0e\x84\xd8`A\r\xe2\xfd\x14\x95\xc4\xcfA\xb7\xfc\xb4w\x1a\xf9\xad\x8e\x94\x14\xa1\x99\x1c\xf5M\f\xb9\x1cs;\x9e\xac\x9cJJfX\x94\xd3\x06\x93l\xa5\x97\xb0\x95\u00e9F\x1bp\x03:\u031a\xeb\xb2\xeb*]`\xd00\xe2w\xefuA\u041a\x84\x8dA2\xc6tU\xe0\xb3\x17\xb2R\x10|\xb9\xb2N\x89\xaac\u1ad8E\x13\xacTA-\x15\xfd\x9a\xbe\xdd\xc3\xc3\xde\xd9Q\xeb\x99\xe1\x19\u022d\xc2I_\xa8 \x16\xfbT\x16\x80\x83p\xd3\t\x1a\xe9\x9d\xc7\xd5\x18\xbd\x875\xf9\xe5\xa2@\xfb\xae\t\xdb\xe0%*_\xdf\xd4Y\u06c4N\xee\x91\x10\xf2.~\xb7\xb2\xca\xf0\u51ca\x18\u0748\xc0\xe8-+$\xcc\x00E\u0582\xd4\x0eWXN\x81\xd7|l\x9d\x80\xb4\x1e!\b\xac\xf1\x89.}W\xb31\v\xe6\x89=>V\xc2\x0fX\x89+\u0675\x92\x89\x9am\u02bd\xbc\u0508\a\x88\xc9k}\x8a\x99\x99\xd7B\xb3\xb4>\n\xff\xad\xa9\xafv4hW\u029ax\xbd\x01\x1d\xfc\xca\x17X\xb7\xb65\xc2\xe9c\xa9\a\xec\x85\xd7T\n:\x02\u9c29\xa9\x84\x1b\x94\x0e\xb6\x18\v\xbbt\x10s\x1fZo \xd5: R\xb7Tz\x89X.\x06EMj#\x9a\xa8-\\\x9fi\x83\x036P\a1\xa5\xd1x\xbeF\x9c\xf0\xc5KE \xf4\xbc\xb9\x12\xd0 ^K#9\xc0\x14F\x03n\x8bZ,V+\x92~\x9f\x0e\x85\xf4;X%\x1a:~e\xb1\xa9\x84U\x89;~\xee\xdbi^\xec\x9c{U\xe07 u\xf3P!\xe6\u0497\x97\xa8\xb4\xe5\\\x92w\x03g\xc6U\x9d;\n\xadk\xe9\xe2j\xc6\xef\xd0X\xf1\x9e\u007fq\xf5lX\xa7\xba\xd2\x00\xe3}\f\x89k\xd1\x05\xc7E=a\u8d6dAX)[\x1a\xdfVg\v\xcd\n\xa8JV+\xea\x1d\xf0\x89\xfbB\x17\xf1,\xeb+&\xa3\x81\x19\xea\xc2\u015c\xcd;p\xe2\x8d?B\x04g\xe2\xdbJ\xcfU\x88\xa3\xbc\x8a\xe6}\xc9&\xf0E\x95-\xe8'\xd3n\xf68q\xaf\xba\xa3pU\x0e\xe9p\f\xc4\x1f\\\x06\xe5Zj\xe0\x14\xc9k\xddL\xb2\xa8\xf9\x12?\x1fAC\t\x8c\x9e\xb8\x13s#\u0581\n)\x94\xf5\x0f\x0eLan\u028b\x90\xb1\xadP\x9e{\xe3\x98\xee\xdam\x9fu\xa1\xb1\xe0g\x9b\f%\xc4\xd5\u0376k\x92+\x99#\x15XY\xa9\xe4\xa8\xda\xfaF\xfd\xfb\x05\xbf\xa5q\xaf\xd3\rx\x93*\xe4us\u075b\xf0\xef(\u0372\r\x0fd\xa5\xa3\xb0\x80\xf4\x16\xd9\xef\xf8BA/D\\\x93E[\xd3\x0e\x91\xfd\x16\xadf\xc9I!Sj\x1bg\x02-\x1d\xf8\xa3oC\x90\xa1\xc1\xf1&\xd6Ztsk\xd0\xd4,[\x9a\x14K\x94<\x81(\xc7S\xcbM\u1aba\x18#\xe5\xcd\xdbr\xdf\u007f\xb9z\xc3|\u0736\t\xda\xec\x18\u0166\xdb\x1b\u007f=\x05\xbd\x13@\xeb\x8d\xff}\x94\xe2\tQ\xddv+|\xc0!=\xfa\xbc\xc6\x10{\x8a\xadB\x8d5\x14\xe1\xd0u\x1bn\xae\x94\xfb@S\xe2\xa6\xc3\xcc\xd7t\xdf\x0e\xc9\x1f\xfa\xfc\xaak\x1ce\x93\xba\xf5\vZu w\xce>\xdb\xd8\xc6S\xe0\x8b\x92\xa6\xbb+\xbb\xaeZ\xae\xcf]pJ\x97\xb7\r]N\x002d\u02bd`\xa4;\xcfz\x8cM\x9ds\xae\x8dD\u039b=\t\xc1\xff\x9by\xd5\u03135dc\x95\x84-@\x14\xc6[\xddu\x0f\x16\x84\x00G\xcd\x18\xe0\x9a\xf1*2\x01\xffq\x87\xdf\u0508XE,\x83\xae`\xd5xY%k\xb8p\xa7\x84\u0139\xb0b%\xb4{\xe2\xc7\xf6E.\x13\x16\xdccXh\xe9\x1e\xa5\x90\xffWy\ufcbc\xe7\x84\u7887\xe7a{\x0f\x9ak\x97j\x06\xcb\xe72\x95\xa93:\xd0\xce]\x05\x85\xb5\xdb\xd0I\x16\xf5\u0484!\x15jp\xb9\xdeGPy\xfcT\x8d\x19\xd9\xed\xb9\x9d\x05\u05d7l\xff\xcc\xd3\xe3\x9d=\xd9\x17Cvx\xef\xe1\xf9\u0701\f\xa0{\x8cX\xbb\xf2\x81\b\"\xca:\x03\xd4\xf2z\x1a\xd7\xcd@\x92.\r$,\xa1\xbc\x93^\u0452\xa9\x01F\xe7:\x1a\x02\xa4\xab\x03\x8c\xc1$\xac\xf6\xfe\x8cY\x1a\bR\x1e*\x86\x8b\x02\u053eS\x1cBijBkh\u00a6?:\u007f\"j\xad\xd4\x0e\t\xee\x1f\x96\xed\x12\xe1j\xf7l\xfb\x90C*X3C!\xc7\x15\nX\xf8\xa2dY#Yl\xb5\xd6y \xcb|\x01\xc7\xf4f\xf4Vwa\xf9\x16\xf3J\xefm\x8cdYP\xfe*\x17\x11\xba\x1c\x8bAT\xa6\xda$g\xbc\x9dE[500\xa0Te'S\x01\xbb9\xd3=\x9c9\u0264\x807)\xe1\xcc^\x9a\u04e3\x96\xf8\x95e\xb4x~1MX\x89Y\xd2\xeb\x91\xfbx\x15%T\xb1P\x11\xe3*|\xf7-\xad\xef\xe1\xec\x96L\xf2\x11\x89\x8b\xfd\x91\x8b\x84\x80\x10\xecm\x91\x14\xfe%\u065b\xf5\x13\u05cd;\x89\x17\x8d\xc0#\xbb\aiG\x87\xd3IL\U000ac0ba\xd53\x16\x87\xee~\xcdp\xf3O\xccRYUH#3\\\x12\xfc\xb8\x94\xaf\xcd\xc3\xf8xZ(\xd7S\x1e\x1e\x8aLf\xd0\u0568\xe6\xf7b\xbf\x9a\xb8\xac\"\x05\a\xf7kT\\`\xa2gf\x84\x90\xb09Mf\xf0W%4\xfb'\xcbB6\v\xe9\x04}B\xaa^|X]\xbe\xbc\x84`y\x88v\x1e\xb5e`\x8b\xc8\x19ty\x1e\x14\xfd\xf3\xde%\x88\x9aS\x80\xaf\xf3\x10\xeb\xe6\xc9e9\u0443>\xb9\u03c0\x14_\x8f\xfa\xc4\xff\xad\xe4\x9e(u\xb9\xebL\xef\xcd\xcfU\xe8\u05dc\x9fu\xf7\xd9i\x8b\xa2\xa4\x92\x9b\xfc\x17\xa8\xf7\xc0\x05\xbf\xa5\xa7\n^\xa4g\x83(i\x91\x9d\xa6\xbb\xcf\xfd\x19\xf5\xba\xea\xf3\x8e\x9b\xddg\x96E\xa9%\xf7\x04\xbf\xa1>\x01\xdc6\xa8\u007fGw\x91\xfb\x99\x1a\xcf\u03f1\a\u056b\xda)\xed\x11\xf5\xc7\xd8\u035e^g\xb6\x15\xf9w\x80\xbf\xb6\xb5\f\xb7\xb4\r\xb7\x1d~m\x9b\x86\x81\xee\xed\x1f\x0f}k\x82\ub235\xed\x9do\xbcZ<\x9a\x9d\xb7T\x00\u9745\x0f\v\xa0\xbf\bB\t\x06W\x1a\x91\x16\xc6\xc3Hg#\xa07\xfft\x90\xe8Zr\xf6\xa0v\xeb\xe6\x15m\xd9\xd9p\u05c3\xbfw\xbf\xe8\xcc\x01mC\xd5jv\xf9\x99\b\xd77\a\x87a\xcf\x19\x83\xf9\x02\x91\xa8\x80\xcf\x1e\xf0~12\xec\xfd<R\v\xf8\xfc\f\xe7\xf3\x19\x03\xb0\xe7\xe0\xf2\x81\xbe\x00\x90a\xaa1U\x99\x98\x8c\xed}\xc2\x18\xa8V\xd76\xf8\x0f\x83\x0f\xbd\x93i[\x04\x92\xca6\xd9\u0580\u01b8(D\xd2;\x85\x0fE=\x1a\u01ce\xd2n.O\xa1\xe9\x82*=\x18\x9aqJAvdo\x8a\x82<\x96:\xd88$\x90\xb8\xf9[\x1d\x04\xd1P\r?\xa8J\xa6,\x0f\xe7l\xb2<\xe0|d\xadOC\x9fn)\xbf\x1a\xd3Yx\x06!\x0f\\L\f\xbaFHKm\xf3K\xe4c\vXl\xb2&\x83\xd6\rKj\x1bi\x93\xd6\xfb\xc9\xf9\x01Z*\x19%e\x84\xa7\xc0\xc2\vf\x99|J\u0296\xf4TJ!v\x8b+G?\xcb\u007f \x9a\xb0V\xc0\xfa\xc8{\xc8;\xc0\xdb=\x8d+\xff\xe1\u011d\x87m\xd9\u19b5f\x15\xe6Z\x93\x8dY\xf4\u01a9\xd5q5@:5e-\x866\x14p\xa7ue\xac\xf5\xb6\xfa\v\xccFR\xe6\xc6dG)\xccl\xd9R\x85\xcap\u0344\xf8\xc7\u05e1\x15\xa2\xa0J\xe9\x8e\xd5\xe1\x05\xcf\xdf\xfe\xec`%\x85\x87\xae\x1e\x9a\x87\xfa\xce~\u0273\x01%%:\xe8m\xf2\xa9\x94\xdd=\xd5\x17\xd9mNw\u007f\x9b7\x9f\bPn\nH\xee\xf0\xcf\x121\vp\xcdN\x03\xa6\xf1\x10\xd2va`\xba{\x94z,\xb2\xa04r.\xbf\x8c\xba^\u07b0\x9b\x95\x93\xbd\"\xda:\xcd\xff\xf8\x84\x13\x9d\x89\xe5\xca|\x1b\x94\x1cx\x11C\x94\x89c\xb2\x8a\x82E\x02\u007f5\x9e\x85n\xe5\xe9\n\x99\xc0\x1dE\xb1\xff4\xbf\u0707\\\xc7\x00\x94\xe2\xa6|0\xa0D\xc9hQ\xb1\xfc\nb\x13\xd5\uce9dE\xc2\xc4tr%?\x959X\x9d\xbb\x10\x96S\xb4H\xa9\u020e\xeeK\x15\x06V\t\u0579\xfc\t[\x05\x8f\x96\x84\xd63\x95\xcc\xe6R\xe5`\x00\xa4\"\x99\xe2\xa3b\xd1r\x91<N>\x92KG\xa5\x84\x93}\x13x\\m\u033b\x9f\ua8f6\x8e;d\xc9\xf3\xb7\xe8\xb4\x11H\xe9\xf3D\xa2\xdf\x179\x89\xc6@%\x84j\xebu\x80\xce\xe2\xe8\xa0w\xc8'S\xe6z\xaaT\x9d\xfa`\xdd|2\xf0\xbd\xb6\xefO\xd3\xce\xf8?4\xdflC\xaa\x17\x06\xa9\u055cB3\x965\xcc\xf5\xd3\xee\xd7}b\xfaq\x13h\xec\xc2S\x91_\xc8\b\xe3\xe8}~d\xfb\x9f<=\xde\u0693\xfd0\xa4nhR*\x1c\xa3\xfd\x1b\xa4\xeat\xf8\xbb\x88\xb3\v9R\xffy\xe6Y\xc13\x06\xb0\u0312\x0fM\x0e\xadj\x8e\x0fO\x0e\x03\xed\xf6\xe7\x8c\xe7\x053#`\xf4G\xe0\x02p\x9b\xc2D\u0626\xf8\xc63\xe2\xdc\xff\xc5b\xfa\xb3\xa1b\n\x1e&\xee\x90{\x87'\f\x91b\x11\xb4^\t\xeexdF\xda 1W\x1d\u05a9dy\xe4Q\x92\xe2\x13\u04a3\x19\xcct\x1bF\xa0\xe3\xb1\xe0(\xfc\xbb\x9d\xe7\xf8\x94\xe6\xb8\x05]\x12\xae\x11r5\xd8\xc8 \x1e\x8c\x00\xa7\xcb\u0321\x14\x06\a\xaf\xf2\xa4\x886\x87I\xb3\xfd{\x12\xb5\x91{\x8bj\xa6X\x99AI\x1b\xa46l\xfb\\\x97i\vk{+3\n\x94\xe5\xba\xe2\x1a\x1c\x1b\x1d\x9c\xeb\xda%\u07ae\xf8qd\u43b8n\x9fI\xd1\u02a5$\xfb\xd9\x11\xf1\xcb\xd1\xe9_\xa4\x03\xd4\xcd6E\xaeY\xde3=\n\xcc\x0f\x01\u0347\u0774\xe7\xcei\xdd\x0e\x9f\xa8d?y\x1b\xda~v\xd2\"\xfb\xd4\t\x9d-\xed`@[\xf6fE\x98(\x90 s/3c\xdb\xfc\xefH\x1c\xc4_\x90\x1dAK\xf3\xac\x02>\xd3\x17\x10\xbb.\x9c@\f\x9dXD\xec91\xaa\x1b\xd8+5\xf3t\xa07\x1490\xbcL%\xbd{\x01\xa4\u04b8\xa3\xf1\x9cos\"\xa3;\x97\xe6[\xc0\x97\xeaC\xd9V\xd6\xecM\u0541IbRUb6}\xb2V\xbf\x1aQ\xfc\xfb\xa6\u0742\xcf\xf2RXl\xa4\xb7*\xaaz,w\xfe\xb9\xce\xdeZ\xb5\u064f\xc7\xf5\u0266\x86\xc3\xd3\x04\xcc:t* \f\xf9\x15\xec\x97\u050e0\x1f\x1bz\"\x9fT\x0e\xad\x8a6'M#E.\xb3Ez\x16\xc9m4\x96Qs\xef\v&/\n\x9d\xf7\xcd'\xae\xab\xd3\xc2\xc5\u007f\x17\x8e\xe9\xcf\a\x88q\xa2\x89\xf7\x03A \xfe\xf9\x97\xae\xdae\xfd\x98U\xda]E\xc0\xe2\xe1+\xc7\xfe\x99\xb2\xb8\x96\xbe\xe9\xc2C\xfd\x8c\a\xf5\x86#\xcc\u02abU\xb3V\x9b\x16q\xea\u03c9\xa8\u007f\xceQ/\xb8\u03baZQ5=\xfe\xf3\xb9f\xeez\x9b+\xc0\u007fk\xfe\xdb\xeb3\u015e\x95\x8eM\x1b\x85\xd7\u007f\u031b<\xa7pYYNw^?g\x9dwo\xf1\xf5\x00%\x8e\xbb\v/\x83)]Rm\x82O9.i\x18a<64\x87\xfeP5qR\xb1-\x90g\xfeCwp-\x00<||q|\x91\xa1\xea\xe3y\xe3y\xc7@\xf6T\xce\x12vt\x10s\xde\xe3\x01^\u7444\x90c7\xb9\x89\xac\x83\x16\x138\x9e\xc5(\xd9h\xdb\xf2\x04\xb0\xb8\xe5\xd0\u0231\xbc\xec~<\x98}\xf7\x9c\xdbY\xca\xc3o\xe5i\xf5\xde\xf3\u013b\x1b\xb6\xb8\xfc+>`1\xb1\xde<@\u0373\x0e\xac\u02a6\x89\xb7\xbey\xe7Z\xf9\u02fdug\xba_X\xb0t\xffn\x01:c\x8f\xab\xc8fm\u02daq\"\xaf\xed\xf9\xdb\x00H\xbe\x02?,\xfb\xf9q+\x8b-\x920\xd1s\xcfZ\xee\xb3U\xdf\x0f\xbc\xb0\xb6\xc1t\xf3\xc4\x1f7\xedrd\xb6.\xd8x\xc0W\x80\xd2\xf1\xa7}\x12\xe7\xe9\x8bo\n&v\xbf\xb3\xf0\xee\xb9,.\n\xa1S\xe7\xdf\xe7\xef\x9ex\x95?}A\x02e~X2\x90\x9e\xe4\x8f\xceI\xca\xca\xc4Fm\xc2\x13C'\xe1\xb1nx\xf7\xef.\xed\x91\x14\f\x93\x1e\x03\x16\xd9:%to}\u3b78\xd1\xe1\x88\xc5w9\u007f\xdb\xd9\xf0z}\xd4\xf4\xc1\u0466\xb4N\x9fdNP\x89t\xfb\ue395\x19^\u07c3Z\xf0?\xa7\xaf\xf5\xb4\xa4b\xfc\xd3:\xb6'EU\xf7\xe4\xf0\x96/\x12\x1bL\x9a\x1c\xb9\xdb\x1bSRy\xbe\xfa\xb3\xad\xff\u007f\xf3\xae\x12\xdf$I\u0365f\xf5l\u007f\x9a\x9e\xf2\xdb\xd4\\r=R\xc2F\xe7\xc4\xf2\xb0Y\xb2\x98\x06/\xe5\f\x88\xeek\xcf`\x8fn\xd5\x1d\t-/>\x83\xa4#\x0e\xf9$z\xab]\xb5\xb6\u0119\u046a\x92P\xafx\x1e\xb3\x86\x96\x8aV!\x9be\xf2\\l\x8b\\\x15c(O\x9f!dT\x9d\f\xe4#\x99\x13t\xaf9\u007fUm[\x89&\x02&\x8be\x96E&\xc0\x93Q\x1d\xc2\x14up=(\xf5\xe5\u03f0\xe3\xec\xdc\u05f9]@\xf4\xf0\xe8Z\x19\xe3|\xeb\x8e+\u048e\xc6\xf3q\xad=\xacK\xb5+\u01cf\xae.\x9f^M\xdaJ\x91f\xf8\xb5\x03\xc9Q\x10\xad0^\xf2\x1e2\x1e\xf7\xae4^t,\x9f\xf6J\xc6-\xd8\xf3m\xf9A\v\xde\x1a@\x1c2^\xb4MP\xfd\xe9U\xec\x96\u7626\xa0lJ\xb2\xcbt\u0319\x81\xb4\x94]v\xf9b<a\xf7\xeb\xe2=\xf7\x82\x15\xe3\xee\xd9\xf9\x9dn\xc5\x0f\xedPs'\xdc0\u018b6\u007f\u05dct\u02b4\u03f0I\x8ee\xdbf8\x15\xb8\x14\x9d\x01\x9a\xfb\x19\xb5E\xb5'.\xfcw\xcfw\x97\x84\xc1\xa2\xe0Ss\x87\x81\u01fd\x84_\xaex\xfeZ\x1fq<\xa4\xab\xb6_\a_\x97\xfb\x02+\xb6\x1e\x9eo\x19w\x9a\xbd\xf5)\bg\r\x01\xcb\xff\f\r=\a\x16\xb7e\x81\fm\x1d\xf0\xa1C\a \xee\xff+\r\r\x8f\xfd\xe3\x1b\x06X\xb4\xd7\xe1\xc9\x1c\u03ff'wI\x9e\xa5>\x03\xe4\x9f\u0672n\x19 \xa0\x1fW\aHeqJ\x9a\xe4?\xceO?\xfaK\x82$!\xc28\xe0\x8e\x1e\xb1\x820\xe8\"\x9c\xda)&\xb6\xdcW.\t\xa9\x95\xcf\xfd\xb1\xfaz\xc3\x11\xcbX\x96WR\x8e\u0115\x9c\xb0=\x84\x81\x88\xe9\xe0\xfb\xad\x87e\xe7\fb5\xaa\x10C\xe6\x87;\r\xd4\\\x8c0\u03bf\">k\xbbe\x92Y\x8d\x0f/\xdcGBJ\xd5(\x00\xee\xb7\xf4\xf41\xae~{\xd4\xfd\ue7a8\a\xfa\x1dc\xbc\xf4(\xb5{\x9c\xff\xbeb\b\xba\xb3\rXB\x8d\xd5(\x13\xb1\x83\xab\xb3U\xe6D\\\x80\xda\xcdmX\x92O\xa4\xe7zL\xe8\xb4\x1e\x93\xf4\xfc\x82Pi{\xc3\xe3\x1bw\x1an\x02\xa9\x93v\x95\xd6\xd4\xc1\u007f0<%|\xd2\xdaq\x90\x9a#\x1eD\xb8Q\xc6te\xa7F=\xa6v\\yp\xbf\xf7\u0720\xb4\x19\xad\x9aM\xad\x85\x01\n}\xc0J\xba\x1cW\xd9*\xa2\xd3\u01b8\x85\xa2\xc9B]\x9aV\xc0wj\b\"\xd8=\xd4~\xcd(\xfe\xf5\rD4\xc7\xe5\x05\xd1\u04fc\xbbM\xd2p\"\xff%\xdem\xb8\x01\xd4NE\xeb\xfc\xe6\x1e\xee\xdd\xf6\x0e\xc6\u00ea\xc1y\x916k\x8aS\xd8\x18\xb9VT\xbaf~ft}\x84\x94\xb8Q\xe2(\xf4\u0298-\x8b\xf3\x948$n\xb04{Z\xd6:a=\xf8\x86\xedQ\x12\x1e\xaf\f\x00\xd8\xc3g\xbf\x9c=r\xf6\x9c\xf0,KS\x10\xd8-O\xa8C\x8a\xa32]\n\x83\xbb_\xf1\xec\xb1\xd8~\xb5\xa3\x8c\x91\xf7\x05\xc4\\\x10\x94^\xf08\x84\xd1\xc7\xc6\x057\xa6\xa7u\x91\xd3\\\x0e\xdc\xdbh\xb5\xba\xc1\u0373\xa4\xa9\xd2\xe7@\xda\xd6`I<JOU\u047b\xda47H]\x05\xd38]<\xb9\x84\x1b\xed\x9b\xcc`$\xe2^\xf5S\xa4\x14j\x8c\x8a\x8d\xdb\u0161\xe1%\x1ejR\x12\xa1+#\xa3\x8f\x94\x81\x11[/x\x99\u007f\xc5L\xef\xd7x\xf0\x8e\x1d-\xd3\a\xd7h\x9261\x0e\xa0\x84v\xaf\xb1q\x16\xe75\xe5\x05\xc5Y\xd99EUuy\xe5\xd9Y\xba*\x90z\xbe9\xaf\xa9DZHbj\xbd\x064\x11\xe6\xf9!`\xbc\xb5a\x87u'\x9b&\u01658\xe1\x8f\x1c=u\xef&\xc86\n\x8c\xe7\xb1\xd1\x17\x83\\\xf4\u05ed\xbd#\xff\n\f\xba\f\x18\xaf\xf1o\xf3\a\u01d2Q\x9e\xcf|\x1d\xe9\xa4\xcf\u01bfD\x88Zn\xa2>\xd8$L\x8d\x14\x87\"t\xdb>t\xde\xfd\xde'KEw\xe3\xff\xa9\x97\u03af\t\xc8[\xbbf\xe7\xc8\x12\x8a\x8a\x05\xa4\u0643\xf3\xcdYM:\xbe6\x98\x9e\f\u06e6J?\xb2Jdz\x88rI4\xad\x87D{&\x18t\x1f\xb0\xaee\xd0\xc48\x95Sp\xf5N%&\xcdj'\x8f\x95\x18\xa8v&\xae\x1eX\x9cO\x15\xd0l\x1fw\t0\xef\xf9\x19\x98\x0f\xb6\xf4\x1e\x14\x16\xe7\xee\x176\xf4r\x1e\x18:\x98\xf7\xeaz\x0f\t~\x93\x02\xb5{\xdf\xda\xdf:\ue34fo\xbbw7\xc8[\u0177\xc0\x94\x13x\x11x\u02078\x94\xe9\u0372\u029c\x8c\vT{D\x87\xba\xd3\xca\xe9)\xac\u03b6\xcb$\x1d\a\xe70\u0250;\x06\xed0dk{\b\x03OdZy\f\f\bk`|\xe8\x14\xe1\x11\x82\x80\x04x\x9c\x00;\x98\x0e\xe3\x9a\x0f\xba\xee]\x9b\xf7\x88\xc9%\n\u04b1\xadR\x89\xb6\xf7\xb9\xf3\x15\xab\xce\xf0xN\xb4\x12\rH\x1f\x83$\x11Uz\u0258\x9f\xa6p\x02\xb9k\xfe\xbd\xd0;\xc1Ue\x1b\xc8Hv\xee\x18G\xfb\x10\xe8)\x04\xaew{\u0796E\xc5\xf3\xfd5,N\xa8>\x8b\u07c5I\u0318\xc1q\x11\xb4~\xbaW\x87?7'\x83ICe\u0567\x05\xc7zqa%Q\xf1\x02\x9c\x1a\xfc\xbb\xd1\xf1\xfc\x90_s\xe7\u017a\u007f\x91\xddi:\x9f8Q@\xab\xb6~B:.\x12\xfd\xae\xfb\x1f\xd4\x00\xad\u03e0e\x80J\x8f~\xab\x93\xd8\r\xa5\x18\x82R2\x82Gt7\x8d\xe7\x9buM\u017e!\xb3\x89\u0204@\x95k\x85\xe0\u0125\xcc\x19X.\xac\xc0M\x1d\xbe\x81\u7a86\x15\xc0rg.e\x9e\x18|D\xc0\x87\xbd\xb9\x84\x13\a\u03eb\x1e\xbf\xb5|vu\x97\x9bnn)\xeb\xbe\u00e0\xe0t3w\xd2)\xcf!\xc7&9\u0692o\x9f\b\xd58\xa7\xf7\x1e\u02bf\xb0\x94\xdf\u44b2\xd8\r\ae\xb4%\x0e\x92\xe8\x90\v\u056ftp\x8f9\\\x10\x80\x11\xa2\xc6\xe5\xf6\xbf\xc7Z7\xdc\xcet\xa9 \xde\xdet\xd8\xe6\xf0m\x00\xe6\x04'\xbf\xcf\xfe\xc1K\xe9\xa6t\x90\x12-y\xce\n\x0f\x8dW\x1a\xdfg\x86'\xfa\xb1\xa7\x84\u07a8H*\xc7K\xc8B\xeb=}\xec\u007f\xa0\xf0\xb1.Q\xf1\u007f\x85O\x03\u02af\xf5\x88\x16\xf6?\r\a\xfa\xe1\xe7C\xbc\xc1\xdfv\xf8-\xe7\u8412\xe18\xd0\fO\xe7P\n\xc5\xe2\xdcfE\xfdD\xfd4\xf6\\\x91\x98R\x98\xcei\x86\u01c1\xa1\x12:\xe4\xdc\x16|\x9cnsm\x99\x13d\xe8tsM>\xf0\x1e\x86\x0e\x03+0\f^D\xe6g}\x9f\xb3V\x17G\xab\xf7P}\x11\x19\u03a5\a\xaa\x9dh\xf4z\x8b{\f\xdf\x19\xe0\xd0\x19\xaf\xbd\xd1\xea\xe2uh\xa6\xaec6\xab`\x10\x06\xd53\xdd~\x8d\u05fe\xa9\xe8N\xaf\x9e\xcd,\x18\xb2\x81\a\xbb\xa1\u007f\xd3X\xca\xfd\xb9\xed\x17\x9e/\x1a\xde\xf7\x19|(\t\xf1\xbc\xdb\x10(\x10\xa6yP\b\x13\x9a\\1\xdcJ\x84\x18\x04\x19\xad\xa4K\x86\x1e\xf25M{\xa7@\x01Y6\xccqM\xdb\xe1\u07d3_y\xfb,\xb8\x8f\xb8\xfa\xe0\xde3N\xb9\v\xe0\xf6\\\xcd\xdf\x1f\xc8@2vl\xe9\xf6\x17\xe2\xa5\x1e\xc7\xe0iL\xbfjC\xf5}\x9a\x8b\xaa\xd8\u007f\xf5\xcd\xfc\xf3\xf1c<,\x99\x05\u04f0\x1e^2\\b+#;\xf2\xd2\xfb\b\xe0\xbb{Q\xc8\xfcw\x8d\x8d\x19\x19\r\x8d\xef\vP\xd1\xd1\xf9\xa8\xe7i\xceLuS\xe3[\xb4^\x15Y\bihP\xab\x1b\x1b\x9e\xe5#mX!\xea6\xab\xddx\x83,0D\x11\u0449tz\"\x86HRa\x18tL\"\x91\x84Q1\x18\u06f1\x91\x88\x89\x18:\x03\xad\x02\xc4{I\xbf\x9cn\xfc\xf6\xde\x10\xb43\x88\x02\xcbC\x96A\x97\x05\xafj\xbf\xeds.C\x86\xff\x1c\xb6y\xe2\xbbo\x00Gr\x97\u075e|'\xc0\xc8K\xe5\xd4\u040c,V\x17:1c\u048f\xeb\x13\xd6I\xf7\xec\xf2\xe5fi##<\xeb\xbb\xd2\xc5\xff*\xf2,\xa1\x8bD8\r\x8d\xec*\u01f2\xf0\xa7\xd9\x18\xa1^\u030d,*\x88\x1b\xf7\xd3\xe8'\xe0\xab;\xdf\ta\t.*\x9b\x80\xd8T\u05dcLO\x18$0\r/\xf4\xe6y\x97Q\xe3E\u062c1\x15\xe6\xd4\xcb\xecP.,8\xba\u0146\x8b\xf4\x9d\xa6G\x16\x84Ka\xed\xefRu\xc0\x89R\x1e\xba\x15\xeb\xd7K\xa1\xf4\xf9aK7\x93WJ\x9d\x02F\xbfx\xae\x11\xbe\xcf\x18\x10\xb6\x06\xa3\xa6\x05\xc4\xc8\xe0UB\xb1WU\xb44\u075f\xe5\x9a\xd8U\xd2\xd1Rk\"2\xa2rF\x18\xd95\xc4}\xb9Z\xca|^\xd5(3;\xa6\x05\xbeLm\x88\xd0x\x92\x11\xcc<\xcai\u037c\xc10\xaf9M\xc9\xcbS\xc3y\x8d\xc1\xa0\x99\xa7\x9c\xce\xf3M\xed\x98\xcf8M\x9eF\x9e\xcf0t\xa8\xe9s\u06f2_\xae\xac\xbc\xccnk\x83\x8d\x93\xcb~\xd9v\xfb>\x05\xde\xe50O\xa9s\xe6_[P\x01\\w\xa2W\x1c)\xa7\xbb`\xbby\xa6\x99\x0f\xefJ8>\xc9k($\vW\x81\x8a\xae\u07ec\xab\xbd4\x8e\x1d\xc9r\xe8\U0004047c\xfc\x91\x83Kn\xf4@\x02\x90b\xc9S\x15\xa2\xb7)\x8d\xed*\xe4\xf1a\x0f\xcaT\xb9\xe8M\n,\xff\u06e2\x8c\x03:\n\xe6:\u0534a\x18\xfc\xf1\x8dW\x10sc\x05\xb2\xc8$N_#\xdeCp\xa5\xfd\r\xb3\x90\x9c\x98\x8d\xe3l\xe8\xed=|S\xad\xd6L\u057f\\\x98jbH\xa9\xcf.\x16z\x0e\x14\xd2\r\x01\x1b\xd6v0\berE\x19\x81\xc1P\xaaB\xb1\xac\xc5`\x10J\x15\xf22|\xce\xc2\xcb\xe5\xa8\xd4\xd2\xfd`lR,\f\x8b-\x1a,\x18\xdb\x0f\v\xe3\xb0c\xbdw\xce\u019b\f\xe3\xbc/di\xb6hb\u007fm\xf4\xfc\xe8\x92;\xbf\xf6p\xe5~\xccWH\x06#&\x94\x94J\xb8(JS\xb7\xd2e\xd1\x1a8\x8b\x86N\x8e z)(rq\xb2\xef\xc0d7@\xff\xf6\xa7X\xa2c\xbb*]\x94:q\xb4_\x96\x8cS\xef\x97\u0229u\xdb\xde\xf6s\v\x86\x92\xa9\x94\xf1\x05\xf9LMfifj\x82\x98\x0e\xa7\x05\xbd\xf5\x8c\xd2`\xd1l\xf5\xa5\v,w\xa1m`l\x1e\"6\n)\x03n\x83\x9fS\x83\x85\xc1\x12\x9c\xe4\xe3S\xe7\xff\xd0$qJ\x89,\xa0\x06dmSa\x9d\x8c\xf2\xc4\x03\xaf\xd5\x1b\f\x91\xedH\xc8\xe5\xe9\x82p\x16\xae\x8e@\xeeO\xafq\x1aF\xc0\xc90\xaf\x06\x965\xb7\xf5\x99\u05d0\xce*\xd4\xe3D}e\xd4\xe9\xee\x01\xfa\x85\xcdU{\b\xd9$\xd0\u007f\xaf\xa1Ni\xe8\x9f\xd9#\xde\x19\xdd\x05\xc3.\x17\u007f\xd1\xffbj\u03cd\xf7'\xb8\xf5?\xfe\x85\x97\xb4Z\x13^\xe6:\xb6`\x00N\x14c\xbb\xbe\xcf\xdc}S\x80\x9f\xc5\x1d\xa5$\x8d\xc7W\x03\xecZa\x02\xb6)N\xa5\x0ff\xc7\xe8\x82E*\xff\xa6\x84\x04l\xa3P\xa9\x0fb\xd3\xf2\x83D\u0280\u018b\xb2*Au\xa2\xc2\u7a2a\x16\x94)\x12\xd7\x02\x11\x99\xb6\x94\xf1\x97P\xd5\u0508\ay\xfc\xe5\xf5\x86M\x81\xf8\u0758H\xbbd_\t]\xf8^\xc1\x92a\xf2!\"\x1b\x19\xd3'\xd5E\x109\xcb\x19Tl\x8f\\r\x92\u46a6\xd90\x03\x9c\xbe\v~\x95\xd4\xd6j\xc0\xbf.>\xbdv\xe1\x18\xf6\x8b\xf1\xea7\xd7!.\xb3.\xed\xf2\x0e^\x1aX\xd0\x03\u04ff1\xa3}\x83]\xf3\x81\x06\xb8\xaae\x94\u07a8i|\xcb>If%\xbf6\xbf\x0f\u0175{TZ^^4\x95A\xcd\u0361\xd3i1Z-#::2'\aHcWR\x06\x933\xd3\x10G\x9a\xc0-\x9cl\xe5\x88\x1a:DI\xbd\x9a\xacd\u0729\xa1\xd8\x0e\xa6\xcf\xe0\x18\x98\xf8\x06\xf2\x80OK\u041d\x10\x11\x9at\xf0\u007f\xa5>\xdc\xe1\x97F\xe8L\xa7\x89r\x18\x8dZ~\xfdM\x9f\x1b\xa2\x95\x00\x16\u0276%\xd4QO\xe1\xd8\xff\x0e\u0307\xee\xd8\xdd\xfe\xd3k\f\xfaM\x84\xbf\x8a\xc6\x13D\xfd\xb1\xc7\xdb\xf9NN,\xbe\xadB\u024d\x96\xc2\xd54eX}\xb6\xa4\xdbW\x91\u0449d\xccO\u04fd\xb9\xaeB[L\xb8\xc4-z+\x16m\xbd\x97\x1bQ\xf6\xa7\x9cEf:\xc7\xfa\x87b\xc5\u03f8\x94\xc7Xf\xa0\xbf\xcdQ\x99#\x89\xa0td\x84\xf8\xca\x18\x87\x8c\a\xf2h\xdd%\xf2\ttj\xea\b\xa6@\x18U\x0e\u0488\u00ce\xf5\xb6\xec\x91\xfb\xa7\x12\xe5{Rs3\xc68\x05\x8d\xe1\x9f\u0109\x99$\xf6\xaf\x0f\x10\xe4\x1bE\x8e|/\xc6l\xa6\xc0S\xec \xdf@\xe8\xbcZJ-s\x16\xca\xd3#\u02fd\x05\xdcZ\xdf$\t\xa9\xf6\x84\xf4{I\xa8\xf8vE\x0e\x97e\x155|n\x9f\xf3\a\xb6{Ih|\u00ab\x83y\x8f\xba\x9d\xf9t\xcb\xc8Aqq\xde\n\xa3\xa1\x81s\xb4\xaa\x8av\xa4\xb2~/]\x973\x16\xb9T\xee]Yu:I\xf2\xad\xc7X\xfa\xa8\xb9N\x1e\xfa2\xb6\x96\xeeS\xc3]\xfa\xc5\xc0/9W\xc1\xa4\x17M\x88\x8f\x05\xfcx|5\x1c\x91\x1f+-$\bE\xfa\xa0X%\xbcY\x11\a\xdf\xc2I\xd2\xe3\xe3\u01b7]\x02\xdam\xaf\x05_2\xba\x03\xca\xfbm\xb7\x9b\xeb\xe4\xff\xbdQ\b\xef\xafS\xaen=\uff1f\xde_\t\x98\x9f6W_S}\x06\x99\xa5o\xe6\xc77\u04f8\xb1\x1b\xad\t\u0114xmb\x154\xf3\xe2\x1b\xa9<\xf6\x9dom\u0131Y\u05bd\xed\x8c\xc0!\u84eb\x06\xeb\u03b4ofO\xeb\v\xae]\xba\x14\xf7\x80\v\u02f8\xc9\x1a4\xdd\xde\u078aV\xc0xm\u00c0\xb7\xfd\x86,l\x05b\a\x11s\x8fk\x10\x05\x9a\xd0D\x9d\x06Q\xe39\xc9\x122%\x91\x92\x8fg>NcfJ\xd8\xc2n@r>DBJ.'x\x11\x88R\xaf\xbd>b\x12I\u01bd\xf3G\x93\x88O\xf0\xfa\x1e)\xae Q^\x13\x88\xaf)\x94\xaep\xc2k\x10\xf2\xdbS\xac\x18)\xf4\x8fE\u0083>\xff\x94'\x84g\x90\xd9|t\xb0\xbf\x04)\u0131\x91\xb0\xa0\xfbouB\xb8\xe6 \x8fyW\u0752\xbap\x9a\xbc\xca3`\x01\x98&\x9c}\xf8\u0437&\xa8\x8eT\xdbnx\xe3\xd5\xe2\xde\xec\\W\x01\xa0\x18\xe3\xc3\xef}\xab\x83\xb7\x10k\xda\rO\u007f\u007f\xe4[<\xfe\u07e4?&\x8f\xac'\x1f.<\xbc\u00c3\xb7\x8a\f\xde\xf7w\a\x1a~T\x03C\xaf\xb9\xa8\xacw\nO\"AS\xbe\xa2\xb3\xb8\x9c)_\x150\x02\xf1\xe4\u07a1\xb2\xaa\xa5=\x96\x00\xff\x1dU6\xb8\x8d\xc0\xe6{\xbe\xf1?\x18<\xa5d\x01\ucbdd\xfagw\x9c\xa9*\xaef\xf6\x90\xea!\xe7\x976\xcd\\P@N\xaa\xda>\xfe\x1e86`\x02\x98X\x1c\xd4uy\tp7\n\u00b3\x05\u0789\xff\xfb\xff\x88\xa7\xc7\xf7\x14e\xf8\xf1\x894\xa0\x12\xb50\xe4\x9d\x14C8\n\xe8[\xb37\xa9'\x83\x8c\xd9\xd3\xc3\xec\xf3aN\xb3\x1c\u0745\x90\x1b0k\x81\xfa\t\v\xf4N=%\xfc\x0f\x10\xb1\xd8\u0511\x9eXe\x8cc\xf6\xeb\xc7\xe1\xdd\xfa\x85\ndn2Xg\xf6j5\xb3_\xed\x86w\xab\x8dH HuQ\xc4\x13oB\x0e\xcc^0e\xf6\xad0\xa7\xd5\x0f\xefZ\x14\xc3\x11\x94T`\xf6\\dQ\u0580\xd8\x051:\x8a\"\bl~Vnr\x19\xb8\xa6\xf5V\xa3\xf5\xbf\xa1M?E\xeb~A\xcd\x129\xdcRL%\x0fQ\xefh\xbd\xedh\xfd/\xfau?\x11\xcfqz$\x85\xd8eQ\xe2\x81\xd9\x1f\x1c\xef\xd95II\xe9\xfe\xa6dG\xda\xe4\xa3\x1dZo\x1bZ\xff_\xda\xf47B7\xad\x87Jq+\xd0z\xfb\xd0\xfa\xed~\xddH\xa5\xd2zc'\xed\xde\a\x0ej\x05\xe9\x993\x9fO\xc7(\x01:\x00l\x17\xeeFf\xac\x11\x03\x94K\x8bQ Pn\n\xd2\xe7\xad\xf2F\xb9\n\x90?o\x95\x8fzRz\x06\xac\xcf\xdc\xe9\x03h\x1e-\xd7]\x06\xd2\xd3g9\b\xe0\x1e\x80\x06\xc4\x032\x96A^B:\x90w\x93t|\xe2I\xf2e\xa0\x8c]\xb5\\_\u07d4R\x0e\xc2\xd8\x00C\x02\x1cE\x94\x0e\x82\xd3S\xc3k\x14\"\xfd\\\xa4\xc9\x06\xe1\x06\x96_\xc5\u01f0n\xbb\xd2\x014\x15\xe7t\x00\xf8\xe7\xb3\xf8w\xb5\xca\xe3\xfa\f\b\a\xfb\x94\x15 n,\u0553\x90;\x92\uf30b\x01}R\x9e\xbajp\u05b4\x1c\x94\xe2\xe7\xdc\x10\x02\x05\xcfAZ\xf9\x1f\x03\xb0\xf5]\xc2\xcfAc\x90\xed&\x1co\xd3/w\xb0\x92\xd4v\u047f\xf3i\x03xi\x8e\xf8\u007f\xb8\xfa{lK\xfa:\xf3\x15\xdaZ)[v[\x14\x82K\xeb\xb8\x01\xf4\x0e8\x81\x98\xf5\xfd\v\xa1\x81\xef\xb6\xe1\xb9\x14g\xee%\xba\x84\x81\x14\xa6\xad\x04 \xe5<u\u0378\x9c\xb2Sa\xb8\xad-\xe6\x91I\xa2f\a\xb8\xe7D`\x838ppn\x8c\x81\xf8?P\x9c\tyH\u0504\xb1+d\vYJ&\xeb\xf2Q,\v\x1f\x93n\x00\"\u0143i\xde)\xcc?\x01\xf9/\x97\xf3}\xf5\xa5&\x8c\x11\xf4I\xef\xa4\u0496\x89\xc9(\xd1H\x16\x03*/\xcf\xfa\xa4\xe6\x1fG\xe3\x87%\xef\x83\xfa|\x92T\xde\x05q4/\xfb\xc9\xf3x\xa0e\xd8\xd1\xdc\x05\xb4\xa6@\xb3\x06\xc8k\x98\xfb6d\xb1\xd0\xdc\xdd\u016e\x1e/)3\u14a0\xfe/\xef\f\x86\x1c#=\x1f\xb0\x92\xd6`\x19R\x9ay\xa5q\x16,\xb31L6Z\x89\x8ef\xa2c=\x91\xfeu\xedZi\x05X\xf1Y\xf3\xceX~%^J\x84\x8b\xbaOJ\x8eF\b\xba:\x97\x1e\x02\xe5/\xd0\f,\x92^\xb2N\x17\x92\u0147\x1cJ\xe1e\b$\x1e9\xde\xc1\x12\x9f\x10\xcfv\x00\x1e\x16\xceK\xbf\xaa\xb9[m\x91\x9a\x05\xd9q\x1e;\xfd\u03bd}\x80\xec~\x8d\f\xea\u007fRa,\x8bm\x1eA\x82O\x1e\x9eg\xad\x14\xaaR\xae\xf3\xc2\x1c\xd4QrL\xbc\x89yQY^~\x17#2\xd0\u24fa:\u015f\x00\xc8o\u07ae_\xcb\x00K\xe0\xe5\x00\x02ml3r\xf0Jz\xa9\x11\xe2|BA\xce\xd3s\r^\x06/\x87\xa0\xe6u.\xe7\xbbV8\xf7\xe7\xfa4\x8b\xc8\x05\xe1\xc1\x98\xe8X\x9fA\xfe\xa5z\x92\xaawy\xa7\xe2\x12\xf8\x04(/\xfbN\xe5e\xf0r\x10P\x99A@\x1c\xf0taS\t\x85\xe3<\xb6k3.\xe4pE2\xc7\u007f:\xf0VS\x93\x98d\xea\x8a(&\x1b=(\xc1zp\x93\xe9<\x88\x80w\xe9X\u061e\xb9hB\x88d .\xe0\xf7\xdf\xff\xd9[v\xbbl\x94\x87\x043\x81\xb93\x1a\xfb\x85 `f\xb24\xa42\x87g\x16\u02ca\x9b\u0658R\x9d\xfc1;\xe8\xc4V\xa6\x98N6\xb8\x04\x19\x8a\x94\x93\xd1\xcaUI/C\x19\x86rY\xb4\x8a\xcc]\xab\f\\\x90\xfc\xa6\b\x89!\xf7r:\u014a\x8aL\x10\f\xdf\xea\xc3e\xaa\xa4\xa3\x8f\xc4\x04\x94\xa4T\xc3\u0316\xa7\u00a7\x96\x88\x14BU\xc9\xc12\x94H\u0392G\x9b\xda*V&W\b=\x1d\x1d\xb2|}\xe5B\xc4\xe1c\x89%\x96\xd0\x1dA\x88\xdd\xea\x95\xec\x1a\xaa9r\x1c\xac\xff]@\x10%Y\xd1hm\tC\xff\xc8\x05\xbf\xcf\xfax\x8f\x197\xc1\x81#'P\xce\\\xb8r\xe3\u0383'/0\xde|\xc0! \xa1\xa0a\xf8\xf2\x83\x85\xe3/@\xa0\xa0\xff\xee\xb2\xe1\x11\u059e\xcd$d\x14\xa1\u0084\x8b\x10)J4*\x9a\x18t\fL,l\xb18\xb8x\xf8\x04\x84\u2208\u0153\x90\x92I \xa7\x90HI%I\xb2\x14\xa9\u04a4S\xd3\xd8}\xbcl\xb7VmN\x1a\xf6\x97m\xb6\xeb2e\x9f\xb9`\xea\x92`\xe6\\\x03>\xf9[\x8f\x11\x1d\x88\xfc\xccG;-\xfa\xe2\xb3\u007f\xfc'X\xe4\xab.[\x91)K\xaf\xec\u007f\x01{\xbc\xaf\xb8\xe6\xb6\x1bn\xba\xe5\xa5\x1c\xf7\xddq\u05ea\\\x1f\xf4\xf9\xde\x03\x0f\xe5y\xed-\x83|:\x05\n\xe9\x15\x99Q\xacT\x89\x04^\t\x95*lV\xe5\x95j\xb5j\u0529\xb7\xc5Q\xbbl\u0560Q\x937\xde9\xe6\a\x8f\xfc\xe4\xb1C\x0e3:\xe2\x825\xeb.jw\xcai'\x82y\xeb\x84#ux<\x83\xbd\xb1\xb8\xa7-+\xcf*.\xd3Br\x8e\xaa,+\xaf,Y\xb5\xeb\x8a\xcb\x00")
+
+func third_partySwaggerUiFontsDroidSansV6LatinRegularWoff2Bytes() ([]byte, error) {
+	return _third_partySwaggerUiFontsDroidSansV6LatinRegularWoff2, nil
+}
+
+func third_partySwaggerUiFontsDroidSansV6LatinRegularWoff2() (*asset, error) {
+	bytes, err := third_partySwaggerUiFontsDroidSansV6LatinRegularWoff2Bytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/fonts/droid-sans-v6-latin-regular.woff2", size: 11304, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiImagesExplorer_iconsPng = []byte("\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x01,\x00\x00\x002\b\x06\x00\x00\x00\xe6\xd6\xe6*\x00\x00\x00\tpHYs\x00\x00\v\x13\x00\x00\v\x13\x01\x00\x9a\x9c\x18\x00\x00\nOiCCPPhotoshop ICC profile\x00\x00x\u069dSgTS\xe9\x16=\xf7\xde\xf4BK\x88\x80\x94KoR\x15\b RB\x8b\x80\x14\x91&*!\t\x10J\x88!\xa1\xd9\x15Q\xc1\x11EE\x04\x1b\u0220\x88\x03\x8e\x8e\x80\x8c\x15Q,\f\x8a\n\xd8\a\xe4!\xa2\x8e\x83\xa3\x88\x8a\xca\xfb\xe1{\xa3k\u05bc\xf7\xe6\xcd\xfe\xb5\xd7>\xe7\xac\xf3\x9d\xb3\xcf\a\xc0\b\f\x96H3Q5\x80\f\xa9B\x1e\x11\xe0\x83\xc7\xc4\xc6\xe1\xe4.@\x81\n$p\x00\x10\b\xb3d!s\xfd#\x01\x00\xf8~<<+\"\xc0\a\xbe\x00\x01x\xd3\v\b\x00\xc0M\x9b\xc00\x1c\x87\xff\x0f\xeaB\x99\\\x01\x80\x84\x01\xc0t\x918K\b\x80\x14\x00@z\x8eB\xa6\x00@F\x01\x80\x9d\x98&S\x00\xa0\x04\x00`\xcbcb\xe3\x00P-\x00`'\u007f\xe6\xd3\x00\x80\x9d\xf8\x99{\x01\x00[\x94!\x15\x01\xa0\x91\x00 \x13e\x88D\x00h;\x00\xac\xcfV\x8aE\x00X0\x00\x14fK\xc49\x00\xd8-\x000IWfH\x00\xb0\xb7\x00\xc0\xce\x10\v\xb2\x00\b\f\x000Q\x88\x85)\x00\x04{\x00`\xc8##x\x00\x84\x99\x00\x14F\xf2W<\xf1+\xae\x10\xe7*\x00\x00x\x99\xb2<\xb9$9E\x81[\b-q\aWW.\x1e(\xceI\x17+\x146a\x02a\x9a@.\xc2y\x99\x192\x814\x0f\xe0\xf3\xcc\x00\x00\xa0\x91\x15\x11\xe0\x83\xf3\xfdx\xce\x0e\xae\xce\xce6\x8e\xb6\x0e_-\xea\xbf\x06\xff\"bb\xe3\xfe\xe5\u03ebp@\x00\x00\xe1t~\xd1\xfe,/\xb3\x1a\x80;\x06\x80m\xfe\xa2%\xee\x04h^\v\xa0u\xf7\x8bf\xb2\x0f@\xb5\x00\xa0\xe9\xdaW\xf3p\xf8~<<E\xa1\x90\xb9\xd9\xd9\xe5\xe4\xe4\xd8J\xc4B[a\xcaW}\xfeg\xc2_\xc0W\xfdl\xf9~<\xfc\xf7\xf5\xe0\xbe\xe2$\x812]\x81G\x04\xf8\xe0\xc2\xcc\xf4L\xa5\x1c\u03d2\t\x84b\xdc\xe6\x8fG\xfc\xb7\v\xff\xfc\x1d\xd3\"\xc4Ib\xb9X*\x14\xe3Q\x12q\x8eD\x9a\x8c\xf32\xa5\"\x89B\x92)\xc5%\xd2\xffd\xe2\xdf,\xfb\x03>\xdf5\x00\xb0j>\x01{\x91-\xa8]c\x03\xf6K'\x10Xt\xc0\xe2\xf7\x00\x00\xf2\xbbo\xc1\xd4(\b\x03\x80h\x83\xe1\xcfw\xff\xef?\xfdG\xa0%\x00\x80fI\x92q\x00\x00^D$.T\u02b3?\xc7\b\x00\x00D\xa0\x81*\xb0A\x1b\xf4\xc1\x18,\xc0\x06\x1c\xc1\x05\xdc\xc1\v\xfc`6\x84B$\xc4\xc2B\x10B\nd\x80\x1cr`)\xac\x82B(\x86\u0370\x1d*`/\xd4@\x1d4\xc0Qh\x86\x93p\x0e.\xc2U\xb8\x0e=p\x0f\xfaa\b\x9e\xc1(\xbc\x81\t\x04A\xc8\b\x13a!\u0688\x01b\x8aX#\x8e\b\x17\x99\x85\xf8!\xc1H\x04\x12\x8b$ \u0248\x14Q\"K\x915H1R\x8aT UH\x1d\xf2=r\x029\x87\\F\xba\x91;\xc8\x002\x82\xfc\x86\xbcG1\x94\x81\xb2Q=\xd4\f\xb5C\xb9\xa87\x1a\x84F\xa2\v\xd0dt1\x9a\x8f\x16\xa0\x9b\xd0r\xb4\x1a=\x8c6\xa1\xe7\u042bh\x0f\u068f>C\xc70\xc0\xe8\x18\a3\xc4l0.\xc6\xc3B\xb18,\t\x93c\u02f1\"\xac\f\xab\xc6\x1a\xb0V\xac\x03\xbb\x89\xf5c\u03f1w\x04\x12\x81E\xc0\t6\x04wB a\x1eAHXLXN\xd8H\xa8 \x1c$4\x11\xda\t7\t\x03\x84Q\xc2'\"\x93\xa8K\xb4&\xba\x11\xf9\xc4\x18b21\x87XH,#\xd6\x12\x8f\x13/\x10{\x88C\xc47$\x12\x89C2'\xb9\x90\x02I\xb1\xa4T\xd2\x12\xd2F\xd2nR#\xe9,\xa9\x9b4H\x1a#\x93\xc9\xdadk\xb2\a9\x94, +\u0205\xe4\x9d\xe4\xc3\xe43\xe4\x1b\xe4!\xf2[\n\x9db@q\xa4\xf8S\xe2(R\xcajJ\x19\xe5\x10\xe54\xe5\x06e\x982AU\xa3\x9aR\u0768\xa1T\x115\x8fZB\xad\xa1\xb6R\xafQ\x87\xa8\x134u\x9a9\u0343\x16IK\xa5\xad\xa2\x95\xd3\x1ah\x17h\xf7i\xaf\xe8t\xba\x11\u0755\x1eN\x97\xd0W\xd2\xcb\xe9G\xe8\x97\xe8\x03\xf4w\f\r\x86\x15\x83\u01c8g(\x19\x9b\x18\a\x18g\x19w\x18\xaf\x98L\xa6\x19\u04cb\x19\xc7T071\xeb\x98\xe7\x99\x0f\x99oUX*\xb6*|\x15\x91\xca\n\x95J\x95&\x95\x1b*/T\xa9\xaa\xa6\xaa\u07aa\vU\xf3U\xcbT\x8f\xa9^S}\xaeFU3S\xe3\xa9\t\u0516\xabU\xaa\x9dP\xebS\x1bSg\xa9;\xa8\x87\xaag\xa8oT?\xa4~Y\xfd\x89\x06Y\xc3L\xc3OC\xa4Q\xa0\xb1_\xe3\xbc\xc6 \vc\x19\xb3x,!k\r\xab\x86u\x815\xc4&\xb1\xcd\xd9|v*\xbb\x98\xfd\x1d\xbb\x8b=\xaa\xa9\xa19C3J3W\xb3R\xf3\x94f?\a\xe3\x98q\xf8\x9ctN\t\xe7(\xa7\x97\xf3~\x8a\xde\x14\xef)\xe2)\x1b\xa64L\xb91e\\k\xaa\x96\x97\x96X\xabH\xabQ\xabG\xeb\xbd6\xae\xed\xa7\x9d\xa6\xbdE\xbbY\xfb\x81\x0eA\xc7J'\\'Gg\x8f\xce\x05\x9d\xe7S\xd9S\u0767\n\xa7\x16M=:\xf5\xae.\xaak\xa5\x1b\xa1\xbbDw\xbfn\xa7\ue61e\xbe^\x80\x9eLo\xa7\xdey\xbd\xe7\xfa\x1c}/\xfdT\xfdm\xfa\xa7\xf5G\fX\x06\xb3\f$\x06\xdb\f\xce\x18<\xc55qo<\x1d/\xc7\xdb\xf1QC]\xc3@C\xa5a\x95a\x97\u1111\xb9\xd1<\xa3\xd5F\x8dF\x0f\x8ci\xc6\\\xe3$\xe3m\xc6m\u01a3&\x06&!&KM\xeaM\xee\x9aRM\xb9\xa6)\xa6;L;L\xc7\xcd\xcc\u0362\xcd\u05995\x9b=1\xd72\xe7\x9b\xe7\x9b\u05db\u07f7`ZxZ,\xb6\xa8\xb6\xb8eI\xb2\xe4Z\xa6Y\uedbcn\x85Z9Y\xa5XUZ]\xb3F\xad\x9d\xad%\u05bb\xad\xbb\xa7\x11\xa7\xb9N\x93N\xab\x9e\xd6g\u00f0\xf1\xb6\u0276\xa9\xb7\x19\xb0\xe5\xd8\x06\u06ee\xb6m\xb6}agb\x17g\xb7\u016e\xc3\ue4fd\x93}\xba}\x8d\xfd=\a\r\x87\xd9\x0e\xab\x1dZ\x1d~s\xb4r\x14:V:\u079a\u039c\xee?}\xc5\xf4\x96\xe9/gX\xcf\x10\xcf\xd83\xe3\xb6\x13\xcb)\xc4i\x9dS\x9b\xd3Gg\x17g\xb9s\x83\U000c82c9K\x82\xcb.\x97>.\x9b\x1b\xc6\xdd\u023d\xe4Jt\xf5q]\xe1z\xd2\xf5\x9d\x9b\xb3\x9b\xc2\xed\xa8\u06ef\xee6\xeei\xee\x87\u071f\xcc4\x9f)\x9eY3s\xd0\xc3\xc8C\xe0Q\xe5\xd1?\v\x9f\x950k\u07ec~OCO\x81g\xb5\xe7#/c/\x91W\xad\u05f0\xb7\xa5w\xaa\xf7a\xef\x17>\xf6>r\x9f\xe3>\xe3<7\xde2\xdeY_\xcc7\xc0\xb7\u0237\xcbO\xc3o\x9e_\x85\xdfC\u007f#\xffd\xffz\xff\xd1\x00\xa7\x80%\x01g\x03\x89\x81A\x81[\x02\xfb\xf8z|!\xbf\x8e?:\xdbe\xf6\xb2\xd9\xedA\x8c\xa0\xb9A\x15A\x8f\x82\xad\x82\xe5\xc1\xad!h\xc8\uc42d!\xf7\xe7\x98\u0391\xcei\x0e\x85P~\xe8\xd6\xd0\aa\xe6a\x8b\xc3~\f'\x85\x87\x85W\x86?\x8ep\x88X\x1a\xd11\x975w\xd1\xdcCs\xdfD\xfaD\x96D\u079bg1O9\xaf-J5*>\xaa.j<\xda7\xba4\xba?\xc6.fY\xcc\xd5X\x9dXIlK\x1c9.*\xae6nl\xbe\xdf\xfc\xed\xf3\x87\xe2\x9d\xe2\v\xe3{\x17\x98/\xc8]py\xa1\xce\xc2\xf4\x85\xa7\x16\xa9.\x12,:\x96@L\x88N8\x94\xf0A\x10*\xa8\x16\x8c%\xf2\x13w%\x8e\ny\xc2\x1d\xc2g\"/\xd16\u0448\xd8C\\*\x1eN\xf2H*Mz\x92\uc47c5y$\xc53\xa5,\u5e44'\xa9\x90\xbcL\rL\u075b:\x9e\x16\x9av m2=:\xbd1\x83\x92\x91\x90qB\xaa!M\x93\xb6g\xeag\xe6fv\u02ece\x85\xb2\xfe\xc5n\x8b\xb7/\x1e\x95\a\xc9k\xb3\x90\xac\x05Y-\n\xb6B\xa6\xe8TZ(\xd7*\a\xb2geWf\xbf\u0349\xca9\x96\xab\x9e+\xcd\xed\u0333\xca\u06d07\x9c\xef\x9f\xff\xed\x12\xc2\x12\u14b6\xa5\x86KW-\x1dX\u6f6cj9\xb2<qy\xdb\n\xe3\x15\x05+\x86V\x06\xac<\xb8\x8a\xb6*m\xd5O\xab\xedW\x97\xae~\xbd&zMk\x81^\xc1\u0282\xc1\xb5\x01k\xeb\vU\n\xe5\x85}\xeb\xdc\xd7\xed]OX/Y\u07f5a\xfa\x86\x9d\x1b>\x15\x89\x8a\xae\x14\xdb\x17\x97\x15\u007f\xd8(\xdcx\xe5\x1b\x87o\u02bf\x99\u0714\xb4\xa9\xab\u0139d\xcff\xd2f\xe9\xe6\xde-\x9e[\x0e\x96\xaa\x97\xe6\x97\x0en\r\xd9\u06b4\r\xdfV\xb4\xed\xf5\xf6E\xdb/\x97\xcd(\u06fb\x83\xb6C\xb9\xa3\xbf<\xb8\xbce\xa7\xc9\xce\xcd;?T\xa4T\xf4T\xfaT6\xee\xd2\u0775a\xd7\xf8n\xd1\xee\x1b{\xbc\xf64\xec\xd5\xdb[\xbc\xf7\xfd>\u027e\xdbU\x01UM\xd5f\xd5e\xfbI\xfb\xb3\xf7?\xae\x89\xaa\xe9\xf8\x96\xfbm]\xadNmq\xed\xc7\x03\xd2\x03\xfd\a#\x0e\xb6\u05f9\xd4\xd5\x1d\xd2=TR\x8f\xd6+\xebG\x0e\xc7\x1f\xbe\xfe\x9d\xefw-\r6\rU\x8d\x9c\xc6\xe2#pDy\xe4\xe9\xf7\t\xdf\xf7\x1e\r:\xdav\x8c{\xac\xe1\a\xd3\x1fv\x1dg\x1d/jB\x9a\xf2\x9aF\x9bS\x9a\xfb[b[\xbaO\xcc>\xd1\xd6\xea\xdez\xfcG\xdb\x1f\x0f\x9c4<YyJ\xf3T\xc9i\xda\xe9\x82\u04d3g\xf2\u03cc\x9d\x95\x9d}~.\xf9\xdc`\u06e2\xb6{\xe7c\xce\xdfj\x0fo\xef\xba\x10t\xe1\xd2E\xff\x8b\xe7;\xbc;\xce\\\xf2\xb8t\xf2\xb2\xdb\xe5\x13W\xb8W\x9a\xaf:_m\xeat\xea<\xfe\x93\xd3O\u01fb\x9c\xbb\x9a\xae\xb9\\k\xb9\xeez\xbd\xb5{f\xf7\xe9\x1b\x9e7\xce\xdd\xf4\xbdy\xf1\x16\xff\xd6\u055e9=\u077d\xf3zo\xf7\xc5\xf7\xf5\xdf\x16\xdd~r'\xfd\xce\u02fb\xd9w'\ueb7cO\xbc_\xf4@\xedA\xd9C\u0747\xd5?[\xfe\xdc\xd8\xef\xdc\u007fj\xc0w\xa0\xf3\xd1\xdcG\xf7\x06\x85\x83\xcf\xfe\x91\xf5\x8f\x0fC\x05\x8f\x99\x8f\u02c6\r\x86\xeb\x9e8>99\xe2?r\xfd\xe9\xfc\xa7C\xcfd\xcf&\x9e\x17\xfe\xa2\xfe\u02ee\x17\x16/~\xf8\xd5\xeb\xd7\xce\u0458\u0461\x97\U000974ffm|\xa5\xfd\xea\xc0\xeb\x19\xaf\xdb\xc6\xc2\xc6\x1e\xbe\xc9x31^\xf4V\xfb\xed\xc1w\xdcw\x1d\xef\xa3\xdf\x0fO\xe4| \u007f(\xffh\xf9\xb1\xf5S\u0427\xfb\x93\x19\x93\x93\xff\x04\x03\x98\xf3\xfcc3-\xdb\x00\x00\x00 cHRM\x00\x00z%\x00\x00\x80\x83\x00\x00\xf9\xff\x00\x00\x80\xe9\x00\x00u0\x00\x00\xea`\x00\x00:\x98\x00\x00\x17o\x92_\xc5F\x00\x00\v\xaeIDATx\xda\xec\x9cmpT\xd5\x19\xc7\u007f\xe7\xeeK\xb2y\x01$\x8a6@\xa5\xb5\"H\xaaA\x89B\x03\xd9\xf0\x12,\x90\x88\xa6R\xb4\xd3\xc1\x8c\xad\xf8\xa5\xadL\xedX\x1c:\x05fDtZ\xa7\xe2\ai\x99\xa9\x03\f3\xca\xe8(B\x80vx\x19\x92@-\x06\x92H\x11\xa6(H\xd0RP\t\x91d\xb3I\xf6\xde{\xfaa\xc9%$\xbb!{w!\xd8y~3w\xd8\xec\u067d\xff{\xee\xb9\xe7\xbf\xcf\xf3\xdcsQ\xc4a\xdeRMS\x1aih3\x03\xc3\xdbi\xf9\b\xef\xf9\x8d\xb2\xe3}^kM\"(\xa5b\xbe\u007fx\u079dd\xb7\xe6\xa4i\xc3\xc80,:\xbd>\x15\xce\u0772\xe7\xaa\xeb\xea\xc3\xf3\x80\xce4\xd0\x19\xa0;i'\xac&lI\x99\xae \b\xc9\xd3k\xf6N\u007fA\xa7)eWhX\x02\x8c\xec\xd6d\xa3\xf5:`\xc5\xe4\x0e\xcf\xf1\xe5\xcbUJ\x8d\xa3q\u05944\xad\x8c\nb\xe8*Xg+\xbdb\u0504\xea\xe3jyj\rK\x1f\x9e\x9b\x86eW\xa0\xf4\x12P\x97\xf7W\xb1\x0e[\xad\xe0\xae\xf1\xc7U\x0fa\x17\x86\xa5\xdf{\xef=>\xfa\xe8#\"\x91HR\x83\xa6\xb5\u01b6m\x94R\xce6P\xe4\xe6\xe6RPP@~~~\xcc\uba7f]jhh\xa0\xb6\xb6\x96\u04e7O\x0fX_\xb4\xd6\xcef\x18F\xd2\xe7\xd5\xe7\xf31n\xdc8\xe6\u039d\x9b\u0339\x11b\x1a\x96\xd6L{\xd1.T\xb0\x13H\xef\xfbK\xfau\xdb\xf2,\xdc\xfd;e%k\x1c\x1ah\x9cST\x88VW\xd4\x05\xfd\xba\xc7\xf0.\x1cY\xb9;y]\r\x1c*+D\xd1/]l\x16\xaa\xfcJ\u05fa\xeb\u05ad\u04e6iRTT\xc4-\xb7\u0712\u0520\x9d9s\x86\xea\xeajgBx<\x9e\x01\xbb\x80\u039f?\u03d1#G\xc8\xcb\xcb#\x18\f\xba\x9a\x94UUU\xfa\x95\x86\xb1\x9ck\xb10\ud05b\f\xa6\r\x83\x03\x8aGo\u071a\xd2q\xf2z\xbd<\xfe\xf8\xe3bX)\xc0\xdb\xf5b\xdaJ\xfb\x11\xa5x\xab{c\xc1w\x15\xc3\x06E_\xef>\xa2\tw^\x9c\xac\xa8'\x94\xc7\x1eW\xfc\x92.\xdc\xf3\xdbK\xa6\xe5\x86\xc6Y\xc1G\u0417\xeb\x06\xee\xbd\x0f\xcfM7\x03\x10\xaa\u0689\x0e\x87\xbb\xec\xe6\t\u06f6\xc6}>\xab\xb8p\xc4\xf6=I\xe9\xf2\xaf\xb2G\xe8\xd1_\xb2\xef\x01\xdfM\xd1\xd7\xcdU`\xb7;\xba\x18\x8c\xd3\x1f\xce*Twow\xa5{\xf2\xe4I***hkk\xe3\x93O>I\xea\xd0\xd3\xd3\u04d91c\x06o\xbc\xf1\x06\x93'O&\x10\b\f\xc8\xc5\x13\x89D\xf0\xf9|dddPSSC0\x18t\xb5\x9f\xda\xdaZ\u03b6\x8d\x06 \xcdw\xe5ymY\x1a[\x83\xad\xc1P\xd1\xcd\xe3Q\x97\xb5\xf5|\x0f.\xfd\x1dw2X\x9a\xfc\xf6\x97\x991\xe3\x17)\x1d\xa7\xb5k\u05ca\u04e4\u04b0f\xbch\u07a6{\x98\x06\xc0C\xf7\xc2\xfd\xb7E\a\xb9\xf6\xc4%\u00fa\xc8\xfd\x1e\xdbZ\xbdt\xa9^\xd83=\xec\xbfY\x15\u0766Uo\xdd\xec\xb2r\x02\x05\x13\x01h?\xf8\x01\xa6cX\xa0\xe1~\x13\xbdZ/ea\xcf\xf4\xb0\u07e1\xff\x87\xa5\xb7Ao]rJ!{B\xf4uK]7\u00ca\xf6\x17\xe5]\xad\xf5\u0485\u02a5pkk+\x96e%\x1d\x11E\"\x11Z[[\xe9\xe8\xe8\xc0\xb6\a.$\xf1\xf9|\f\x192\x84H$B(\x14r\xbd\x9fP(\x04\xaa\u007ff\x1515\x9d\x16Xv\u0504\f\x15\x8d\x9a\xfdZc(h7\xa3m\x1eC\x91N\xf43\xe1H\xf4\xdf@?L+\x8b\xac\x94\x8f\x93\x90B\u00da\xf9\a\x8de\xdao\xbb\xcc(\x9f\xacI\xb3^\x04N$\x1c.\u03dcI\xbb\xeap\xa7\xabx\xf2Tm\xf0E\xa8:\x91\xb8Y\xcd\x04\xa5\\\xf6\x97'9\\\u7abf]\xa4:}\xeb+5\xad\xab\xabc\xef\u07bd455\x01\x90\x97\x97Gii)\xe9\xe9\xe9\x1c=z\x94\x8d\x1b7\xf6\xfa\xce\xfc\xf9\xf39}\xfa4555\xbd\xda\x16/^Lz\xfa\xe5\u0673a\x18\xd7\xecb\xb5,M\x87\xa9\x99w_&\x8b\x1e\x18\xe4\xbc\xff\xca\xdf/\xf0\xd6\a!|\x1eE\u0154,~\x1e\xccb\xf5\xae\x166\xee\x0fa(X]\x91\u00f7s\xbc\x94\xaf\xfa\x02\xcf\x00\x8d\x93\x90\"\u00f2Lk\x14\xa8\xfcX\x8d\x9b\x0e\xc2?>\x8eN\x88\x96\xf6\xd8;0\x14K\x80\x9f%*\xdc\xeei\x8f\xab\u06ef\x89\x8av\xa5\x8b\xf2\x8f\x02\xf2\x93p\bw\xba\x80\xd7\xeb\xbdf\x03[__\xcf\xe6\u035b\x99={6\xc5\xc5\u0144\xc3a\u05acY\u00da5kX\xb4h\x91c4s\xe6\xcc!\x18\f:\xc5f\u06f69s\xe6\f\x00O?\xfd4\u00c7\x0fw\xde7M\x13\u02f2\x06\xecb5mX\xf4\xc0 J\xf2\x02\xfc\xfe\x9df\xf6\x1f\xef`\xe4P\x0f\u007f|l(\xe3\x86\xfbX\xbe\xe9k\u7ccfM\xca\xe4\x9d\x03mD\xach\xe4\u056fK\xe3b}\xf3Z\x8e\x93\x90\x18\x86\xd6jN\xbc\xc6\xe3g5u'\xa3[\xa7\x19\xcf8\u0502\xe9/\xe8\xc4sB\x15_\xb7\x9f;X\xf0\xf9\xc3\xd3]\xe4\xa2\xc9\xeb\xea\xa3\x0f\xbb\u0281}>_J\xb7\xb8\x83j\x18\xd4\xd4\xd40b\xc4\b\x82\xc1 \xa6i\xe2\xf7\xfb\x99={6MMM\xd4\xd5\xd59\x86\xa5\xb5\xc64Mg\xd3Zw\xbb1\xa1\x89D\"\x8eQ\rd\xfa\t0$\xc3`\xde}\x99l:\xd8\xc6\xfe\xe3\x1d\x00|\xd6d\xb1a_+%y\x01\x06\a\x94\x13q\x9e:g\xf2\u0624LL;Z\xeb\xeaJ\x1f\xaf\xa7q\x12\\\xfc\xe8+\xa5\xf3\xe3\xddq}f\xb6rjX?y\xcd\xe6\x8b\v\xb1\xf7ax\xc8\x00\x12-b\xe4'{\xecv\x875 \xba\x98\xaet\xaf\xd9/wGG\aMMM\x8c\x1e=\xda1\"\xa5\x14\xb9\xb9\xb9\x00477\x93\x99\x99\t\xc0\xb6m\xdb\u0636m\x9b\x932\u039f?\xdf\xd9\u03eb\xaf\xbe\xea\xbc.))\xa1\xb0\xb0p@/\xd6q\u00e3\x93\xff?\xe7/\x8f\xf2\xba\xfe\xbes\xb8\xbf[v\xd0\u01aff\x0eb\xfd\xde\xc4kH\x12a]\u01c6\x05jh\u04b5\x05\xdb\xf4\x837\xa1\t\xacah\xb2\xf7ymm\xfb\x137\x0e=4\xe9%1\xb6v\xa1{u&\x82\xdf\xef\xc7\xef\xf7\xc7Lm\x94Rx<\x9e\xcb\"\xa6\xae\b\xac\xebX\xca\xca\u0298:u*Zk,\xcbr\xd6 \x01<\xf3\xcc3\xe4\xe6\xe6:m\xb6m\u01ec\x99\xa5\"\x8a\xf0\x1a\u046d\xcf\xc8\u01ebz}\u01f4/EN~\x0f\xf8.\x16\xd5O|a\xd2\xd0\xd8\xc9O\v\xb3\xba\u0565T\x9f\x1a\xa6\x18\xd67\u00b0>\x81\xe4Vm{\xb57\xe1\u026b \xee=\xe3\xce\x13\x1f\xa3.N\x02\x1d\xe9\x8co=^\xc3\u036d\xa9\xf8\xf7\xaa\xc3'@]\x9c|\xba\xb3\xaf\x83wuK\xecj\xa4\a\xb1\f+\x10\b\x90\x93\x93\u00f1c\xc7\xf0\xfb\xfdN*\xf7\xd9g\x9f\x010l\xd80\u01d4\xba/<\xed2\xb7\xeem\x86a8ib\xbc\x02\u007f*\xfa\xa5\x94r\xcc&\xf6o\x04\x9c\xfc2j)cs}\xec8\x1c\xc6\xf6(\"\x96\xe6\xe6\xc1\xd1\x02\xf9\u026fLn\xbf%z,^\x0fl\xdc\x1fb\xe5\x8fo\xa0\xb9\xedR*\u06f7\x86\xbej\xe3$\xa4\u0230\xb4\u05bb\x95\xe2Y\xf7W\x1a\x8d\xe7\x86\u0499\xf8\xd7\xf4n\x8d\x8a\xa9\u06fc\xfe\xaf\xfd\xd9E\xe3\xb9\xd3-\x9d\xa3\x12?\xe0\xdd\x10\xa7\xbfg7\xf4K\x97\xceou\xba:\xd9\xd7\xe8\x97[kMII\to\xbe\xf9&[\xb7ne\u05acY455QYYINN\x0e\x93&M\xa2\xa1\xa1\xc1\xf9l\xbc\xc8\u0276\xed\xb8mW\x03\xfb\n2_\xb6Xl\xfd0L\xf9\x84\f\x0e~\xdaA\u0371\x0e\xa6\x8cN\u3262,\xaa\xff\xddNS\xc8v\"(\xa5\x14\xa7\xceE\xa3\xac\xe2\xb1\xe9\x8ei\xf5\xa5\xd1\xd5&\x11\xd6u]\xc32\xf6B\x12\xc5T\xcd\xf3\a\x9fR\xb00\xc1\x15\xe7\xb6\u06ab\xe3\x84\xe7ic\xf3\x18\xfa\xd4/i?T\xcf\xf9\xd7\xff\x1c\xfb\xfbZ=?\xe1\xe0\xc1\xc4cC\x83\xbdq\xbb\x9b1\x06r\x17B\xeb!8\xb36\xde\x1e\x9eW\x13\u05a0\xf5_\xae\x8b\b+\x9eaM\x9c\x18]\u01f6c\xc7\x0ev\xed\xda\x05\xc0\xf8\xf1\xe3)++\xbb\xa6&\x94\xc81[\xfd\xb8\f_\xdby\x81\xff6[\xac\x98w\x83\xf3\xde\x1b\xff\f\xb1a_\xebe\x8bE\xd3.\xa6\x8fo\u05f6Q<6\xddI9-[_7\xe3$\xb80\xac]\u03e9\xd0\xf4\x95\xf62\xd0\xcbz6\u059e\x80\xafZ..\xbe\x8b\x1dS\xb4\x19\x1ec\x9d\x1b\xe1o\xff\xad*trv\xd12P\xbdt\a\xcd\xfd\x11\xfe\xdb\xef\xc0\u007f\xfb\x1d\\xg#V\xf3\xf9\x18\xba\xb6+]\x95\xb7%\xa4\x0f\x95-\x03z\xe9r\xe3\x83\x10\xf8^t\xfbj\x13\x98\u037dt\xb1\xf4:\xd7'\xfb*\xfcr\xc7z\u07ad+j\x9a8q\"\x93&M\x8a\x195\xdd}\xf7\u076cZ\xb5\u02a9Ou\xa7\xb4\xb4\xd41\xb6\x81\\\xc6\x10\x8fw\x0f\x84x\xf7@\xec\xac|\u00feV6\xec\xbbTh\xff\xf4\xcb\bs^>{]F\u0082\xab\x1a\x16X\xa8\x15\x06\xfaQ\x05c\xba7n:\xa8\xaf\x14]M\xdb\xf1\xacr\xfd$\xaf\xb6\x8d\x15\xca\u040f\xd2C7\xb4g'\xe9\xf7\x14\xd0\xdeP\x87\xf5\xf5\xd71\xa2+\xa6\x8d\xac\xacv\xff\x04\xb1\xe5Y\x81\xc7\xea\xa5Ks\x15d\x8d\x87\xd6\x0f\xc1\xfc:\x96=LS\xe3\xb7D\xdc\x1aK[[\x1b\xd9\xd9\xd9)\x19\xb8\x96\x96\x16\x02\x81@\u0705\x9b]QTwC\ub2aa\xba\xa7\x81]\xdbe\x91\x8ee\xf5Y\xb3\xeaI8\x1cN\xaa_\xd9\xd9\u0668\xf0\xf5\xf1\xa8\xdd\x05.\xa4|\x9c\x06\xf2\xe1\xf4\xff7\x9c39\xed%\x9d\x89m\x1f\xe8iZ}P\xbe\xeb9\u03fb='C\xa2\x91\xc1\x89\xd2)\x99\x86m\x1c\xa0\x9f\xba\x1aU\xfe\x9dm{\x92\xd6\xd5\r\xa5\x99\x18\xaa\u07fa(]\xae\xbe_\xe9Zw\xfd\xfa\xf5\xda0\f\x1e|\xf0A\xb2\xb2\xb2\x92\x1a\xb4\xd6\xd6V6o\xde\xcc\xe0\xc1\x83),,\x1c\xd0\x14\xa6\xa5\xa5\x85\xca\xcaJ\u018c\x19CQQ\x91\xab\x99Y]]\xad\xffT?\x86\va\xbb\xdfk\xa5\xae\x06\xa6\r\x99~\u01637\xefH\xe98\u0676\u0342\x05\v\u0135RiX\x00\xc5+\xb5\u05c3^\x12+=\xecF\xbdR\xba|\xe7b\xef\u025ei\x88\xdbT\xe6\xd3\x1f\x16{\x95a/\x89\x95\x1evs\xaaz\x94.\x1f\xb5\xad:e\xba\xba\xfe!/\x1ekI\xcc\xf4\xb0[\u007f\x81ru\u05d6\xa4t\x01\xbdv\xedZ\x1a\x1b\x1bSR\xef\xe9\xba\xf3\x97\x8a\xff\x06%\x19233)((\xe8z\xf0\xd9\xf5\u007f/SUUEmmmR\xcf$^\x8f\xe7\xf5\xd6[o\xa5\xa2\xa2\"\x99s#\xc43\xac.\xa6\xae\xd4\x19J\xdbS\f\xa5\x826z\xacB\x9fU\xa8z\xad\xf4\xf66\xbf\xe7\xd4\xfb\xbf\x8e]7I\xb6\xf6\xd28gj\x06\u069a\x02*\xa8a,p\x16\xa8\xd7Jm\xf7ft\x9c\x1a\xf9\xd6\xfbWEW\x1f\x9a\x93\x01\xc6\x14 \b\x8c\x05}\x16\xad\xeaAm'\x94vJ\xfd\u0b64u\x05AH\x81a\xc9\xc4\x13\x04\u16c2!\xa7@\x10\x041,A\x10\x041,A\x10\u0130\x04A\x10\u0130\x04A\x10\u0130\x04A\x10\xc3\x12\x04A\x10\xc3\x12\x04A\x10\xc3\x12\x04A\fK\x10\x04A\fK\x10\x04A\fK\x10\x041,A\x10\x041,A\x10\x041,A\x10\u0130\x04A\x10\u0130\x04A\x10\u0130\x04A\x10\xc3\x12\x04A\x10\xc3\x12\x04A\x10\xc3\x12\x04A\fK\x10\x04A\fK\x10\x04A\fK\x10\x041,A\x10\x041,A\x10\x041,A\x10\u0130\x04A\x10\u0130\x04A\x10\xc3\x12\x04A\x10\xc3\x12\x04AH-\xff\x1b\x00\x87\xb8\x03\x91\xaby\u0166\x00\x00\x00\x00IEND\xaeB`\x82")
+
+func third_partySwaggerUiImagesExplorer_iconsPngBytes() ([]byte, error) {
+	return _third_partySwaggerUiImagesExplorer_iconsPng, nil
+}
+
+func third_partySwaggerUiImagesExplorer_iconsPng() (*asset, error) {
+	bytes, err := third_partySwaggerUiImagesExplorer_iconsPngBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/images/explorer_icons.png", size: 5763, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiImagesLogo_smallPng = []byte("\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x1e\x00\x00\x00\x1e\b\x06\x00\x00\x00;0\xae\xa2\x00\x00\x00\x19tEXtSoftware\x00Adobe ImageReadyq\xc9e<\x00\x00\x02\xa4IDATx\xda\xc4W=l\xd3@\x14~q\x97\x8a.fh\xc5\xe8\x11A\aW\x02)\x12C\u0342@]2t(S\x9c\xad\x88\xa1\xc9\u009avCbH;\xc0\xc2P3\xb1 \x91HT\xea\x16g\"R\x87zi\xd5\r\x8fUY\\\tPG\xde\xe7\xdeU\x96}g'\xb5\x03/:\x9du~\xb9\xef\xfd|\xef\xe5\x85\xe8?I\xed6_Z\xef\x92\u025b\x9d8\x8a\xbe\xecP0\x13`\x06sxk\xf2\xc2ni\xd4\x00\xfe\x89W\x9f\r\tK\x01\v\xc0\xae\x00\x9cF<^;:\x03j\x05\xa0=\xde\xda%R\x19\xf1\xea0\xb87\x11\xb0\xc8\xe10\x95\xc72\x02\u03f7\x93\as*\xad\a\x0e}\xaf\x10\x14\xe2\U0001d5e7#\x1a\xcb\x03C\x13^{\x06\x15\xd4\x13|\u0246Z\xbc\x18\xaa\xbee\u0773ia\u07a4\xf0<\xa0\xdfW\x91\xf2\xe6E\u04e2%^\x17QH?#%\xa7p\xb8\xc2a\x8f\xd2\x1ewU\xda\xee\xf3\x1e\xbd\xdb<\xa6mw\x18\x1b\xa0\x93\xa7\xb6\x1b\xeb|h\xff\xa0\xc7\xf7\x1bJ\xfb%Y\x8d\x94\xb7\u0292Y\xab\xb7c/\xbd\xc3N\xec\xb1N\x86\x81G~\xe0\t#\x9a:\xb5\xadt\x8e\x9by\t\x02\xe0\xc1xW\x1bf\b\xc2\xfb\xbe\u07ca\x9f\xef\u031b:5\x93\x9dl$\x81\x1d\xfaw\xb2j$\xea\xd6\xd2\x11\xe66\xb2\xa0\xf7\x18bK\x8f\xb5\x8cY\xab\xc7)\xa1\xd3pt\xc3\xee\xa4Q\x12\x00\xbb|\x87\xb4\xe0\xf9\xa1\xa5\r\xa23'\x1a\x06\xdcr\xd3o\xc1\xd0'\xcb\x1b\xf1E\x1f\xbf\xbd\xa2g\x8f6\xe9\xcd\xc6W\xfasuI\u046f\xf3\x98\xbdx\u007f0\u07a3\xce\xfagf\xff.\x1d\x9d\rb#\xc1j\xe8\xd7\xf8s\x12\xfa\x19d\xa3\x88P\u04b3EQ\x9f\x10\xb9\x83LR\ag \x1e\x96\xacy<_\xa8\xeb\xf9\xba\x81\xe45\x0e\x87k\xf3uc?f4\xcai\x12A$`\xa8\xfb\xf6\xae\xae\n\xae\x1b\bw\x12_w\xc9\xd1Y?\x93\xdb\"\x01(\u009bSz\x81\x91\xfa\x11\xcfH^\u0756\x90Q\x12\u062f\xe2\u01822\x92\xd2O\x02\xef\xe9\xb4\xe05J\x03\xb9\u03abk\xe8\xa0\x12$\xf1t\x9c\xc5|v\x03,F\x14O9\xc30\xa9\x00\x0e\xa2-\x15\x00\x83\v\x00E\x89\xe9\x86\x02\xd5\xcf\"n=F?\x9dQ\xab\f\xd8\xc1\x95L\x1d\v\xaf;3\x02\x05K[\xda\u0447\u01d3@t\xb2\xaa\xa7\x90\x17\xec\xd88w\xe6b\xf0\x01\x83#\xdc\xf5\x8a<}\u0260\x87\u04cc\xb7\x18#\xf6K\xe4\x1c\xbd\xa1\xa5\xfa\x971\xc9@o\x8aqek\n\x03B1\xd2zU\xfc\x85\x01(\"\xb0*\xf2\x9f\xe6\x80/<\x1c\xe4\xb5`)\u007f\x05\x18\x00\x9a \xff\xd6\t\xfa6\xef\x00\x00\x00\x00IEND\xaeB`\x82")
+
+func third_partySwaggerUiImagesLogo_smallPngBytes() ([]byte, error) {
+	return _third_partySwaggerUiImagesLogo_smallPng, nil
+}
+
+func third_partySwaggerUiImagesLogo_smallPng() (*asset, error) {
+	bytes, err := third_partySwaggerUiImagesLogo_smallPngBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/images/logo_small.png", size: 770, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiImagesPet_store_apiPng = []byte("\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x18\b\x06\x00\x00\x00\xe0w=\xf8\x00\x00\x00\x04sBIT\b\b\b\b|\bd\x88\x00\x00\x00\tpHYs\x00\x00\v\x12\x00\x00\v\x12\x01\xd2\xdd~\xfc\x00\x00\x00\x1ctEXtSoftware\x00Adobe Fireworks CS5q\xb5\xe36\x00\x00\x02\xb2IDATH\x89\xad\x95Ih\x14A\x14@_Uwg\xa6b\x96\x89b\x16\xf0`\u0508N\xc6\xfd\"\b\x19\x0f\xde\x04\x83\x97\x80\v\xb8&FQ0(Q\xf1,.\xd1Q\b*\".\aQ\xf0\"\xe8A\x04\x97\xe8Q\xc4\x05\xb2\b\x031\xb8`\x12\x93\xc9b\x92\xae\xccd\xba\xbc\x98[\x06\xa7\x9d\xfck\xfd\xff\u07af\xcf/J\x004\x9f8\xe5\xc4\xe3\xf1\x13\xae\xeb\x1e\xf6<SF\x0e!\xa5\xe8SJ]\xad\xaa\xaa:w\xe1\xfc\u0654h<xH\xf5\xf7\xff\xba\x1b\f\x06\xea\"\x91\b\xc5E\u0179\xf0\x19\x19\x1d\xa1\xbd\xbd\x03\xad\xf5\xc3\xd2\xd2\xf9\xbb\xed\xde\xde\xfe\x93s\xe6\xe4\xd7\xd5\xef\xdfK4\x1a\xcd\t>\x1d\xaf\u07fc\xe1\xe6\xcd[u\xbd\xbd\xfd\x9f\xa5\xd6n}8\xbc|\xd6\xe0\x00\u045a\x1a\xaa\xc3a\xb4v\x0fH\xcf3\x15\xa1Ph\xd6\xe0\xd3\x11\n\x85\xf0<S&\x010\xd9\x17\xa6\x80\xdf\xef\x1e\xa0[j\x99|\x11\xcbXj\xfe\x9e\xd8~;\x93\xdf\u07d3\xbe\u05807\f|x\x8c]\xb1\x18+\\\x9b1\u07f7@$S\xc8$\x98\xe22\x84\x95G\xba\xf3\x11&9\x8eX\xbd\x1dk\xa6\x86\xfc\n\b\x18D\x81@\x18\x03\xf6<\xf4\xd3'L\xb4\xecd\xeael\xc6t_\x023\u048d{}\x1ffr\x1e\xd8`t\x1a\x93*\xc1L*L\xfc\xf9\x8c5Y\x8f\xc8\ft1\u07b2\x99\xf4\x8f\tD\xa0\x00&\x86\x91\x85I\xf0<\u0237\xb0\xd6\xd7\xff\xbf\xc0\x1b\xe8\u00bd\xb8\x85\xf4\xd71\x84\xa3\x10v\x02\xd1x\x99\xfcE\xcb\x00\x03\xb6B\x96\xaf\xca^\x90\x02\u0117O\x88\xa4\xc6\xe0\xa1\xef5\x90\xfe\xf6\x1b\x91\xa7\x10\xce N\xc3\r\x02\xebv \xb2hnF\x81~\xfb\x80\xa9\xd8\x01\xe4\x14`ID~\tB\x15`\xf4\x10\xce\xd1\xdb\x04\xd6\xd4e\x05\xcf(\b|\xbc\x871i(\xac\x00i@\x00\xee0b\xef\x15\x82>\xe0\x90a\x8b\xc4\xd2M\xe0h\x90C\xe0X0\x05\xa2p\x92\x82\x15+}\xc13\xde\xc0\xd9\u0604\b\x95\xe3\u015f\xa1\x9f=\xc1P\x02c`\xc64\x94\xfa\x13d|\a\xf6\xeamX\xd5[\xc1M\xc0x\x1f\x04%\"\xcf\xf1G\xe7\x1fkj\x85kQ\r1\xd2]m\xd8\x1b\xf6 \x17\xac\xfd?\x81\x10\x99'\xebD\x9bp\xa2M\xbe\xc1\xd3L)\xa5\xf8\x99H\f\xfa\x06\xfc+\x86\x12\t\xa4\x94}R)\xd5\xda\xd1\xd9\u016bWm\xb3\x06ok{M{G'J\xa9Vq\xecx\xb3\xd3\xd3\xd3s'\x10\f\xecX\x11\x89PTT\x94\x13|ttt\xfa\u04ff\xbfd\xc9\xc2]\x02\xe0\xd8\xf1f\xa7\xbb\xbb\xfb\xb4\xeb\xea#\x9e\xe7\xcd\xcdE \xa5L(\x15l\xad\xac\xac<\x13\xbb\u0512\xfa\x03\xb1\xb9\xfa\x1cZ7\xefV\x00\x00\x00\x00IEND\xaeB`\x82")
+
+func third_partySwaggerUiImagesPet_store_apiPngBytes() ([]byte, error) {
+	return _third_partySwaggerUiImagesPet_store_apiPng, nil
+}
+
+func third_partySwaggerUiImagesPet_store_apiPng() (*asset, error) {
+	bytes, err := third_partySwaggerUiImagesPet_store_apiPngBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/images/pet_store_api.png", size: 824, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiImagesThrobberGif = []byte("GIF89a\x80\x00\x10\x00\x84\x00\x00|~|\xcc\xce\u0324\xa2\xa4\xec\xea\uc512\x94\xb4\xb6\xb4\xf4\xf6\U0010c28c\xe4\xe2\u4106\x84\xdc\xda\u072c\xaa\xac\xf4\xf2\xf4\x9c\x9e\x9c\xbc\xbe\xbc\xfc\xfe\xfc\x84\x82\x84\xd4\xd2\u0524\xa6\xa4\xec\xee\uc516\x94\xbc\xba\xbc\xfc\xfa\xfc\x8c\x8e\x8c\xe4\xe6\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00!\xff\vNETSCAPE2.0\x03\x01\x00\x00\x00!\xf9\x04\t\x04\x00\x0f\x00,\x00\x00\x00\x00\x80\x00\x10\x00\x00\x05\xfe\xe0#\x8edi\x9eh\xaa\xael\xeb\xbep,\xcftm\xdfx\xae\xef|\xef\xff4\xcbd0IY\x06\x03F\u0280T\xa2\x18HC\n:\xb0\xa0\x84Dcs\xb9}F\xa7H\xab\xc9\xe2 $(\x111iR\xb8$\x04\n\xf5\b\xb18\x1c\x16\x98\x93B\x90\xb8\x14\x9c$\x16\x11f\x04\x0er\"dfh\x87\x0flnp\x8ctvxz|~\x80#\x82\x84\x86&\x11\x00\x10\x9f\a\n&\x15\xa0\xa0\ry$\x06\v\xa0\x9f\x12\x98\x0f\x03\r\x9f\x9f\x05&\n\x17\xb4\x10\x01\x9d\xba\xa2\xa4\xa6\x00\xa8%\xab\xad\x10\xaf%\xb2\xba\xb6%\xb8\xba\xbc%\x12\xb4\x9f\x15&\a\x00\xd8\x10\x10\x11\xc9\t\xba\t\x03%\x11\xc1\x10\a&\x0e\xad\xd8\x02&\xd2\xc6\xd5%\xd7\xd9\xdb\xdd\xdf\xe1$\xe3\xbe\xe7\xe9\x00\xeb\xd1\xe4\xef$\xae\x19\xe3Fb@\x82t\xe0\xc4\x19\x03`\xaeD\xa9O\xa0\xfa\x91\x90\xf0\xcf\u06b4y\x05\x0fb\x03\x90\xf0\xde\u0086$\x1ej\xe3g\"\x80\xb1\v\xa3\x94J\x14\b6\x8c\x04\x03\x8a\x10\x91\x91\xc0\xd0\xc0\x183\x12\xb8\x8cA#a2\x1bJ\x13+i\xb5\x1c\xf1\xd2\xd41X4m\u07ba\xa0sL\x05\x02\x10\b\x04`\xc4\xe6\xc0\x9b8&$%X\x80`\x8c\x82\x06v\n\xd8\v\x14\x80P\x05F\x16\x9eF\x9dj\xa2\xea\xd5Hu\xb6v-a\xe1k\u0631\x99\xca& p\xf6\xc4\x11\fE\xae\f\xc0\xc0\x80\x91\b\x06\x18\x92LI,\x05\u0150*\x82\x01k!l\xf8\x01b\xc5O\x18\xa7x\\\x19\x88\xe7\u03e0C\x8b\x1eM\xba\xb4\xe9\u04e8S\xbb\b\x01\x00!\xf9\x04\t\x04\x00\x16\x00,\x00\x00\x00\x00\x80\x00\x10\x00\x85\x04\x02\x04\x84\x82\x84\xc4\xc6\xc4LJL\xa4\xa2\xa4\xe4\xe6\xe4\x1c\x1e\x1c\x94\x92\x94\xdc\xda\xdc\xf4\xf6\xf4\xb4\xb6\xb4\f\x0e\fdfd424\x8c\x8a\x8c\xcc\xce\xcc\xec\xee\uc71a\x9c\f\n\f\xac\xaa\xac$&$\xe4\xe2\xe4\xfc\xfe\xfc\xbc\xbe\xbctvt\x04\x06\x04\x84\x86\x84\xcc\xca\xccTVT\xa4\xa6\xa4\xec\xea\xec$\"$\x94\x96\x94\xdc\xde\xdc\xfc\xfa\xfc\xbc\xba\xbc\x14\x12\x14464\x8c\x8e\x8c\xd4\xd2\xd4\xf4\xf2\xf4\x9c\x9e\x9c|~|\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\xfe@\x8bpH,\x1a\x8f\u0224r\xc9l:\x9f\u0428tJ\xadZ\x8f\x9b\x88\x86\x80\xb8z\xbf\xe0+\n\xf3YHH\x8d\x8e(\xccn\xbb\x89\x15\x0e`N\xcf`PE\x91\u01c3G&\xf6}G({\tI\x83\x1ekG\"\x10\x1e\x10Iz|I\u007f\x91H\x87\x85\x95{\x89B\"&\x12t\x9f$\nD\x10\n&[\b\x9aC\x15\x13\x0e\x0e\x13\x05G\b\x04\x1a&\n\x81C\"'\a\x1a\a\x17\xa9\x9b\x17\xbb '\xbf\x16\xa4\xa6\\\u016b\xad\xaf\xb1\xb3\xb5\xb7\x9b\xba\xbc\xbeC\x05\x03\x9f\xd9\fD#\x01*\xde\x11\xb0D\t\x13\xde\xdf\x1d\xd1\x1e\x11\xdf\u07e2E\b&\xec\x01\x0fF'\xf2\x0e]E\xdd\xec\xe1E\xe4\xe6\x01\xd0\x15Q'\xcf\x1d\x11x\xf2\xe8\tA@!\u06e7\x06D\x1c\xa8\x98\x18 \xc0\x89\x81\x1a\xe4i\xf0P\xe4DFo\x01\x1c\x18\xb9`n\"\x01#\x1d\xd8}\x1baD\"E\x8b\x185r$\xe2\xf1\xde\u0212*N.l\xe8p\x0e\xd3\xc4!\x12\xcdi\xb8H\u0103\x86\x92\x1b;\x02T!R\x1fHo:\x89t\x00\xb9\xb2\xa5\u02a1\x18\x91\xce\x1crbiSnOsZ\xc3\xd6\x13\xc0\xb6!\n\xa8\xf6#\x82b\uadc0\xd1\n\xa4\x00hp\b<\x80\n\x89<\x00h\"\x1f\x91\xb4\xfc\xc4\ri\xfbT \x11\xb9t\x8d\u0725\x98\x97\x93'\x87\v\xea\x92rpJ\x19+\r\x13*\x18\x11\x81 E+\x05[q=\xd8u`D1\x11#\x0e\x048\xf0\xa0\xd8\xe4\xcaF\x96a\u059c\xa7\xf3\xe7\u041bF\xf32\rGN6;\xd1\xf4\x14@QL\b\x8a\x02\x94\x04!\xbft\x84\x11\"$\xc2\x1dA\xf70\xbc\xb8\x85\xe3\u024d`gn\u0139k\f\x06\xcc,h\x90\x82\xfb\x9b\xf3\xe8\xab\b\xd8\x15\xc1o\xfa\xf7\xf0\xe3\u02dfO\xbf\xbe}7A\x00\x00!\xf9\x04\t\x04\x000\x00,\x00\x00\x00\x00\x80\x00\x10\x00\x85\x04\x02\x04\x84\x82\x84\xc4\xc2\xc4DBD\xa4\xa2\xa4\xe4\xe2\xe4$&$dbd\x94\x92\x94\xb4\xb2\xb4\xf4\xf2\xf4\x14\x16\x14\xd4\xd2\xd4TRT\f\n\f\x8c\x8a\x8c\xac\xaa\xac\xec\xea\xec424|~|\x9c\x9a\x9c\xbc\xba\xbc\xfc\xfa\xfc\xdc\xda\xdc\xcc\xca\xccLNLljl\x1c\x1e\x1c\\Z\\<:<\x04\x06\x04\x84\x86\x84DFD\xa4\xa6\xa4\xe4\xe6\xe4dfd\x94\x96\x94\xb4\xb6\xb4\xf4\xf6\xf4\x1c\x1a\x1c\xd4\xd6\xd4\f\x0e\f\x8c\x8e\x8c\xac\xae\xac\xec\xee\xec464\x9c\x9e\x9c\xbc\xbe\xbc\xfc\xfe\xfc\xdc\xde\xdc\xcc\xce\xcc\\^\\\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\xfe@\x98pH,\x1a\x8f\u0224r\xc9l:\x9f\u0428tJ\xadZ\xa7\x16\x01\xe2\x93\x10]\xbf\xe00\x93\xd2\xe8\xcc*\xc6H\xe6\x94r,\x06/\xb1|~\xbd\x80\x00x\x80\xe7\xe0\x15\xa2$yy\x0e\x14F&\x11\x11\nI\n\x87&\x8a\x87\x16H\x16,\x11,I\x16\x87\x89H\x86\x88\x8e\x11\x8dH\x8b\x11\x90D,\a\x81x\x0e\x1f\x90\n\x1a\xa7y\v\x11D\x05\x10\x0f\x0f+\x05G\x17\x04\x1f*%\x99D\x16\f[\b/\xa3\xc0/[$\f\xc6C,\t*\x1f\x04\x17\xccB\xb3\xb5\xb7\xb9\xbb\xbd\xbfC\xc1\xc3\xc5D\x02\x06\xae\x00-10\x18\x80\xe4\x00$C&\x10\x01\x13\x13\x01!\xdc0\x11\x14\xf3\xf3\tF\x17*\xfa\x01d\x18a\x00\xf0\xc1\x05#\x15\xe2\u0163\xd0\xc7\x1d<y\xf4\xec\xe1\x03\u022f\x88?\x80\x02\x87\xb8\xf0@\u0381\xc0\x04'\xd6\x0180$\xc2\a\x80\x1fb\x11apR\xe1\x03#/\xe2\u025b@\xc0H\b}\xf3\xd0\x14y03@\xfe\x00\x06EL\xa2T9\x84eA\x982\xe5\xd5\x1cB\x80\xa3+\a@K\x84\\7\xa2\u41e4)\x8b0\x90\x19\xefe\x91\x84\xf3\xe2-%\x12BaN#<e~\x00J\xc4$V\xa2B\xb6B\x9c\xe0\x95\bX\x9f4\x89\xbc\x18\xe7\xca\x1c:u\xe4\xda\tQP6l\xbd\"\"\\p\xadH\xc4\x1f\u05ccDdpUq\xb0H\t\xb3\f\x8b\x10V\x18\x11\xb1b\x88\x8c\x878\x86\b\xf9\x9e\xa9S\x1e\x1e4R0\xc2\xe9\xa9\x05\xb8\x86X\xfb\x00!6\xb0\v.j%\xa8T\u0102\x8ca\x15\xa8\xc1\xb0P\x01A\x00\x042\x84;\x83&M\xf8\xec\xdaF,\xe0\xd6\xcd\x1b\xd8\xef\x0f\b\x82[\x1c\x10h\x8f\xed?\xae<\x10\xd2,\x82\x13\xa8\xf2\x9f\x8eL\x12\x15)\x82\x88\xea\xd1\xdd+\x10>\xb8\xbc=\"\n\xd0'YO\xdf\x02\x89\x06\x12pP\x82\x11\"\xac\x91\x82\ao\x94@\x1f\x1d\f6H\x85\t\x15@\x03\x9d\x83\x14Vh\xe1\x85\x18f\xa8\xe1\x86r\x02\x04\x01\x00!\xf9\x04\t\x04\x00\x1c\x00,\x00\x00\x00\x00\x80\x00\x10\x00\x85\x04\x02\x04\x84\x82\x84\xc4\xc6\xc4DBD\xa4\xa2\xa4\xe4\xe6\xe4dbd424\x14\x12\x14\xd4\xd6\u0534\xb2\xb4\x94\x92\x94TVT\xf4\xf6\xf4trt\f\n\f\x8c\x8a\x8c\xcc\xce\xccLJL\xac\xaa\xac\xec\xee\xec\x1c\x1a\x1c\xdc\xde\u073c\xba\xbcljl<><\x9c\x9e\x9c\\^\\\xfc\xfe\xfc\x04\x06\x04\x84\x86\x84\xcc\xca\xccDFD\xa4\xa6\xa4\xec\xea\xec464\x14\x16\x14\xdc\xda\u0734\xb6\xb4\x94\x96\x94\\Z\\\xfc\xfa\xfc|~|\f\x0e\f\x8c\x8e\x8c\xd4\xd2\xd4LNL\xac\xae\xac\xf4\xf2\xf4\x1c\x1e\x1c\xe4\xe2\u4f3e\xbclnl\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\xfe@\x8epH,\x1a\x8f\u0224r\xc9l:\x9f\u0428tJ\xadZ\xafI\x98\x89\x05\xb9P\xb0\xe0\xf0\x15fI!E,I\xc6\xf11~\x06\x95\u0563\xc2H\x88\xef\xf8\xa5l\xf3\x00<\x02\"E\x111\x00\x85\x00+\x010C\x1f}\x86\x85+mE0\"\"\rY\x94fG)\x14\"_H)\x94\x8aH\r\xa1\x97\x95\xa6\x99D2 \x8e\x1d\x18\x81B2\x03\x8e\x8f\x13B\"\xb3\xb4\x85\x03\x9eB%\x04\x1e,&\xa2D)-\v\x1e\v3\xa9C)3\xc8'-\xccB\x14\n,\x1e\x04%\xd3\x1c2\x13\x10\x10/2G\xbf\xc1\xc3F\xc6\xc8\xca\xd3,+\xb4$\nC\x1a\b\xba\x00\x12B\n$\xf4\x00\xefC\"\x1a*\x01\x00\xc2+R\x82\x05@\x80\x11\x8c\xb48\x18\x00B\t#\x17\x02\x06\xd4P\xa0H\x83\t\x01\x01\x86 v\xeb\x9f\u0101D\n2L8\x04\xc6\x06z\x1e29\u0437B\b;}\x0f \fi!\x11\xa0\xcc\"32\xaaPA\xc0H\xfe\x88\x83\x00/\x18\x81\xb0\x13`\x80\x16EDx`\xe8\x01\xd6\u031a\r\x8d\xe4,\u0293\x88I\x94\x99h\xb0\x14\xb2\xa0\x91\xae\x1579\xd0\xdc\x190\uc408F\xab\x16\t\x01Uh\x11\xa2\x19\x8f&\xf5\xa0\xb3i\x91\xb1\a\xcd\nA\x1b `O\"\x10\xbc\x16\xe2'D\x1e={\x1c\xf0\xe9#\u0321\x80\x86\xb8 \x87\x14\x8cK\x92H\x84\xb8,\x1e\x161Q\x93\xa2$\xb6F7\x16q\f\xd9\xc8d\xb2\x95}\xb12\xd4\xc1@\xc5X\x19\xbe\xda\xe2 b\xb5\xae\x01NS\x94\xd0\xf0MA\xaff\x11\xd2]\u0616\xe2\u0082\x00\v\"l\xabv-\u06f6n\x10<L\x10WD7o\b\xbe\xcf\x05O6\u0708\x05\x06\x1d\xfc\xa8x\xbd\x88\x90!D\xbd\x04\b~$\xc0\b\x8c\x02\xa7\x90p\x12\xb1M\b\xa8\x02\xbf\xab\x8b(\x00\xa3>\x87\xf7\"p$\t|\x96\u0207I\x16%\x14h\x84\b\x10\x80p\x00\r\xed\x15!\xc0\x00$\xc8A\x82\v\xa9\xe5\xa1\xe1\x86X\x13T\x13\x9d\t\xf9q(\xe2\x88$\x96h\xe2\x89(\xa6\xb8D\x10\x00!\xf9\x04\t\x04\x000\x00,\x00\x00\x00\x00\x80\x00\x10\x00\x85\x04\x02\x04\x84\x82\x84\xc4\xc2\xc4DBD\xa4\xa2\xa4\xe4\xe2\xe4$\"$\x94\x92\x94dbd\xb4\xb2\xb4\xf4\xf2\xf4\x14\x16\x14\xd4\xd2\xd4424\f\n\f\x8c\x8a\x8c\\^\\\xac\xaa\xac\xec\xea\uc71a\x9c|~|\xbc\xba\xbc\xfc\xfa\xfc\xdc\xda\xdc<:<\xcc\xca\xccLJLljl\x1c\x1e\x1c\x04\x06\x04\x84\x86\x84DFD\xa4\xa6\xa4\xe4\xe6\xe4$&$\x94\x96\x94dfd\xb4\xb6\xb4\xf4\xf6\xf4\x1c\x1a\x1c\xd4\xd6\xd4464\f\x0e\f\x8c\x8e\x8c\xac\xae\xac\xec\xee\uc71e\x9c\xbc\xbe\xbc\xfc\xfe\xfc\xdc\xde\xdc<><\xcc\xce\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\xfe@\x98pH,\x1a\x8f\u0224r\xc9l:\x9f\u0428tJ\xadZ\xaf\xd6P\"p\x10\x98\xb0\xe0\xf0U\x12K^\x02\x83A\xe0R\xb4D0\v\x87\x8aCR\x88\xefwKK\xd2B\n4\x1d\x00\x06\x13}D\x04\v\x00\x89\x00\v\x04D\x13\x0e\x8a\x8a\r(F\n\x12\x12\x16Hz|I\x16\x97vH&\x9fI\x96\x12_H\xa5\x99F\x16/\a\x1e#\f\xaaC\x17\x1c\x91*\x0f\xa70\x17\x88\x91\x8bl0!\xbc\xbd\x1d\x1b\xa00\x16\f\xae\a/\xb2C\xac\xae\xb0\xcdB-\t+\x1e\x04\x17\xd20\x05\x11\x0f\x0f,\x05G\x17\x04\x1e+%\xc6\xce\xc9\x1e\xcb\xda\f\x14\x01\xef\x0f\xbfC\x1b\xbd\x00\"\xf3\x14\xf6\x89\x14B\x13\xfb\x89\x1ad\x98\xb5\xe2\u077b\x19F\xdc\xc1\v \xcfH\x85\x85\x14&\x84(b\"\x02\xbcw \xd0\xc1\x900\xc1`\x80\x04F.\x14\\\x88\xb0\b\b\x83\xef*\x10i\xd1`\x1fH!\x03\x00\xca\x10R\x0f\xe0\x82\x970^\\\xa4@\xa1\x91\xfeI\x94\x01T\x16y\xc0\xf3]\x00\x06E$x\xf0\xe8AB\x11\x06K\x17>0\xa2\xb3hO#  \x06]\xd9\xd2^\x89!2\x00\x0e\xa0\tp\x11\u0387F\xaf\x9a\xd4*\x94\b\u044b\x1e\x90\x12Q\xba\xb3\xe9\u04cb\xf0\xa6\x16A\x1b\x00\x9eO\"3\xf0\xae\x98'\x04\x81=\x03\x94\x84\xe8\xdb\xd7\x0f\xc6?\x80\x02\t\xe2-\tX0a!% J,\xa2 \xab\u044cEB\xb8\xc0\x8bS2\xcf\x00\x94\x9dU8\xc0e\x864\x06'l\x050\xb6\xcb\u0782\xc4\xc1\x00\xd6q6CY\x05m\x16V\xb7\xd6F\xcd\x1a6m\xdc\x1ex\x88\x10\xae\xcd\x05\x17\xde\x12\x14\"b\xa1\xf7\xba\xdfG<\x85\x98^\xe4\u0147D\x1cFp\x87\xe1B\xd8\"\x17\x8e\x02\xf5\x9add\x0f&M\x12\xb6w\x8a\xaf@\x9b\x10\x05!$h$\x82\xdfT\x12\xf7\xf6=!\xc1eD\\@\x01\x06\x18P\x90\x983\x11\xa4\x10\x87\x03'@0\x1e\x1e\x14V\x18F\x01 \x94\xf3B.\x16\rv\xe8\xe1\x87 \x86(\xe2\x88$&\x11\x04\x00!\xf9\x04\t\x04\x00\x19\x00,\x00\x00\x00\x00\x80\x00\x10\x00\x85\x04\x02\x04\x84\x82\x84\xc4\xc6\xc4DFD\xa4\xa2\xa4$\"$\xe4\xe6\u4512\x94\x14\x12\x14dfd\xb4\xb6\xb4\xf4\xf6\xf4\xdc\xda\xdc424\f\n\f\x8c\x8a\x8c\xcc\xce\u032c\xaa\xac\xec\xee\uc71a\x9ctvtTVT,.,\x1c\x1e\x1c\xbc\xbe\xbc\xfc\xfe\xfc<><\x04\x06\x04\x84\x86\x84\xcc\xca\xccLJL\xa4\xa6\xa4$&$\xec\xea\uc516\x94\x14\x16\x14trt\xbc\xba\xbc\xfc\xfa\xfc\xe4\xe2\xe4464\f\x0e\f\x8c\x8e\x8c\xd4\xd2\u052c\xae\xac\xf4\xf2\xf4\x9c\x9e\x9c|~|\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\xfe\xc0\x8cpH,\x1a\x8f\u0224r\xc9l:\x9f\u0428tJ\xadZ\xaf\xd8%\x83\x10\x98t\xb2\xe0p\xd5`HvH\x1a\x8f*T\\\x1c,\bG\xaa\xa0Z\x88\xefM\x93$$I\x9aB!-G&,(\x00\x00(,&D-\x01)\x87\x87\x17_B-$\x1b\x90\x90\x15'Ez|~\x80\x82H\v\xa0I-\x80vH\xa6!\x8bF&\x18\a\x1c\"+\xacD\x12\n*\x1c\x04\f\xb4B,#\x98#\x11D,\b\x98\x87\x1a\x9b\x19%\xc5\xc6\x00\x0e\a\xb4\xae\xb0\xb2\xbcB\xb6\xb8\xba\xd5\x19'\x11\x0f\x0f,\xc9E[\x1c*\n\xa1D&+\xb0\a\x18\xda+/\x01\xf0\x0f\fF%\xf1\xf1\x13eD\r\xcd(D\x1e\xcd\x00 p!$A\xc0C\x03\xf4exwo^\xbd{/\xf2\xb5\x89\x10\x0f\u0787sBBL\x80\aO\x81\x11\x06*8\x06\x80`\xe4\x03Gx%\x8c<x\xc12@\x80\x15DB\x1cT\xf8( \t!\x86\x0e\x82\xa0'\xc4d\xfe\xc5\x00)\x8b\xacl\xf9\xb2H\b\x0e\"9\xb0!\xb2\x02iC#\x18*\xb2$P\x12\"P\x95'9\xc0\x1c\"3 \u034373\xe4\fX\x80g\x86\x0fV\x83\x12YYQ\xabQ\x0eR\x95\x16Y\xf1\xf3\u0143\x87\xf0\xe2Q-\x02\xe1\xa7\n\xb3C\x14@\x94H\xc4B3\v\xff\x02\xa6 \x98\xc1\xe0\xc1\x84C\xfa\xb6\xfckD0G\xc2CZ\xa0\xcd{\xb1\x88\x01\x17?=\x8aS\xf1\x93$\xa7\x12\a\x02\x1c\x80\xa0\xcd\u0583\\\xbb\x8a|\xf8\x05\t\xc1^!\x11jbB&\xa4\x84nL\x0eTDC\xad\x9a\xb5\x11\u05f0\xb5q{\x1d!\xdc\x10\x13\f\\xS\xb0\x14\x1d\x84u%\xb4e\xf8c\xa0\x0f\x12\xee-\xb4-\x88\xc0\x0f\x80\x05\x16\xa8(9\xc2$)3\x85K\xc64q\n\xd1\xfd\x93\x81\xf0\xa9\f\x04*\xa5?\xfdq@\u0689q\x82sE\b@\x82\x05\x03<\xa0\x10%*X\x90\x82\x1c\x17p\x80\x11\x1e\x14V\x88\x05\x03\x13\x04 \x82\x00\x16\fv\xe8\xe1\x87 \x86(\xe2\x88\x15\x06\x01\x00!\xf9\x04\t\x04\x004\x00,\x00\x00\x00\x00\x80\x00\x10\x00\x85\x04\x02\x04\x84\x82\x84\xc4\xc2\xc4DBD\xe4\xe2\u4922\xa4dbd$\"$\x94\x92\x94\xd4\xd2\xd4TRT\xf4\xf2\xf4\x14\x12\x14\xb4\xb6\xb4424\f\n\f\x8c\x8a\x8c\xcc\xca\xccLJL\xec\xea\xectvt\x9c\x9a\x9c\xdc\xda\xdc\\Z\\\xfc\xfa\xfc\xac\xaa\xac\xbc\xbe\xbc<:<\x04\x06\x04\x84\x86\x84\xc4\xc6\xc4DFD\xe4\xe6\u4926\xa4dfd$&$\x94\x96\x94\xd4\xd6\xd4TVT\xf4\xf6\xf4\x1c\x1e\x1c\xbc\xba\xbc464\f\x0e\f\x8c\x8e\x8c\xcc\xce\xccLNL\xec\xee\xec|~|\x9c\x9e\x9c\xdc\xde\xdc\\^\\\xfc\xfe\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\xfe@\x9apH,\x1a\x8f\u0224r\xc9l:\x9f\u0428tJ\xadZ\xafXl\xa4\xd2)X\xb2\xe0p\x950I\xa6f\x1bE\fS\\P\x0e\xab\a\xc3\x11b\x8b\u0158\xd7\xe4\x95\xc4L&\vI'\u007f\x81F\v\x15\a\x00\x1c\x12\x02E \x06\x0f\x00\x92\x00\x1f_B\x04\n\x93\x93\x1c\x14\x85C~\x80\x82\x84I\v\u007f'\xa4\u007fvE\x18\x1a\b\x1d$\t\xaaC/\r,]\x16\xb2\x97\x19\x10\x10\x19 E'\x10+\x9a(\x964\x18\x1d\x91\x9a\x00\x06|\x18,\xc3\xcb\x00\f\rD\xb4\xb6^\xb94\x04\xbb\xbd\xbfF\x16\x05\x1d,\r\x9e\x9f\t\xae\b\x1a\xda\t0\x01\xee\x10\xc6C)\xef\xef\x15\xdfC'\x19\xef\xee!\xe6\x16#\xa4\x89\x18\"c\x834\x00#4\xd0\x00!\u1824\x81\xf3\xea\xc1\xb8\al\x1f\x8c~\xe6hL\xa8\xe0\xce]\xb5\"\x16Xt\f\xd0\xc2H\x88\x8e\xeeR\x18\x81p\xd1]\x80\x04E&t\x18\u0661\u0310\x06\a\x1d\xf0\xa1\x91@\xd9\xfe2\x0e\x05h\x00t\b\xc0\x01\x11\x96\x17\x03\xbc\x8c9\xb3^\xcd\"\t\x9a\xc23\xa2\x81\xdf\u0160EBH\f\xa0\xb2\bK~\x1d`\x12\x91i\xf5\xe9\u035c6[\xf8\xd4\x04Th@\x87F\x87|\xbd\x18\x96iY\x9bC\x12\xf0{\a\xc1\b=\x970\xb0\x12i\xb1\x97\x85<!\r$R$\xb2@\xabK\u007fD,$Z6c\b\x01\x15\a\x0f(dH\xd4\x00\x91\xc4\x1d\x17\x0fi\\/\x00d\" b\xec\xfd\x18\x99\xc5\u0792\xabR \b\x80\xa0\x856Z\x10ni\xe3\x96;\x03\x816\x01\xa2IB\x01\x9b\u0189d?\r\x94y\xb6v\xd2\n\xd64p\xeb6\u00bb\x83o#\x18,\xc4\xe0\xd5\x00\xef\xa7\x16\xe9Rh;6\x01\xc4\xce#~@,\x18Oc\x01\x88PF^\x90@!\xe9\x83B\"\x04\fp\xd04\xa0\x84e\x13\xd2p\x92Qz\xeb!\xe1\x1e|G\x1cx\n\x12zL\xc0\xde\x1dKX\x80\x8f\x11\r\\\xe0\x80\v$\xe4\xf2\x02\x05(\x1d\u0131\x82\x031,\b\xe1\x88$\x82\xe1\x81+\x15\xf8W\xe2\x8a,\xb6\xe8\xe2\x8b0\xc6(E\x10\x00!\xf9\x04\t\x04\x001\x00,\x00\x00\x00\x00\x80\x00\x10\x00\x85\x04\x02\x04\x84\x82\x84\xc4\xc2\xc4DBD\xa4\xa2\xa4\xe4\xe2\xe4$&$dbd\x94\x92\x94\xb4\xb2\xb4\xf4\xf2\xf4\x14\x16\x14\xd4\xd2\xd4TRT\f\n\f\x8c\x8a\x8cLJL\xac\xaa\xac\xec\xea\xec424|~|\x9c\x9a\x9c\xbc\xba\xbc\xfc\xfa\xfc\xdc\xda\xdc\xcc\xca\xccljl\x1c\x1e\x1c\\Z\\<:<\x04\x06\x04\x84\x86\x84DFD\xa4\xa6\xa4\xe4\xe6\xe4dfd\x94\x96\x94\xb4\xb6\xb4\xf4\xf6\xf4\x1c\x1a\x1c\xd4\xd6\xd4\f\x0e\f\x8c\x8e\x8cLNL\xac\xae\xac\xec\xee\xec464\x9c\x9e\x9c\xbc\xbe\xbc\xfc\xfe\xfc\xdc\xde\xdc\xcc\xce\xcc\\^\\\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\xfe\xc0\x98pH,\x1a\x8f\u0224r\xc9l:\x9f\u0428tJ\xadZ\xaf\xd8\xec\xf2\"@|\x12\"\xadx\x1c\xbd\xc8\x14\xc9J\xa3C\xb3\x18%\x90M\u02b1\x18\xc0\xc8\xd0KK\xd2J^$\x12hH&\x80\x82G\n\x80&G\x12\x1f\x0e\x00\x1e4\x05E\x18 \x00\x96\x8f\aaB(\x13\x97\x97\x0e\x15F\x84\x81I\x88\x12\x8aH\xa6\x17G\x170^$\f\xabE-\t*\x1f\x04\x18\xb2D\x05\x11\x0f\x0f,\x92F\x18\x04\x1f*%\x86B\x12\x1a\x1e\x9e \xc11-\a\x9e\x96\x0e\x1f\xab\n\x1a\u04d7\v\x12\xbb\xbd\xbf\xcfD\xc3\xc5\xc7F\x17\f^\b0\xbaC\f\x14\x01\xef\x0f\x18F\x16\xf0\xf0\x15\x9aC&\x11\xf0\xef!\xc81$Tx\xf7.A\x91\x04'\xa6\xa5x0D\x80\x01m\x00\\\u0208\x91\xa1\x13D\x00$\xf4\xf1\xa3\xe0\x0f\xa0@\x82\x01\fNR\x01r\x86\x91\x10\x04\u07f9)\xf2\x80\xe3\xbb\x00\f\x8a0\x02\xf9\xa1\x1b\x11\x06\x1f@2\x1cr\xe1\x03\xfeD\x1a\x82^0\xd3\xe6\xc0$\u008b\x00\x0e\f\x99i\xaff\x11\x9c:\x8d\xc0\xe8\u01d1\xc0I{*\x8d\xb4\xec\xf7!&\x11FT\x9d\xde\xec\ao\xa7\x90\v\x0f r@E`\xe84\a1K$\xbc8b\u91f06\u06d1\xa5`vH\xbd\x97\x14\xac\x16\x99AV\u017c\"%\xb0\xe2+\xa2 \x84\xbd\x00\xff\x8a\x88xAV\xe4\x10\x16\v\xa6y0\v\xe3\xa16\x89\x14-B\xcc(\xa4\xf1\xe3\xc8D&W\x16\xa6\x82\xac\xc9\"\x17, \b\x80`\x06;!\xb4l\xe1\xba\x1d\x83\u05c3\x0f\x11\u009d\xc5\xf0\xc2W\x82>_\x0f\xb8\x050`b2i\x9a\x1f(R0b\xf9\xb6p\xbe\x81\v\x8fq\x81\xb8q\xe4D.\xccHg\x817w\t\"\xc0\x9bC\xaf\xc0|\f\x05\"H\xa5\x8a\x8fJr\x00G\x1e88\x1f\x82a\x80'\x0f\a<\u00c96\x1e\x84\xc2X|\x00\x11\x01\xdf)I\xec!\x81{xXa\x02\x06\xea\x85GB\x03\x13pP\x82\x11\"\x1f\xacpB\n\x1e\xd4Q\x02\x84\x11\x96h\xe2\x13&X`Kp'\xb6\xe8\xe2\x8b0\xc6(c\x8cA\x00\x00!\xf9\x04\t\x04\x00\x1c\x00,\x00\x00\x00\x00\x80\x00\x10\x00\x85\x04\x02\x04\x84\x82\x84\xc4\xc6\xc4DBD\xa4\xa2\xa4\xe4\xe6\xe4dbd424\x14\x12\x14\xd4\xd6\u0534\xb2\xb4\x94\x92\x94TVT\xf4\xf6\xf4trt\f\n\f\x8c\x8a\x8c\xcc\xce\xccLJL\xac\xaa\xac\xec\xee\xec\x1c\x1a\x1c\xdc\xde\u073c\xba\xbcljl<><\x9c\x9e\x9c\\^\\\xfc\xfe\xfc\x04\x06\x04\x84\x86\x84\xcc\xca\xccDFD\xa4\xa6\xa4\xec\xea\xec464\x14\x16\x14\xdc\xda\u0734\xb6\xb4\x94\x96\x94\\Z\\\xfc\xfa\xfc|~|\f\x0e\f\x8c\x8e\x8c\xd4\xd2\xd4LNL\xac\xae\xac\xf4\xf2\xf4\x1c\x1e\x1c\xe4\xe2\u4f3e\xbclnl\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\xfe@\x8epH,\x1a\x8f\u0224r\xc9l:\x9f\u0428tJ\xadZ\xaf\xd8,\x16fbA.\x14\xadx\x1c\x85YRH\x11K\x92q|\x8c\x9fAe\xf5\xa80\x12\xe4a\x8a\"\n#S\"\"0I\r\x81\x83H0\x81\rI\x89\"hF2\x1b\x0f\x00\x0f\x01\"E\x111\x00\x9b\x00+\x01\x87\x1c\x1f\x93\x9c\x9b+oE\x8d\x8b\x88\x81\x8fE)3\v\x1e'-\xadC\x14\n,\x1e\x04%\xb5B2\x13\x10\x10/2G%\x04\x1e,&\xa0z-\xb1\v3\xbd2 \xa4\x1d\x18\x97\xbe\x03\xa4\xa5\x13B\"\xd9\u069b\x03~B\xc6\xc8\xcaF)\xcd\x1e\u03fd\x1c-*\x01\xf0\x10%F\x17\xf1\xf1\x1a\x05E\r\x13\xf1\xf0!\xcb8\x88\xd0\x00\x0f\x9e\x02#%X\x14\f\x10\xa1\b\x8b\x15\xdaH\x1c\x14\xa2\x01\x018\x00\x12\x84( q\x11\x80\xc4!\x03\x17N$\x92pa\xc3\"!\n\u00bb`\x04\x82\x8a\x97\x01\x02\xb4(\"\xc2\xc3B\x0f\u05c6\xb4\xb8'\xcf\xc8\xfe\f\u007f/\t\x10\x81\xb1\u1887G\x0e:\xae\x10\xf2\xb0\xe3\x03\b:y\x06\x80Z\xe4\xe7\u02e0FBHeY\u0125?\x994=\x00\xc5Yd'L\x15T\x89\u0603\x17O\xe8\x10\xa2F\x1f\xd1P*d\xc1(p+\u049a-\x98v\xc8\u0698*\xdc\x12\x89\xf0\x95\x05\xbd\"&x\xe6C\xa5\x95-\xc0\"\x054|\x1d9$\xe1\u05d3C \xdc\xdd\xf4\x91\xa2Ep\x199l\xec\u0619C\xe4\xc9\bY\\FwaA\x80\x05\x11\xda\xdd\u02b5\xab\xdd/\b\x1e&\x10sUBC0\x05\xe3\xf4Dpv\xa1W\x89i\x9c:\x18\xd0\xe7+\x03^n\x02\x91\x83\x1b\x903E\xef\xdf\xc1\x85\xa4\x18\xbe\xae\xf8\x11@\x05\xb2\x13\x01\x0f\xa3\x9d\x10\x18\x05\x041J\xaf\xea\b\x1fGG,0\xe8@I\x05\xf3!\x1f4q\xf24N\xc0\xe6R\x02\x18\x81\x9e\b\xed\x19\xf1\x9eyy$\x88J\t\x05\x12!\x02\x04 \x1c@C\x80E\b0\x00\tt\x90\xe0\x02f\n\x15v\xe8\xe1\x14\xb7\xe0f\x82x\x1f\x96h\xe2\x89(\xa6\xa8b\x13A\x00\x00!\xf9\x04\t\x04\x000\x00,\x00\x00\x00\x00\x80\x00\x10\x00\x85\x04\x02\x04\x84\x82\x84\xc4\xc2\xc4DBD\xa4\xa2\xa4\xe4\xe2\xe4$\"$\x94\x92\x94dbd\xb4\xb2\xb4\xf4\xf2\xf4\x14\x16\x14\xd4\xd2\xd4424\f\n\f\x8c\x8a\x8c\\^\\\xac\xaa\xac\xec\xea\uc71a\x9c|~|\xbc\xba\xbc\xfc\xfa\xfc\xdc\xda\xdc<:<\xcc\xca\xccLJLljl\x1c\x1e\x1c\x04\x06\x04\x84\x86\x84DFD\xa4\xa6\xa4\xe4\xe6\xe4$&$\x94\x96\x94dfd\xb4\xb6\xb4\xf4\xf6\xf4\x1c\x1a\x1c\xd4\xd6\xd4464\f\x0e\f\x8c\x8e\x8c\xac\xae\xac\xec\xee\uc71e\x9c\xbc\xbe\xbc\xfc\xfe\xfc\xdc\xde\xdc<><\xcc\xce\xcc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\xfe@\x98pH,\x1a\x8f\u0224r\xc9l:\x9f\u0428tJ\xadZ\xaf\u062cv\x19J\x04\x0e\x02\xd3vLvJb\xc9K`0\b\\\x8a\x96\bf\xe1PqH\x8a\xa9\xa5%i%-\x12\x12yH&\x81\x83G\n\x81bH\x89\x12\x16H{}H\x02\x1a\x1d\x00\x06\x13~D\x04\v\x00\x9e\x00\v\x04D\x13\x0e\x9f\x9f\r(F\x8d\x8fF\x16/\a\x1e#\f\xacD-\t+\x1e\x04\x17\xb4C\x05\x11\x0f\x0f,\x05G\x17\x04\x1e+%\x87C\x16\f\xb0\a/\xbcB\xae\xb0\xb2\xd1\x17\x1c\xa6*\x0f\x8b0\x17\x9d\xa6\xa0o0!\xdf\xe0\x1d\x1b\x87\xcc\xce\xd0F\f\x14\x01\xef\x0f\xe2D\x15\xf0\xf0\x13!E&\x11\xf0\xef \xca0$Lx\xf7.\x81\x91\v+\b\x06\x98\xd1N\xa1\xbc\"\x1b\xc0\x01\x101\x8f\x82DO\x14\x84L\xb8\xe8\xa9A\x86!\b\x152,\x02\x82\xe0\xbb\nF\x1ePX\x19 \x00\x83\"\x12<(\xf4 \xa1\b\x03\x99\xf6\x1e\x18y\xd1o\xa5\xfe(\x92&\x03\xa0\x1c\u04a2\xc1E\x83B\x06p\x94!$\"\xc7\x05Ha\xf0\\\xe9\xd3\b\b{'S\x9a\xf4\xf0\x92H\u031e4m\xf6\x83\xa7\xb3H\xbdw\xf0~\x12\xb9\xaap\xa8\x90\xa2\x17K\f\x91\xc1q@S\x8e\xa0\xa2\x9emIA\xed\x90\x19cW\xcc\x1bR\x02+\xbe\"\n\u0636\xfcW$\x84\x8b\xb1QA\xae\x18;\x92\b`\x96\x82\x8b \x90h \x95\x10\x8b\x173\xc2\xd8\xc8\u0463d\u02ad*\x1c\xf82#\x1a\f[\xb8t\xb9\xf6\xf5\xc0C\x84ap.\xb8\x00\x96@\x13\x11\v3\x9cUpmA5\xebh\fNd\vp\u021b\xc4\x05\x9e\xc9q\u0133,\xb8\x87\x03\u00cf\x00\n\u1ed5\x84\x10\n\\\vQ\x10BP\x12\xf2\x12\xb8\x19\xe1\xe3\b\xd2\xf7\xeeD^|\xf0\xc4a\x04|\x17\xe5@\xb9\x18e\t\x1c\xaa\xf5\x81\x88W\u0180RH0X\x11\x17P\x80\x01\x06\x14x\xb6L\x04)\xd0\xe1\xc0\t\x10\xc0G\xe0\x85\x18FQ\x00\b\xc7\x0e\xbc\xa0^\x86 \x86(\xe2\x88$\x96(D\x10\x00!\xf9\x04\t\x04\x00\x19\x00,\x00\x00\x00\x00\x80\x00\x10\x00\x85\x04\x02\x04\x84\x82\x84\xc4\xc6\xc4DFD\xa4\xa2\xa4$\"$\xe4\xe6\u4512\x94\x14\x12\x14dfd\xb4\xb6\xb4\xf4\xf6\xf4\xdc\xda\xdc424\f\n\f\x8c\x8a\x8c\xcc\xce\u032c\xaa\xac\xec\xee\uc71a\x9ctvtTVT,.,\x1c\x1e\x1c\xbc\xbe\xbc\xfc\xfe\xfc<><\x04\x06\x04\x84\x86\x84\xcc\xca\xccLJL\xa4\xa6\xa4$&$\xec\xea\uc516\x94\x14\x16\x14trt\xbc\xba\xbc\xfc\xfa\xfc\xe4\xe2\xe4464\f\x0e\f\x8c\x8e\x8c\xd4\xd2\u052c\xae\xac\xf4\xf2\xf4\x9c\x9e\x9c|~|\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\xfe\xc0\x8cpH,\x1a\x8f\u0224r\xc9l:\x9f\u0428tJ\xadZ\xaf\u062c\x16\xcb \x04&\x9d\xadx\xfc4\x18\x92\x1d\x92\u01a3\n\x15\x17\a\v\u0091*\xa8\x16F\x93$$I\x9aB!-I\v\x80\x82H-\x80x\x87\x80&Hz|~\x85G&,(\x00\x00(,\x8dC-\x01)\x97\x97\x17aB-$\x1b\xa0\xa0\x15'D&\x18\a\x1c\"+\x9bD\x12\n*\x1c\x04\f\xb3C'\x11\x0f\x0f,\xabF]\x1c*\n\x86\xac+\xaf\a\x18\xbbB\xad\xaf\xb1\xce\x19\xb5\xb7\xb9\xce,#\xa8#\x11D,\b\xa8\x97\x1a\xc2%\xe0\xe1\x00\x0e\a\x8a\x19+/\x01\xee\x0f\fF%\xef\xef\x13gD\v\x11\xef\xee\x1f\xc8B!&\xb8s\xa7`\x98\x8a\x81\x01 \x18iW/\u07bcz/\xee\x15ip\x0e\x05\x11\x0f\xe7\x00 p!$A\xc6K\x1e\xf0e\xf80\xd0]\t#\x0f^\xa8\f\x10`E\x91\x10\x1c\x10rpCdE\u0306F0\xf0SI\xc0\b\xfeI~\x01N\x16I\xb9\xb2%\x91\x10\x1fE~\xcaHB\x88\xa5\x8f \\\n\xf9\x001(\u0292\x1c\xa4\x0e\x81\xb9sf\x91\x15@_<x\xe8\xee]\xcf\"T\x11\n%\x92\x92_\u05a3I\x87,=\xd74\xc3\u04cc \xe4\t\x81\x00T\x85^\"\n J$\xd2\"-K\u007fE\f\xb8\x00Z\xb0\b\x03\x15@\x15\x16\xe1\xbb\u04af\x91\xc0\x03\a\x0f\xb1p\xce\xc2\u014c)8f\xf0\xf81\xe4\x10\x13%\x0e\x048\x00aZ\xad\a\xb8t\x19\xe9\x05;\x820V\f\\\xfcR@\x93\x15\x84e%\xa6\xa1V\xcd\u06b5\x02\xd8\xd7\xd0j\x03\x85\u0b10\bsA\x8d\x13R\":\xa8\r*v\xfd1\xd0\xc7Q\b\x03-\xa6\x912\x10(I\v\xf2\xeb\x8c\xec\t!>\xc3\xf6\ue4fe\x877\xa2\x8f\"\x00\v,\xd2w\x8a.\x8a\x13\x85S\xe1\xa8B\u0180\x04\xf2r\x9b\x11\x02\x90`\xc1\x00\x0f\x88D\x8a\n\x16\xa4@\xc7\x05\x1c\xfcS\xe0\x85\x18>\xc1\xc0\x04\x01\r\x88 @\x86 \x86(\xe2\x88$\x8e\x11\x04\x00!\xf9\x04\t\x04\x00-\x00,\x00\x00\x00\x00\x80\x00\x10\x00\x85\x04\x02\x04\x84\x82\x84\xc4\xc2\xc4DBD\xa4\xa2\xa4\xe4\xe2\xe4$\"$dbd\x94\x92\x94\xf4\xf2\xf4TRT\xd4\xd2\u0534\xb6\xb4\x1c\x1e\x1c424\f\n\f\x8c\x8a\x8cLJL\xec\xea\uc71a\x9c\xfc\xfa\xfc\xdc\xda\u072c\xaa\xac|~|\\Z\\\xbc\xbe\xbc<:<\x04\x06\x04\x84\x86\x84\xcc\xce\xccDFD\xa4\xa6\xa4\xe4\xe6\xe4$&$dfd\x94\x96\x94\xf4\xf6\xf4\xd4\xd6\u053c\xba\xbc464\f\x0e\f\x8c\x8e\x8cLNL\xec\xee\uc71e\x9c\xfc\xfe\xfc\xdc\xde\xdc\\^\\\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\xfe\xc0\x96pH,\x1a\x8f\u0224r\xc9l:\x9f\u0428tJ\xadZ\xaf\u062cv\xcb\xedz\xb7\x05I\xd2\xf4\xd2(X\x94#e%Y%)\x12I\"I\x8a\u03d1\x898)\x99\x97\xa4\xd5lnHprtvG\t\x13\x06\x00\x1b\x11\x02E \a\x0f\x00\x94\x00\x1e\x15E\x14\x19\b\x1c#\v\u007fD+\f)\x1c\x04\x15\xa0C\x05\x16\x10\x10\x16 G\x15\x04\x1c)\fwD\x14\v\x9c\b\x19\xa8B\x9a\x9c\x9e\xbd-\xa2\xa4\xa6\u00aa\xac\xaeE$\x10(\x95\x00\r\x98\xbe\x1c\x93\xcf\x00\a\x82B\v\x17\x01\xdc\x10\xd2D&\xdd\xdd\x13\xafD$\x16\xdd\xdc\x1f\xb6B\x12\x13\xdc\xdc\fF\x15)\xf1\x01\x1dF\xdb\xe3\xdfF\xe2\xf1\u55a5\xbb\xb0\xae]\x85\x10\xd6\x00\x88\x18\xe2BCB\x00!2\x10\xf9\x10\x8f\x9b\t#\x10\br\v\xb0\xa0\x88\x04\x0e\xf78\x88!\xb2\x00$?#\x19\xd4\x11$`\x84\xa2\xba\x00\x17\x8bd$\x18\x80\xa3G\x93\xdcD\x12a\xf0\u0401\xe6\xa0\x05\u056cm`9\xe4\xc38\x8b\x18+r\xe8H\xe4\xa3J\x9d$_^\x80\xe0o\\7\xa2\x13\x8f\xc2L\xaan\xe9\u0367#\x85\xf0L\xe8`d\x87\xa0\u03c6\x12\xe9\xf02\x05\xb8!\f\x8e\x06$\x92\xc0\xe8Fv\x90X\xbc\x9cW\xa4\xde\xcb|E\xd8\xd2tk$.@sC\xeaZ\xc5;\xa4\xc2\"k/R\x9dxh@\xe2\x10\n&\x10\x04@\xd0A\x98(\b\xa5N\x19A\xc6\xc1B\x01#\x14*\xb0`\xc5 \xec\xe5\x0e\xbaL\b\u00ec\x99\xb3g\x06\xa0\x8d\x8d^U\xfa4\xdd\x00\xce*5\x00\u0702\x045\xa1\a\\\xb7\x80\x03\"\x1bj\t \x12\b\x13\x92\x00D!<\xd6\xf7 a\xe3g\x10t\u7660K\xc7~\xbd\u020a\x11\r(y\xb0\x9c\xea\xc0\x86g\x03J|\x99O\xdfI\x05\u010518P1bz\xfd\xff\x00\x06(\xe0\x80\x04\x16h\xa0\x80A\x00\x00!\xf9\x04\t\x04\x00\x16\x00,\x00\x00\x00\x00\x80\x00\x10\x00\x85\x04\x02\x04\x84\x82\x84\xcc\xce\u0324\xa2\xa4DBD\xec\xea\ucd32\xb4\x94\x92\x94dfd\x14\x16\x14\xdc\xde\xdc\xf4\xf6\xf4\f\n\f\x8c\x8a\x8c\xac\xaa\xac\\Z\\\xbc\xba\xbc\xdc\xda\xdc\xf4\xf2\xf4\x9c\x9e\x9c|~|\xe4\xe6\xe4\xfc\xfe\xfc\x04\x06\x04\x84\x86\x84\xd4\xd2\u0524\xa6\xa4LJL\xec\xee\ucd36\xb4\x94\x96\x94ljl\x1c\x1a\x1c\xe4\xe2\xe4\xfc\xfa\xfc\f\x0e\f\x8c\x8e\x8c\xac\xae\xac\\^\\\xbc\xbe\xbc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\xfe@\x8bpH,\x1a\x8f\u0224r\xc9l:\x9f\u0428tJ\xadZ\xaf\u062cv\xcb\xedz\xbfH\x91B\x92\x14q\n\x9cr\xa1@F.\xd6\xed\xa3d\xbdH\xce\v\xa2\xf09\x1d\x86'\xdflvtG\x05\x18\f\x00\x17&!F\"'\a\x18\x1e\x19yE\x1c\x06$\x18\x03\x11\x93D!\x0e\r\r%\x8bF\x11\x03\x18$\x1dqC\"\x19\x8f\a'\x9b\xaa\x8e\x90\x92F\x95\x97\x99\xb0B\x9d\x9f\xa1G\xa4\xa6\xa8E\x05\x1f\x17\x00\xc6\x00\x04\xa2C\x19\x14\x01\xcd\r\x11F\x10\xce\xce\x13\x15E\v\x0e\xce\xcd\x1a\xa9\x16\x05\x13\xcd\xcd\x06\xa3$\xe2\x01\x02F\xcc\xd4\xd0\xd2\xd4\x14\xd6\xd8\xda\x14\xdc\xde\xe0\xe7\xe4D\x06 \xc7\xc6#$E4\x88k\x06\xc1H\x03z\xcd\x02d\x10\x86\xe1\x1c\x86\x02E2\xbc\v\xd0\xc0\u0209m\xf4\x06\x18\x11\xb8-@\xc1\"\a\xe9\x05P\xc8\xd0!D\"\x12\xcfUT\x85\xa1\u07f1\a\xa94L\xfcH\xe4`\u01c5D\na|\x18\xb1#\u0185\x95D\xa6%\xa4\xa01\xe0L\x83\x03I\xe6\u0130\xf3\xe42\x9f@-\x88h\xe0\xd2\u0603:C\x04t$\x11\xadH\x87w\xf1\x88H\x90\x99\xb0[\x91\n\x13:\xe6#\x12\x81D\xc7tE\xb4\x8a\xe4j\u4af8\xb0C\xc6R\v`\x96\bZ\xb5EJ$py!\xaaT\b\a\x02\x1c\x10\x90\u02c2-L\x9a\x8c\xec\xc2\xe0@\x99\xaa\b\x13>\x19\xe0CD\x84\x80V\x10\x1a\x8b@\xac\x98q-K\x90\x1bO\xae\xcc\b\xb3f\xceB\n (v\x8c\x80\x02F\x05*\xc0.\"\"\xb7\x84\xc6B$T\b\x84Dx\x01\xacG\xce\xe0\xe9\xa3[M\x85\xdf\u0147{\x13;\x1c9\xa7\x00\x87.<\xb8\r\xa6\xbb\xf7+\v\"\xec\xfeN\xbe\xbc\xf9\xf3\xe8\u04eb_\xdf=\b\x00;")
+
+func third_partySwaggerUiImagesThrobberGifBytes() ([]byte, error) {
+	return _third_partySwaggerUiImagesThrobberGif, nil
+}
+
+func third_partySwaggerUiImagesThrobberGif() (*asset, error) {
+	bytes, err := third_partySwaggerUiImagesThrobberGifBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/images/throbber.gif", size: 9257, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiImagesWordnik_apiPng = []byte("\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x18\x00\x00\x00\x18\b\x06\x00\x00\x00\xe0w=\xf8\x00\x00\x00\x04sBIT\b\b\b\b|\bd\x88\x00\x00\x00\tpHYs\x00\x00\v\x12\x00\x00\v\x12\x01\xd2\xdd~\xfc\x00\x00\x00\x1ctEXtSoftware\x00Adobe Fireworks CS5q\xb5\xe36\x00\x00\x03NIDATH\x89\xa5\x95Mh\\U\x14\xc7\u007fg&\x8d\x19'3\xa3\xb4\x04\x85Lg\x92n\x94,\xac\x1b\xed\xa2\xad\xa8\x11E\x8cZZ\x17\xd6D\x90\xba(EG\u0115\xb6\xd8\tU\xb0 h\xa5\xf8Aj\xc1\xa6_\v+\xa5\xadH@\x02~!-\n\xe2\xc2n\xecL\u0489\u0608U'\x93\xe9K\x9c{\xdfq\x91\x99\xc9}\xf3\x01\x03\xfe\xe1\xf0\xee\xfd\xbfs\xfe\xe7\u070fw\x9e\xd0!\x96\x8e\xf6o\x03\xc6\x00\x8bp\xb8\u7e79\xaf:\x89\xeb\xea4\x01\xca\xf3\xc0\xa3\u0571\at\x94 \u0509\xd3\u0491\xfe\xb5\xf8\f\xe3C\xd5F\x96\x8e\xf4'\x1a\xfdn|\xd6/\x8d\\`\x05\xde\xd1d\x17\u02dc\x01<\x94\xb7#{\n?\x00hEv\x03\u074e\xeb-\xc0\v\xc0\x9b\x00\xde\a\xc9\a\x81q\xe6)y\x1f'\x1f\x8f\xec*Tj\x8e\xf5\x8c\u07a1d\x940\xe7\x80\a\x1c\xa13@\x12\xb8\xa7\xcd\xe2.\x02\xbf\x03O:\u0717XF\"/\x15\x96\x82+\x10\xba\u0572\xb1A`{\x1b\xe1\x1a\xeem\xc1m\x10Y\xdd\xfa\xfa \x92)\xfc\x8d\x95q\xac\xf0\xff\x8cl$S\xb8\u0454\x00\x00\x13\xfa\x10\xcb\x15,\x04\xccT\xad\xdd|\xd5.\u02ffk\x8e\xbb\x92\x81C6\xb7\xffS\t\xff\x16_\xae\x13\n\"|\n\\\x06\xb6*\xdc\a +W\xf4k\xe0NUv\xac\x9e$a\xfff/p\x93\xea\x93\xf2[\xa9\b\x86\x17\x81\x83\xab\xf2:\x1a\xddw\xf5d\xdd\xe7\x8d\xf5\x93\x00\xd1}W\xc7\x1cn'\xc8qG\xebUB\x1c\x8e\xbe6\xbb\b \xe5lj30\x82\xf0\x140\xe0$\xff6\xba\u007fv\x8b[M9\x9bN\x00D\xb33\xc5\x00?\x9e\xfa\x06\xd8\xecP\xd7P\xce\x02S]\xf8L(\xdc!+%\xbb\x98\xa3\x01\x8d\xc25\xa8\r\xfa\n\xdc\x06\xec\x06\x1e\n\xa9\x95(V\u0426\x83\x95\xe1\u017d\xe9\xbeV\x82.\x16\xf7\xa6\xfb02\xec\u01aa\x05\xb5\x82Z\xe9\ta\xf9\x04\u02ef\x18\x01\xe3\\7\x9fuXN\x97\xb3\xe9\xb6\xfd\xca{'\x1d\xc2rr\u0177\x1aW\xd7\xe1G,\xef\n\xc0\xe2+\xe9\x1e\xc2lQ%\x03<\x16\\?\xa7\x88\xeahl|\xd6w\xe9\xd2\xfeT\x88\xb2L\"\xecl\xc8\xfb\xb9\b\a)\xf2]\xefG3~\xe0J\x952\xe9\x18a\xf2\xc0\u0686\xa0S\xf4\xcah\xec@\xde\a(\x1dH\v\u007fq\x02x\xba\xc1\xef:>\x83\xb1C3\v5\xa2\xa9\xfb\x952\x03\xdf\x03\x9bZ\xec\xc8\x05\xe9b\a\x80\x1aN\x13\xec?5\xfc\x14{/\u007f\xb7K\x04\x12,\xec\x19\u060a0\r\x84[\x04\x03LU\x9f\x0f\xb7y\xaf(O\xc4\xdf\u03dfoJ\xb0\xb0k \xc4\x1a\xa6\x80\xe16\xc1\x9d\xe2g,\x9b\xe2\x13y\x0f\xdcV\x11\x92^,\x83N- \xfc\t\u0100\x9bZ\xd4\n\xc22PBY\xe7\xecE\x1f\x90\x00<p\x9a]|\"\xb7\xa0\x86\x115\xfc\xa1\x86\xeb\xea\xf3\xba_\x91!\xdfp\x97\x1a\u03aa\x81\x80\xf9\x9c\xf7\r\x1b\xfd\x8a\f\xa9\xcf\xcbj\x98S\u00fco\xb8?>\x91\xbb\u05b4E5\x14\x9f\x1d\\\x0f\xf8\x89c\xb9\xfa\xd7Y\x1c\x1bL!\xe4\u0702P\x86\x12\x93\xb9_\x1c\x9f[\x11\xba\x13\xc7r\xf3\xae^S\x82v(>\xb3\xe1\v\xe0\x91\xea\xf4R\xe2\u0115V?\x9b&t\xf4\xd3\aP\u02f4\xd6\xdb\x00\u04dd\xc6\xfd\a\xed\xe8X\x9d\xcd\v]\xf3\x00\x00\x00\x00IEND\xaeB`\x82")
+
+func third_partySwaggerUiImagesWordnik_apiPngBytes() ([]byte, error) {
+	return _third_partySwaggerUiImagesWordnik_apiPng, nil
+}
+
+func third_partySwaggerUiImagesWordnik_apiPng() (*asset, error) {
+	bytes, err := third_partySwaggerUiImagesWordnik_apiPngBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/images/wordnik_api.png", size: 980, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiIndexHtml = []byte(`<!DOCTYPE html>
+<html>
+<head>
+  <title>Swagger UI</title>
+  <link href='css/typography.css' media='screen' rel='stylesheet' type='text/css'/>
+  <link href='css/reset.css' media='screen' rel='stylesheet' type='text/css'/>
+  <link href='css/screen.css' media='screen' rel='stylesheet' type='text/css'/>
+  <link href='css/reset.css' media='print' rel='stylesheet' type='text/css'/>
+  <link href='css/screen.css' media='print' rel='stylesheet' type='text/css'/>
+  <script type="text/javascript" src="lib/shred.bundle.js"></script>
+  <script src='lib/jquery-1.8.0.min.js' type='text/javascript'></script>
+  <script src='lib/jquery.slideto.min.js' type='text/javascript'></script>
+  <script src='lib/jquery.wiggle.min.js' type='text/javascript'></script>
+  <script src='lib/jquery.ba-bbq.min.js' type='text/javascript'></script>
+  <script src='lib/handlebars-2.0.0.js' type='text/javascript'></script>
+  <script src='lib/underscore-min.js' type='text/javascript'></script>
+  <script src='lib/backbone-min.js' type='text/javascript'></script>
+  <script src='lib/swagger-client.js' type='text/javascript'></script>
+  <script src='swagger-ui.js' type='text/javascript'></script>
+  <script src='lib/highlight.7.3.pack.js' type='text/javascript'></script>
+  <script src='lib/marked.js' type='text/javascript'></script>
+
+  <!-- enabling this will enable oauth2 implicit scope support -->
+  <script src='lib/swagger-oauth.js' type='text/javascript'></script>
+  <script type="text/javascript">
+    $(function () {
+      var url = "../../swaggerapi";
+      window.swaggerUi = new SwaggerUi({
+        url: url,
+        dom_id: "swagger-ui-container",
+        supportedSubmitMethods: [],
+        onComplete: function(swaggerApi, swaggerUi){
+          if(typeof initOAuth == "function") {
+            /*
+            initOAuth({
+              clientId: "your-client-id",
+              realm: "your-realms",
+              appName: "your-app-name"
+            });
+            */
+          }
+          $('pre code').each(function(i, e) {
+            hljs.highlightBlock(e)
+          });
+        },
+        onFailure: function(data) {
+          log("Unable to Load SwaggerUI");
+        },
+        docExpansion: "none",
+        sorter : "alpha"
+      });
+
+      function addApiKeyAuthorization() {
+        var key = $('#input_apiKey')[0].value;
+        log("key: " + key);
+        if(key && key.trim() != "") {
+            log("added key " + key);
+            window.authorizations.add("api_key", new ApiKeyAuthorization("api_key", key, "query"));
+        }
+      }
+
+      $('#input_apiKey').change(function() {
+        addApiKeyAuthorization();
+      });
+
+      // if you have an apiKey you would like to pre-populate on the page for demonstration purposes...
+      /*
+        var apiKey = "myApiKeyXXXX123456789";
+        $('#input_apiKey').val(apiKey);
+        addApiKeyAuthorization();
+      */
+
+      window.swaggerUi.load();
+  });
+  </script>
+</head>
+
+<body class="swagger-section">
+<div id='header'>
+  <div class="swagger-ui-wrap">
+    <a id="logo" href="http://swagger.io">swagger</a>
+    <form id='api_selector'>
+      <div class='input'><input placeholder="http://example.com/api" id="input_baseUrl" name="baseUrl" type="text"/></div>
+      <div class='input'><input placeholder="api_key" id="input_apiKey" name="apiKey" type="text"/></div>
+      <div class='input'><a id="explore" href="#">Explore</a></div>
+    </form>
+  </div>
+</div>
+
+<div id="message-bar" class="swagger-ui-wrap">&nbsp;</div>
+<div id="swagger-ui-container" class="swagger-ui-wrap"></div>
+</body>
+</html>
+`)
+
+func third_partySwaggerUiIndexHtmlBytes() ([]byte, error) {
+	return _third_partySwaggerUiIndexHtml, nil
+}
+
+func third_partySwaggerUiIndexHtml() (*asset, error) {
+	bytes, err := third_partySwaggerUiIndexHtmlBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/index.html", size: 3561, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiLibBackboneMinJs = []byte(`// Backbone.js 1.1.2
+
+(function(t,e){if(typeof define==="function"&&define.amd){define(["underscore","jquery","exports"],function(i,r,s){t.Backbone=e(t,s,i,r)})}else if(typeof exports!=="undefined"){var i=require("underscore");e(t,exports,i)}else{t.Backbone=e(t,{},t._,t.jQuery||t.Zepto||t.ender||t.$)}})(this,function(t,e,i,r){var s=t.Backbone;var n=[];var a=n.push;var o=n.slice;var h=n.splice;e.VERSION="1.1.2";e.$=r;e.noConflict=function(){t.Backbone=s;return this};e.emulateHTTP=false;e.emulateJSON=false;var u=e.Events={on:function(t,e,i){if(!c(this,"on",t,[e,i])||!e)return this;this._events||(this._events={});var r=this._events[t]||(this._events[t]=[]);r.push({callback:e,context:i,ctx:i||this});return this},once:function(t,e,r){if(!c(this,"once",t,[e,r])||!e)return this;var s=this;var n=i.once(function(){s.off(t,n);e.apply(this,arguments)});n._callback=e;return this.on(t,n,r)},off:function(t,e,r){var s,n,a,o,h,u,l,f;if(!this._events||!c(this,"off",t,[e,r]))return this;if(!t&&!e&&!r){this._events=void 0;return this}o=t?[t]:i.keys(this._events);for(h=0,u=o.length;h<u;h++){t=o[h];if(a=this._events[t]){this._events[t]=s=[];if(e||r){for(l=0,f=a.length;l<f;l++){n=a[l];if(e&&e!==n.callback&&e!==n.callback._callback||r&&r!==n.context){s.push(n)}}}if(!s.length)delete this._events[t]}}return this},trigger:function(t){if(!this._events)return this;var e=o.call(arguments,1);if(!c(this,"trigger",t,e))return this;var i=this._events[t];var r=this._events.all;if(i)f(i,e);if(r)f(r,arguments);return this},stopListening:function(t,e,r){var s=this._listeningTo;if(!s)return this;var n=!e&&!r;if(!r&&typeof e==="object")r=this;if(t)(s={})[t._listenId]=t;for(var a in s){t=s[a];t.off(e,r,this);if(n||i.isEmpty(t._events))delete this._listeningTo[a]}return this}};var l=/\s+/;var c=function(t,e,i,r){if(!i)return true;if(typeof i==="object"){for(var s in i){t[e].apply(t,[s,i[s]].concat(r))}return false}if(l.test(i)){var n=i.split(l);for(var a=0,o=n.length;a<o;a++){t[e].apply(t,[n[a]].concat(r))}return false}return true};var f=function(t,e){var i,r=-1,s=t.length,n=e[0],a=e[1],o=e[2];switch(e.length){case 0:while(++r<s)(i=t[r]).callback.call(i.ctx);return;case 1:while(++r<s)(i=t[r]).callback.call(i.ctx,n);return;case 2:while(++r<s)(i=t[r]).callback.call(i.ctx,n,a);return;case 3:while(++r<s)(i=t[r]).callback.call(i.ctx,n,a,o);return;default:while(++r<s)(i=t[r]).callback.apply(i.ctx,e);return}};var d={listenTo:"on",listenToOnce:"once"};i.each(d,function(t,e){u[e]=function(e,r,s){var n=this._listeningTo||(this._listeningTo={});var a=e._listenId||(e._listenId=i.uniqueId("l"));n[a]=e;if(!s&&typeof r==="object")s=this;e[t](r,s,this);return this}});u.bind=u.on;u.unbind=u.off;i.extend(e,u);var p=e.Model=function(t,e){var r=t||{};e||(e={});this.cid=i.uniqueId("c");this.attributes={};if(e.collection)this.collection=e.collection;if(e.parse)r=this.parse(r,e)||{};r=i.defaults({},r,i.result(this,"defaults"));this.set(r,e);this.changed={};this.initialize.apply(this,arguments)};i.extend(p.prototype,u,{changed:null,validationError:null,idAttribute:"id",initialize:function(){},toJSON:function(t){return i.clone(this.attributes)},sync:function(){return e.sync.apply(this,arguments)},get:function(t){return this.attributes[t]},escape:function(t){return i.escape(this.get(t))},has:function(t){return this.get(t)!=null},set:function(t,e,r){var s,n,a,o,h,u,l,c;if(t==null)return this;if(typeof t==="object"){n=t;r=e}else{(n={})[t]=e}r||(r={});if(!this._validate(n,r))return false;a=r.unset;h=r.silent;o=[];u=this._changing;this._changing=true;if(!u){this._previousAttributes=i.clone(this.attributes);this.changed={}}c=this.attributes,l=this._previousAttributes;if(this.idAttribute in n)this.id=n[this.idAttribute];for(s in n){e=n[s];if(!i.isEqual(c[s],e))o.push(s);if(!i.isEqual(l[s],e)){this.changed[s]=e}else{delete this.changed[s]}a?delete c[s]:c[s]=e}if(!h){if(o.length)this._pending=r;for(var f=0,d=o.length;f<d;f++){this.trigger("change:"+o[f],this,c[o[f]],r)}}if(u)return this;if(!h){while(this._pending){r=this._pending;this._pending=false;this.trigger("change",this,r)}}this._pending=false;this._changing=false;return this},unset:function(t,e){return this.set(t,void 0,i.extend({},e,{unset:true}))},clear:function(t){var e={};for(var r in this.attributes)e[r]=void 0;return this.set(e,i.extend({},t,{unset:true}))},hasChanged:function(t){if(t==null)return!i.isEmpty(this.changed);return i.has(this.changed,t)},changedAttributes:function(t){if(!t)return this.hasChanged()?i.clone(this.changed):false;var e,r=false;var s=this._changing?this._previousAttributes:this.attributes;for(var n in t){if(i.isEqual(s[n],e=t[n]))continue;(r||(r={}))[n]=e}return r},previous:function(t){if(t==null||!this._previousAttributes)return null;return this._previousAttributes[t]},previousAttributes:function(){return i.clone(this._previousAttributes)},fetch:function(t){t=t?i.clone(t):{};if(t.parse===void 0)t.parse=true;var e=this;var r=t.success;t.success=function(i){if(!e.set(e.parse(i,t),t))return false;if(r)r(e,i,t);e.trigger("sync",e,i,t)};q(this,t);return this.sync("read",this,t)},save:function(t,e,r){var s,n,a,o=this.attributes;if(t==null||typeof t==="object"){s=t;r=e}else{(s={})[t]=e}r=i.extend({validate:true},r);if(s&&!r.wait){if(!this.set(s,r))return false}else{if(!this._validate(s,r))return false}if(s&&r.wait){this.attributes=i.extend({},o,s)}if(r.parse===void 0)r.parse=true;var h=this;var u=r.success;r.success=function(t){h.attributes=o;var e=h.parse(t,r);if(r.wait)e=i.extend(s||{},e);if(i.isObject(e)&&!h.set(e,r)){return false}if(u)u(h,t,r);h.trigger("sync",h,t,r)};q(this,r);n=this.isNew()?"create":r.patch?"patch":"update";if(n==="patch")r.attrs=s;a=this.sync(n,this,r);if(s&&r.wait)this.attributes=o;return a},destroy:function(t){t=t?i.clone(t):{};var e=this;var r=t.success;var s=function(){e.trigger("destroy",e,e.collection,t)};t.success=function(i){if(t.wait||e.isNew())s();if(r)r(e,i,t);if(!e.isNew())e.trigger("sync",e,i,t)};if(this.isNew()){t.success();return false}q(this,t);var n=this.sync("delete",this,t);if(!t.wait)s();return n},url:function(){var t=i.result(this,"urlRoot")||i.result(this.collection,"url")||M();if(this.isNew())return t;return t.replace(/([^\/])$/,"$1/")+encodeURIComponent(this.id)},parse:function(t,e){return t},clone:function(){return new this.constructor(this.attributes)},isNew:function(){return!this.has(this.idAttribute)},isValid:function(t){return this._validate({},i.extend(t||{},{validate:true}))},_validate:function(t,e){if(!e.validate||!this.validate)return true;t=i.extend({},this.attributes,t);var r=this.validationError=this.validate(t,e)||null;if(!r)return true;this.trigger("invalid",this,r,i.extend(e,{validationError:r}));return false}});var v=["keys","values","pairs","invert","pick","omit"];i.each(v,function(t){p.prototype[t]=function(){var e=o.call(arguments);e.unshift(this.attributes);return i[t].apply(i,e)}});var g=e.Collection=function(t,e){e||(e={});if(e.model)this.model=e.model;if(e.comparator!==void 0)this.comparator=e.comparator;this._reset();this.initialize.apply(this,arguments);if(t)this.reset(t,i.extend({silent:true},e))};var m={add:true,remove:true,merge:true};var y={add:true,remove:false};i.extend(g.prototype,u,{model:p,initialize:function(){},toJSON:function(t){return this.map(function(e){return e.toJSON(t)})},sync:function(){return e.sync.apply(this,arguments)},add:function(t,e){return this.set(t,i.extend({merge:false},e,y))},remove:function(t,e){var r=!i.isArray(t);t=r?[t]:i.clone(t);e||(e={});var s,n,a,o;for(s=0,n=t.length;s<n;s++){o=t[s]=this.get(t[s]);if(!o)continue;delete this._byId[o.id];delete this._byId[o.cid];a=this.indexOf(o);this.models.splice(a,1);this.length--;if(!e.silent){e.index=a;o.trigger("remove",o,this,e)}this._removeReference(o,e)}return r?t[0]:t},set:function(t,e){e=i.defaults({},e,m);if(e.parse)t=this.parse(t,e);var r=!i.isArray(t);t=r?t?[t]:[]:i.clone(t);var s,n,a,o,h,u,l;var c=e.at;var f=this.model;var d=this.comparator&&c==null&&e.sort!==false;var v=i.isString(this.comparator)?this.comparator:null;var g=[],y=[],_={};var b=e.add,w=e.merge,x=e.remove;var E=!d&&b&&x?[]:false;for(s=0,n=t.length;s<n;s++){h=t[s]||{};if(h instanceof p){a=o=h}else{a=h[f.prototype.idAttribute||"id"]}if(u=this.get(a)){if(x)_[u.cid]=true;if(w){h=h===o?o.attributes:h;if(e.parse)h=u.parse(h,e);u.set(h,e);if(d&&!l&&u.hasChanged(v))l=true}t[s]=u}else if(b){o=t[s]=this._prepareModel(h,e);if(!o)continue;g.push(o);this._addReference(o,e)}o=u||o;if(E&&(o.isNew()||!_[o.id]))E.push(o);_[o.id]=true}if(x){for(s=0,n=this.length;s<n;++s){if(!_[(o=this.models[s]).cid])y.push(o)}if(y.length)this.remove(y,e)}if(g.length||E&&E.length){if(d)l=true;this.length+=g.length;if(c!=null){for(s=0,n=g.length;s<n;s++){this.models.splice(c+s,0,g[s])}}else{if(E)this.models.length=0;var k=E||g;for(s=0,n=k.length;s<n;s++){this.models.push(k[s])}}}if(l)this.sort({silent:true});if(!e.silent){for(s=0,n=g.length;s<n;s++){(o=g[s]).trigger("add",o,this,e)}if(l||E&&E.length)this.trigger("sort",this,e)}return r?t[0]:t},reset:function(t,e){e||(e={});for(var r=0,s=this.models.length;r<s;r++){this._removeReference(this.models[r],e)}e.previousModels=this.models;this._reset();t=this.add(t,i.extend({silent:true},e));if(!e.silent)this.trigger("reset",this,e);return t},push:function(t,e){return this.add(t,i.extend({at:this.length},e))},pop:function(t){var e=this.at(this.length-1);this.remove(e,t);return e},unshift:function(t,e){return this.add(t,i.extend({at:0},e))},shift:function(t){var e=this.at(0);this.remove(e,t);return e},slice:function(){return o.apply(this.models,arguments)},get:function(t){if(t==null)return void 0;return this._byId[t]||this._byId[t.id]||this._byId[t.cid]},at:function(t){return this.models[t]},where:function(t,e){if(i.isEmpty(t))return e?void 0:[];return this[e?"find":"filter"](function(e){for(var i in t){if(t[i]!==e.get(i))return false}return true})},findWhere:function(t){return this.where(t,true)},sort:function(t){if(!this.comparator)throw new Error("Cannot sort a set without a comparator");t||(t={});if(i.isString(this.comparator)||this.comparator.length===1){this.models=this.sortBy(this.comparator,this)}else{this.models.sort(i.bind(this.comparator,this))}if(!t.silent)this.trigger("sort",this,t);return this},pluck:function(t){return i.invoke(this.models,"get",t)},fetch:function(t){t=t?i.clone(t):{};if(t.parse===void 0)t.parse=true;var e=t.success;var r=this;t.success=function(i){var s=t.reset?"reset":"set";r[s](i,t);if(e)e(r,i,t);r.trigger("sync",r,i,t)};q(this,t);return this.sync("read",this,t)},create:function(t,e){e=e?i.clone(e):{};if(!(t=this._prepareModel(t,e)))return false;if(!e.wait)this.add(t,e);var r=this;var s=e.success;e.success=function(t,i){if(e.wait)r.add(t,e);if(s)s(t,i,e)};t.save(null,e);return t},parse:function(t,e){return t},clone:function(){return new this.constructor(this.models)},_reset:function(){this.length=0;this.models=[];this._byId={}},_prepareModel:function(t,e){if(t instanceof p)return t;e=e?i.clone(e):{};e.collection=this;var r=new this.model(t,e);if(!r.validationError)return r;this.trigger("invalid",this,r.validationError,e);return false},_addReference:function(t,e){this._byId[t.cid]=t;if(t.id!=null)this._byId[t.id]=t;if(!t.collection)t.collection=this;t.on("all",this._onModelEvent,this)},_removeReference:function(t,e){if(this===t.collection)delete t.collection;t.off("all",this._onModelEvent,this)},_onModelEvent:function(t,e,i,r){if((t==="add"||t==="remove")&&i!==this)return;if(t==="destroy")this.remove(e,r);if(e&&t==="change:"+e.idAttribute){delete this._byId[e.previous(e.idAttribute)];if(e.id!=null)this._byId[e.id]=e}this.trigger.apply(this,arguments)}});var _=["forEach","each","map","collect","reduce","foldl","inject","reduceRight","foldr","find","detect","filter","select","reject","every","all","some","any","include","contains","invoke","max","min","toArray","size","first","head","take","initial","rest","tail","drop","last","without","difference","indexOf","shuffle","lastIndexOf","isEmpty","chain","sample"];i.each(_,function(t){g.prototype[t]=function(){var e=o.call(arguments);e.unshift(this.models);return i[t].apply(i,e)}});var b=["groupBy","countBy","sortBy","indexBy"];i.each(b,function(t){g.prototype[t]=function(e,r){var s=i.isFunction(e)?e:function(t){return t.get(e)};return i[t](this.models,s,r)}});var w=e.View=function(t){this.cid=i.uniqueId("view");t||(t={});i.extend(this,i.pick(t,E));this._ensureElement();this.initialize.apply(this,arguments);this.delegateEvents()};var x=/^(\S+)\s*(.*)$/;var E=["model","collection","el","id","attributes","className","tagName","events"];i.extend(w.prototype,u,{tagName:"div",$:function(t){return this.$el.find(t)},initialize:function(){},render:function(){return this},remove:function(){this.$el.remove();this.stopListening();return this},setElement:function(t,i){if(this.$el)this.undelegateEvents();this.$el=t instanceof e.$?t:e.$(t);this.el=this.$el[0];if(i!==false)this.delegateEvents();return this},delegateEvents:function(t){if(!(t||(t=i.result(this,"events"))))return this;this.undelegateEvents();for(var e in t){var r=t[e];if(!i.isFunction(r))r=this[t[e]];if(!r)continue;var s=e.match(x);var n=s[1],a=s[2];r=i.bind(r,this);n+=".delegateEvents"+this.cid;if(a===""){this.$el.on(n,r)}else{this.$el.on(n,a,r)}}return this},undelegateEvents:function(){this.$el.off(".delegateEvents"+this.cid);return this},_ensureElement:function(){if(!this.el){var t=i.extend({},i.result(this,"attributes"));if(this.id)t.id=i.result(this,"id");if(this.className)t["class"]=i.result(this,"className");var r=e.$("<"+i.result(this,"tagName")+">").attr(t);this.setElement(r,false)}else{this.setElement(i.result(this,"el"),false)}}});e.sync=function(t,r,s){var n=T[t];i.defaults(s||(s={}),{emulateHTTP:e.emulateHTTP,emulateJSON:e.emulateJSON});var a={type:n,dataType:"json"};if(!s.url){a.url=i.result(r,"url")||M()}if(s.data==null&&r&&(t==="create"||t==="update"||t==="patch")){a.contentType="application/json";a.data=JSON.stringify(s.attrs||r.toJSON(s))}if(s.emulateJSON){a.contentType="application/x-www-form-urlencoded";a.data=a.data?{model:a.data}:{}}if(s.emulateHTTP&&(n==="PUT"||n==="DELETE"||n==="PATCH")){a.type="POST";if(s.emulateJSON)a.data._method=n;var o=s.beforeSend;s.beforeSend=function(t){t.setRequestHeader("X-HTTP-Method-Override",n);if(o)return o.apply(this,arguments)}}if(a.type!=="GET"&&!s.emulateJSON){a.processData=false}if(a.type==="PATCH"&&k){a.xhr=function(){return new ActiveXObject("Microsoft.XMLHTTP")}}var h=s.xhr=e.ajax(i.extend(a,s));r.trigger("request",r,h,s);return h};var k=typeof window!=="undefined"&&!!window.ActiveXObject&&!(window.XMLHttpRequest&&(new XMLHttpRequest).dispatchEvent);var T={create:"POST",update:"PUT",patch:"PATCH","delete":"DELETE",read:"GET"};e.ajax=function(){return e.$.ajax.apply(e.$,arguments)};var $=e.Router=function(t){t||(t={});if(t.routes)this.routes=t.routes;this._bindRoutes();this.initialize.apply(this,arguments)};var S=/\((.*?)\)/g;var H=/(\(\?)?:\w+/g;var A=/\*\w+/g;var I=/[\-{}\[\]+?.,\\\^$|#\s]/g;i.extend($.prototype,u,{initialize:function(){},route:function(t,r,s){if(!i.isRegExp(t))t=this._routeToRegExp(t);if(i.isFunction(r)){s=r;r=""}if(!s)s=this[r];var n=this;e.history.route(t,function(i){var a=n._extractParameters(t,i);n.execute(s,a);n.trigger.apply(n,["route:"+r].concat(a));n.trigger("route",r,a);e.history.trigger("route",n,r,a)});return this},execute:function(t,e){if(t)t.apply(this,e)},navigate:function(t,i){e.history.navigate(t,i);return this},_bindRoutes:function(){if(!this.routes)return;this.routes=i.result(this,"routes");var t,e=i.keys(this.routes);while((t=e.pop())!=null){this.route(t,this.routes[t])}},_routeToRegExp:function(t){t=t.replace(I,"\\$&").replace(S,"(?:$1)?").replace(H,function(t,e){return e?t:"([^/?]+)"}).replace(A,"([^?]*?)");return new RegExp("^"+t+"(?:\\?([\\s\\S]*))?$")},_extractParameters:function(t,e){var r=t.exec(e).slice(1);return i.map(r,function(t,e){if(e===r.length-1)return t||null;return t?decodeURIComponent(t):null})}});var N=e.History=function(){this.handlers=[];i.bindAll(this,"checkUrl");if(typeof window!=="undefined"){this.location=window.location;this.history=window.history}};var R=/^[#\/]|\s+$/g;var O=/^\/+|\/+$/g;var P=/msie [\w.]+/;var C=/\/$/;var j=/#.*$/;N.started=false;i.extend(N.prototype,u,{interval:50,atRoot:function(){return this.location.pathname.replace(/[^\/]$/,"$&/")===this.root},getHash:function(t){var e=(t||this).location.href.match(/#(.*)$/);return e?e[1]:""},getFragment:function(t,e){if(t==null){if(this._hasPushState||!this._wantsHashChange||e){t=decodeURI(this.location.pathname+this.location.search);var i=this.root.replace(C,"");if(!t.indexOf(i))t=t.slice(i.length)}else{t=this.getHash()}}return t.replace(R,"")},start:function(t){if(N.started)throw new Error("Backbone.history has already been started");N.started=true;this.options=i.extend({root:"/"},this.options,t);this.root=this.options.root;this._wantsHashChange=this.options.hashChange!==false;this._wantsPushState=!!this.options.pushState;this._hasPushState=!!(this.options.pushState&&this.history&&this.history.pushState);var r=this.getFragment();var s=document.documentMode;var n=P.exec(navigator.userAgent.toLowerCase())&&(!s||s<=7);this.root=("/"+this.root+"/").replace(O,"/");if(n&&this._wantsHashChange){var a=e.$('<iframe src="javascript:0" tabindex="-1">');this.iframe=a.hide().appendTo("body")[0].contentWindow;this.navigate(r)}if(this._hasPushState){e.$(window).on("popstate",this.checkUrl)}else if(this._wantsHashChange&&"onhashchange"in window&&!n){e.$(window).on("hashchange",this.checkUrl)}else if(this._wantsHashChange){this._checkUrlInterval=setInterval(this.checkUrl,this.interval)}this.fragment=r;var o=this.location;if(this._wantsHashChange&&this._wantsPushState){if(!this._hasPushState&&!this.atRoot()){this.fragment=this.getFragment(null,true);this.location.replace(this.root+"#"+this.fragment);return true}else if(this._hasPushState&&this.atRoot()&&o.hash){this.fragment=this.getHash().replace(R,"");this.history.replaceState({},document.title,this.root+this.fragment)}}if(!this.options.silent)return this.loadUrl()},stop:function(){e.$(window).off("popstate",this.checkUrl).off("hashchange",this.checkUrl);if(this._checkUrlInterval)clearInterval(this._checkUrlInterval);N.started=false},route:function(t,e){this.handlers.unshift({route:t,callback:e})},checkUrl:function(t){var e=this.getFragment();if(e===this.fragment&&this.iframe){e=this.getFragment(this.getHash(this.iframe))}if(e===this.fragment)return false;if(this.iframe)this.navigate(e);this.loadUrl()},loadUrl:function(t){t=this.fragment=this.getFragment(t);return i.any(this.handlers,function(e){if(e.route.test(t)){e.callback(t);return true}})},navigate:function(t,e){if(!N.started)return false;if(!e||e===true)e={trigger:!!e};var i=this.root+(t=this.getFragment(t||""));t=t.replace(j,"");if(this.fragment===t)return;this.fragment=t;if(t===""&&i!=="/")i=i.slice(0,-1);if(this._hasPushState){this.history[e.replace?"replaceState":"pushState"]({},document.title,i)}else if(this._wantsHashChange){this._updateHash(this.location,t,e.replace);if(this.iframe&&t!==this.getFragment(this.getHash(this.iframe))){if(!e.replace)this.iframe.document.open().close();this._updateHash(this.iframe.location,t,e.replace)}}else{return this.location.assign(i)}if(e.trigger)return this.loadUrl(t)},_updateHash:function(t,e,i){if(i){var r=t.href.replace(/(javascript:|#).*$/,"");t.replace(r+"#"+e)}else{t.hash="#"+e}}});e.history=new N;var U=function(t,e){var r=this;var s;if(t&&i.has(t,"constructor")){s=t.constructor}else{s=function(){return r.apply(this,arguments)}}i.extend(s,r,e);var n=function(){this.constructor=s};n.prototype=r.prototype;s.prototype=new n;if(t)i.extend(s.prototype,t);s.__super__=r.prototype;return s};p.extend=g.extend=$.extend=w.extend=N.extend=U;var M=function(){throw new Error('A "url" property or function must be specified')};var q=function(t,e){var i=e.error;e.error=function(r){if(i)i(t,r,e);t.trigger("error",t,r,e)}};return e});
+
+// From http://stackoverflow.com/a/19431552
+// Compatibility override - Backbone 1.1 got rid of the 'options' binding
+// automatically to views in the constructor - we need to keep that.
+Backbone.View = (function(View) {
+   return View.extend({
+        constructor: function(options) {
+            this.options = options || {};
+            View.apply(this, arguments);
+        }
+    });
+})(Backbone.View);`)
+
+func third_partySwaggerUiLibBackboneMinJsBytes() ([]byte, error) {
+	return _third_partySwaggerUiLibBackboneMinJs, nil
+}
+
+func third_partySwaggerUiLibBackboneMinJs() (*asset, error) {
+	bytes, err := third_partySwaggerUiLibBackboneMinJsBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/lib/backbone-min.js", size: 20390, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiLibHandlebars100Js = []byte(`/*
+
+Copyright (C) 2011 by Yehuda Katz
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+*/
+
+// lib/handlebars/browser-prefix.js
+var Handlebars = {};
+
+(function(Handlebars, undefined) {
+;
+// lib/handlebars/base.js
+
+Handlebars.VERSION = "1.0.0";
+Handlebars.COMPILER_REVISION = 4;
+
+Handlebars.REVISION_CHANGES = {
+  1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it
+  2: '== 1.0.0-rc.3',
+  3: '== 1.0.0-rc.4',
+  4: '>= 1.0.0'
+};
+
+Handlebars.helpers  = {};
+Handlebars.partials = {};
+
+var toString = Object.prototype.toString,
+    functionType = '[object Function]',
+    objectType = '[object Object]';
+
+Handlebars.registerHelper = function(name, fn, inverse) {
+  if (toString.call(name) === objectType) {
+    if (inverse || fn) { throw new Handlebars.Exception('Arg not supported with multiple helpers'); }
+    Handlebars.Utils.extend(this.helpers, name);
+  } else {
+    if (inverse) { fn.not = inverse; }
+    this.helpers[name] = fn;
+  }
+};
+
+Handlebars.registerPartial = function(name, str) {
+  if (toString.call(name) === objectType) {
+    Handlebars.Utils.extend(this.partials,  name);
+  } else {
+    this.partials[name] = str;
+  }
+};
+
+Handlebars.registerHelper('helperMissing', function(arg) {
+  if(arguments.length === 2) {
+    return undefined;
+  } else {
+    throw new Error("Missing helper: '" + arg + "'");
+  }
+});
+
+Handlebars.registerHelper('blockHelperMissing', function(context, options) {
+  var inverse = options.inverse || function() {}, fn = options.fn;
+
+  var type = toString.call(context);
+
+  if(type === functionType) { context = context.call(this); }
+
+  if(context === true) {
+    return fn(this);
+  } else if(context === false || context == null) {
+    return inverse(this);
+  } else if(type === "[object Array]") {
+    if(context.length > 0) {
+      return Handlebars.helpers.each(context, options);
+    } else {
+      return inverse(this);
+    }
+  } else {
+    return fn(context);
+  }
+});
+
+Handlebars.K = function() {};
+
+Handlebars.createFrame = Object.create || function(object) {
+  Handlebars.K.prototype = object;
+  var obj = new Handlebars.K();
+  Handlebars.K.prototype = null;
+  return obj;
+};
+
+Handlebars.logger = {
+  DEBUG: 0, INFO: 1, WARN: 2, ERROR: 3, level: 3,
+
+  methodMap: {0: 'debug', 1: 'info', 2: 'warn', 3: 'error'},
+
+  // can be overridden in the host environment
+  log: function(level, obj) {
+    if (Handlebars.logger.level <= level) {
+      var method = Handlebars.logger.methodMap[level];
+      if (typeof console !== 'undefined' && console[method]) {
+        console[method].call(console, obj);
+      }
+    }
+  }
+};
+
+Handlebars.log = function(level, obj) { Handlebars.logger.log(level, obj); };
+
+Handlebars.registerHelper('each', function(context, options) {
+  var fn = options.fn, inverse = options.inverse;
+  var i = 0, ret = "", data;
+
+  var type = toString.call(context);
+  if(type === functionType) { context = context.call(this); }
+
+  if (options.data) {
+    data = Handlebars.createFrame(options.data);
+  }
+
+  if(context && typeof context === 'object') {
+    if(context instanceof Array){
+      for(var j = context.length; i<j; i++) {
+        if (data) { data.index = i; }
+        ret = ret + fn(context[i], { data: data });
+      }
+    } else {
+      for(var key in context) {
+        if(context.hasOwnProperty(key)) {
+          if(data) { data.key = key; }
+          ret = ret + fn(context[key], {data: data});
+          i++;
+        }
+      }
+    }
+  }
+
+  if(i === 0){
+    ret = inverse(this);
+  }
+
+  return ret;
+});
+
+Handlebars.registerHelper('if', function(conditional, options) {
+  var type = toString.call(conditional);
+  if(type === functionType) { conditional = conditional.call(this); }
+
+  if(!conditional || Handlebars.Utils.isEmpty(conditional)) {
+    return options.inverse(this);
+  } else {
+    return options.fn(this);
+  }
+});
+
+Handlebars.registerHelper('unless', function(conditional, options) {
+  return Handlebars.helpers['if'].call(this, conditional, {fn: options.inverse, inverse: options.fn});
+});
+
+Handlebars.registerHelper('with', function(context, options) {
+  var type = toString.call(context);
+  if(type === functionType) { context = context.call(this); }
+
+  if (!Handlebars.Utils.isEmpty(context)) return options.fn(context);
+});
+
+Handlebars.registerHelper('log', function(context, options) {
+  var level = options.data && options.data.level != null ? parseInt(options.data.level, 10) : 1;
+  Handlebars.log(level, context);
+});
+;
+// lib/handlebars/compiler/parser.js
+/* Jison generated parser */
+var handlebars = (function(){
+var parser = {trace: function trace() { },
+yy: {},
+symbols_: {"error":2,"root":3,"program":4,"EOF":5,"simpleInverse":6,"statements":7,"statement":8,"openInverse":9,"closeBlock":10,"openBlock":11,"mustache":12,"partial":13,"CONTENT":14,"COMMENT":15,"OPEN_BLOCK":16,"inMustache":17,"CLOSE":18,"OPEN_INVERSE":19,"OPEN_ENDBLOCK":20,"path":21,"OPEN":22,"OPEN_UNESCAPED":23,"CLOSE_UNESCAPED":24,"OPEN_PARTIAL":25,"partialName":26,"params":27,"hash":28,"dataName":29,"param":30,"STRING":31,"INTEGER":32,"BOOLEAN":33,"hashSegments":34,"hashSegment":35,"ID":36,"EQUALS":37,"DATA":38,"pathSegments":39,"SEP":40,"$accept":0,"$end":1},
+terminals_: {2:"error",5:"EOF",14:"CONTENT",15:"COMMENT",16:"OPEN_BLOCK",18:"CLOSE",19:"OPEN_INVERSE",20:"OPEN_ENDBLOCK",22:"OPEN",23:"OPEN_UNESCAPED",24:"CLOSE_UNESCAPED",25:"OPEN_PARTIAL",31:"STRING",32:"INTEGER",33:"BOOLEAN",36:"ID",37:"EQUALS",38:"DATA",40:"SEP"},
+productions_: [0,[3,2],[4,2],[4,3],[4,2],[4,1],[4,1],[4,0],[7,1],[7,2],[8,3],[8,3],[8,1],[8,1],[8,1],[8,1],[11,3],[9,3],[10,3],[12,3],[12,3],[13,3],[13,4],[6,2],[17,3],[17,2],[17,2],[17,1],[17,1],[27,2],[27,1],[30,1],[30,1],[30,1],[30,1],[30,1],[28,1],[34,2],[34,1],[35,3],[35,3],[35,3],[35,3],[35,3],[26,1],[26,1],[26,1],[29,2],[21,1],[39,3],[39,1]],
+performAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) {
+
+var $0 = $$.length - 1;
+switch (yystate) {
+case 1: return $$[$0-1]; 
+break;
+case 2: this.$ = new yy.ProgramNode([], $$[$0]); 
+break;
+case 3: this.$ = new yy.ProgramNode($$[$0-2], $$[$0]); 
+break;
+case 4: this.$ = new yy.ProgramNode($$[$0-1], []); 
+break;
+case 5: this.$ = new yy.ProgramNode($$[$0]); 
+break;
+case 6: this.$ = new yy.ProgramNode([], []); 
+break;
+case 7: this.$ = new yy.ProgramNode([]); 
+break;
+case 8: this.$ = [$$[$0]]; 
+break;
+case 9: $$[$0-1].push($$[$0]); this.$ = $$[$0-1]; 
+break;
+case 10: this.$ = new yy.BlockNode($$[$0-2], $$[$0-1].inverse, $$[$0-1], $$[$0]); 
+break;
+case 11: this.$ = new yy.BlockNode($$[$0-2], $$[$0-1], $$[$0-1].inverse, $$[$0]); 
+break;
+case 12: this.$ = $$[$0]; 
+break;
+case 13: this.$ = $$[$0]; 
+break;
+case 14: this.$ = new yy.ContentNode($$[$0]); 
+break;
+case 15: this.$ = new yy.CommentNode($$[$0]); 
+break;
+case 16: this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1]); 
+break;
+case 17: this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1]); 
+break;
+case 18: this.$ = $$[$0-1]; 
+break;
+case 19:
+    // Parsing out the '&' escape token at this level saves ~500 bytes after min due to the removal of one parser node.
+    this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1], $$[$0-2][2] === '&');
+  
+break;
+case 20: this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1], true); 
+break;
+case 21: this.$ = new yy.PartialNode($$[$0-1]); 
+break;
+case 22: this.$ = new yy.PartialNode($$[$0-2], $$[$0-1]); 
+break;
+case 23: 
+break;
+case 24: this.$ = [[$$[$0-2]].concat($$[$0-1]), $$[$0]]; 
+break;
+case 25: this.$ = [[$$[$0-1]].concat($$[$0]), null]; 
+break;
+case 26: this.$ = [[$$[$0-1]], $$[$0]]; 
+break;
+case 27: this.$ = [[$$[$0]], null]; 
+break;
+case 28: this.$ = [[$$[$0]], null]; 
+break;
+case 29: $$[$0-1].push($$[$0]); this.$ = $$[$0-1]; 
+break;
+case 30: this.$ = [$$[$0]]; 
+break;
+case 31: this.$ = $$[$0]; 
+break;
+case 32: this.$ = new yy.StringNode($$[$0]); 
+break;
+case 33: this.$ = new yy.IntegerNode($$[$0]); 
+break;
+case 34: this.$ = new yy.BooleanNode($$[$0]); 
+break;
+case 35: this.$ = $$[$0]; 
+break;
+case 36: this.$ = new yy.HashNode($$[$0]); 
+break;
+case 37: $$[$0-1].push($$[$0]); this.$ = $$[$0-1]; 
+break;
+case 38: this.$ = [$$[$0]]; 
+break;
+case 39: this.$ = [$$[$0-2], $$[$0]]; 
+break;
+case 40: this.$ = [$$[$0-2], new yy.StringNode($$[$0])]; 
+break;
+case 41: this.$ = [$$[$0-2], new yy.IntegerNode($$[$0])]; 
+break;
+case 42: this.$ = [$$[$0-2], new yy.BooleanNode($$[$0])]; 
+break;
+case 43: this.$ = [$$[$0-2], $$[$0]]; 
+break;
+case 44: this.$ = new yy.PartialNameNode($$[$0]); 
+break;
+case 45: this.$ = new yy.PartialNameNode(new yy.StringNode($$[$0])); 
+break;
+case 46: this.$ = new yy.PartialNameNode(new yy.IntegerNode($$[$0])); 
+break;
+case 47: this.$ = new yy.DataNode($$[$0]); 
+break;
+case 48: this.$ = new yy.IdNode($$[$0]); 
+break;
+case 49: $$[$0-2].push({part: $$[$0], separator: $$[$0-1]}); this.$ = $$[$0-2]; 
+break;
+case 50: this.$ = [{part: $$[$0]}]; 
+break;
+}
+},
+table: [{3:1,4:2,5:[2,7],6:3,7:4,8:6,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,5],22:[1,14],23:[1,15],25:[1,16]},{1:[3]},{5:[1,17]},{5:[2,6],7:18,8:6,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,19],20:[2,6],22:[1,14],23:[1,15],25:[1,16]},{5:[2,5],6:20,8:21,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,5],20:[2,5],22:[1,14],23:[1,15],25:[1,16]},{17:23,18:[1,22],21:24,29:25,36:[1,28],38:[1,27],39:26},{5:[2,8],14:[2,8],15:[2,8],16:[2,8],19:[2,8],20:[2,8],22:[2,8],23:[2,8],25:[2,8]},{4:29,6:3,7:4,8:6,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,5],20:[2,7],22:[1,14],23:[1,15],25:[1,16]},{4:30,6:3,7:4,8:6,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,5],20:[2,7],22:[1,14],23:[1,15],25:[1,16]},{5:[2,12],14:[2,12],15:[2,12],16:[2,12],19:[2,12],20:[2,12],22:[2,12],23:[2,12],25:[2,12]},{5:[2,13],14:[2,13],15:[2,13],16:[2,13],19:[2,13],20:[2,13],22:[2,13],23:[2,13],25:[2,13]},{5:[2,14],14:[2,14],15:[2,14],16:[2,14],19:[2,14],20:[2,14],22:[2,14],23:[2,14],25:[2,14]},{5:[2,15],14:[2,15],15:[2,15],16:[2,15],19:[2,15],20:[2,15],22:[2,15],23:[2,15],25:[2,15]},{17:31,21:24,29:25,36:[1,28],38:[1,27],39:26},{17:32,21:24,29:25,36:[1,28],38:[1,27],39:26},{17:33,21:24,29:25,36:[1,28],38:[1,27],39:26},{21:35,26:34,31:[1,36],32:[1,37],36:[1,28],39:26},{1:[2,1]},{5:[2,2],8:21,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,19],20:[2,2],22:[1,14],23:[1,15],25:[1,16]},{17:23,21:24,29:25,36:[1,28],38:[1,27],39:26},{5:[2,4],7:38,8:6,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,19],20:[2,4],22:[1,14],23:[1,15],25:[1,16]},{5:[2,9],14:[2,9],15:[2,9],16:[2,9],19:[2,9],20:[2,9],22:[2,9],23:[2,9],25:[2,9]},{5:[2,23],14:[2,23],15:[2,23],16:[2,23],19:[2,23],20:[2,23],22:[2,23],23:[2,23],25:[2,23]},{18:[1,39]},{18:[2,27],21:44,24:[2,27],27:40,28:41,29:48,30:42,31:[1,45],32:[1,46],33:[1,47],34:43,35:49,36:[1,50],38:[1,27],39:26},{18:[2,28],24:[2,28]},{18:[2,48],24:[2,48],31:[2,48],32:[2,48],33:[2,48],36:[2,48],38:[2,48],40:[1,51]},{21:52,36:[1,28],39:26},{18:[2,50],24:[2,50],31:[2,50],32:[2,50],33:[2,50],36:[2,50],38:[2,50],40:[2,50]},{10:53,20:[1,54]},{10:55,20:[1,54]},{18:[1,56]},{18:[1,57]},{24:[1,58]},{18:[1,59],21:60,36:[1,28],39:26},{18:[2,44],36:[2,44]},{18:[2,45],36:[2,45]},{18:[2,46],36:[2,46]},{5:[2,3],8:21,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,19],20:[2,3],22:[1,14],23:[1,15],25:[1,16]},{14:[2,17],15:[2,17],16:[2,17],19:[2,17],20:[2,17],22:[2,17],23:[2,17],25:[2,17]},{18:[2,25],21:44,24:[2,25],28:61,29:48,30:62,31:[1,45],32:[1,46],33:[1,47],34:43,35:49,36:[1,50],38:[1,27],39:26},{18:[2,26],24:[2,26]},{18:[2,30],24:[2,30],31:[2,30],32:[2,30],33:[2,30],36:[2,30],38:[2,30]},{18:[2,36],24:[2,36],35:63,36:[1,64]},{18:[2,31],24:[2,31],31:[2,31],32:[2,31],33:[2,31],36:[2,31],38:[2,31]},{18:[2,32],24:[2,32],31:[2,32],32:[2,32],33:[2,32],36:[2,32],38:[2,32]},{18:[2,33],24:[2,33],31:[2,33],32:[2,33],33:[2,33],36:[2,33],38:[2,33]},{18:[2,34],24:[2,34],31:[2,34],32:[2,34],33:[2,34],36:[2,34],38:[2,34]},{18:[2,35],24:[2,35],31:[2,35],32:[2,35],33:[2,35],36:[2,35],38:[2,35]},{18:[2,38],24:[2,38],36:[2,38]},{18:[2,50],24:[2,50],31:[2,50],32:[2,50],33:[2,50],36:[2,50],37:[1,65],38:[2,50],40:[2,50]},{36:[1,66]},{18:[2,47],24:[2,47],31:[2,47],32:[2,47],33:[2,47],36:[2,47],38:[2,47]},{5:[2,10],14:[2,10],15:[2,10],16:[2,10],19:[2,10],20:[2,10],22:[2,10],23:[2,10],25:[2,10]},{21:67,36:[1,28],39:26},{5:[2,11],14:[2,11],15:[2,11],16:[2,11],19:[2,11],20:[2,11],22:[2,11],23:[2,11],25:[2,11]},{14:[2,16],15:[2,16],16:[2,16],19:[2,16],20:[2,16],22:[2,16],23:[2,16],25:[2,16]},{5:[2,19],14:[2,19],15:[2,19],16:[2,19],19:[2,19],20:[2,19],22:[2,19],23:[2,19],25:[2,19]},{5:[2,20],14:[2,20],15:[2,20],16:[2,20],19:[2,20],20:[2,20],22:[2,20],23:[2,20],25:[2,20]},{5:[2,21],14:[2,21],15:[2,21],16:[2,21],19:[2,21],20:[2,21],22:[2,21],23:[2,21],25:[2,21]},{18:[1,68]},{18:[2,24],24:[2,24]},{18:[2,29],24:[2,29],31:[2,29],32:[2,29],33:[2,29],36:[2,29],38:[2,29]},{18:[2,37],24:[2,37],36:[2,37]},{37:[1,65]},{21:69,29:73,31:[1,70],32:[1,71],33:[1,72],36:[1,28],38:[1,27],39:26},{18:[2,49],24:[2,49],31:[2,49],32:[2,49],33:[2,49],36:[2,49],38:[2,49],40:[2,49]},{18:[1,74]},{5:[2,22],14:[2,22],15:[2,22],16:[2,22],19:[2,22],20:[2,22],22:[2,22],23:[2,22],25:[2,22]},{18:[2,39],24:[2,39],36:[2,39]},{18:[2,40],24:[2,40],36:[2,40]},{18:[2,41],24:[2,41],36:[2,41]},{18:[2,42],24:[2,42],36:[2,42]},{18:[2,43],24:[2,43],36:[2,43]},{5:[2,18],14:[2,18],15:[2,18],16:[2,18],19:[2,18],20:[2,18],22:[2,18],23:[2,18],25:[2,18]}],
+defaultActions: {17:[2,1]},
+parseError: function parseError(str, hash) {
+    throw new Error(str);
+},
+parse: function parse(input) {
+    var self = this, stack = [0], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
+    this.lexer.setInput(input);
+    this.lexer.yy = this.yy;
+    this.yy.lexer = this.lexer;
+    this.yy.parser = this;
+    if (typeof this.lexer.yylloc == "undefined")
+        this.lexer.yylloc = {};
+    var yyloc = this.lexer.yylloc;
+    lstack.push(yyloc);
+    var ranges = this.lexer.options && this.lexer.options.ranges;
+    if (typeof this.yy.parseError === "function")
+        this.parseError = this.yy.parseError;
+    function popStack(n) {
+        stack.length = stack.length - 2 * n;
+        vstack.length = vstack.length - n;
+        lstack.length = lstack.length - n;
+    }
+    function lex() {
+        var token;
+        token = self.lexer.lex() || 1;
+        if (typeof token !== "number") {
+            token = self.symbols_[token] || token;
+        }
+        return token;
+    }
+    var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
+    while (true) {
+        state = stack[stack.length - 1];
+        if (this.defaultActions[state]) {
+            action = this.defaultActions[state];
+        } else {
+            if (symbol === null || typeof symbol == "undefined") {
+                symbol = lex();
+            }
+            action = table[state] && table[state][symbol];
+        }
+        if (typeof action === "undefined" || !action.length || !action[0]) {
+            var errStr = "";
+            if (!recovering) {
+                expected = [];
+                for (p in table[state])
+                    if (this.terminals_[p] && p > 2) {
+                        expected.push("'" + this.terminals_[p] + "'");
+                    }
+                if (this.lexer.showPosition) {
+                    errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'";
+                } else {
+                    errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1?"end of input":"'" + (this.terminals_[symbol] || symbol) + "'");
+                }
+                this.parseError(errStr, {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected});
+            }
+        }
+        if (action[0] instanceof Array && action.length > 1) {
+            throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol);
+        }
+        switch (action[0]) {
+        case 1:
+            stack.push(symbol);
+            vstack.push(this.lexer.yytext);
+            lstack.push(this.lexer.yylloc);
+            stack.push(action[1]);
+            symbol = null;
+            if (!preErrorSymbol) {
+                yyleng = this.lexer.yyleng;
+                yytext = this.lexer.yytext;
+                yylineno = this.lexer.yylineno;
+                yyloc = this.lexer.yylloc;
+                if (recovering > 0)
+                    recovering--;
+            } else {
+                symbol = preErrorSymbol;
+                preErrorSymbol = null;
+            }
+            break;
+        case 2:
+            len = this.productions_[action[1]][1];
+            yyval.$ = vstack[vstack.length - len];
+            yyval._$ = {first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column};
+            if (ranges) {
+                yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]];
+            }
+            r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack);
+            if (typeof r !== "undefined") {
+                return r;
+            }
+            if (len) {
+                stack = stack.slice(0, -1 * len * 2);
+                vstack = vstack.slice(0, -1 * len);
+                lstack = lstack.slice(0, -1 * len);
+            }
+            stack.push(this.productions_[action[1]][0]);
+            vstack.push(yyval.$);
+            lstack.push(yyval._$);
+            newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
+            stack.push(newState);
+            break;
+        case 3:
+            return true;
+        }
+    }
+    return true;
+}
+};
+/* Jison generated lexer */
+var lexer = (function(){
+var lexer = ({EOF:1,
+parseError:function parseError(str, hash) {
+        if (this.yy.parser) {
+            this.yy.parser.parseError(str, hash);
+        } else {
+            throw new Error(str);
+        }
+    },
+setInput:function (input) {
+        this._input = input;
+        this._more = this._less = this.done = false;
+        this.yylineno = this.yyleng = 0;
+        this.yytext = this.matched = this.match = '';
+        this.conditionStack = ['INITIAL'];
+        this.yylloc = {first_line:1,first_column:0,last_line:1,last_column:0};
+        if (this.options.ranges) this.yylloc.range = [0,0];
+        this.offset = 0;
+        return this;
+    },
+input:function () {
+        var ch = this._input[0];
+        this.yytext += ch;
+        this.yyleng++;
+        this.offset++;
+        this.match += ch;
+        this.matched += ch;
+        var lines = ch.match(/(?:\r\n?|\n).*/g);
+        if (lines) {
+            this.yylineno++;
+            this.yylloc.last_line++;
+        } else {
+            this.yylloc.last_column++;
+        }
+        if (this.options.ranges) this.yylloc.range[1]++;
+
+        this._input = this._input.slice(1);
+        return ch;
+    },
+unput:function (ch) {
+        var len = ch.length;
+        var lines = ch.split(/(?:\r\n?|\n)/g);
+
+        this._input = ch + this._input;
+        this.yytext = this.yytext.substr(0, this.yytext.length-len-1);
+        //this.yyleng -= len;
+        this.offset -= len;
+        var oldLines = this.match.split(/(?:\r\n?|\n)/g);
+        this.match = this.match.substr(0, this.match.length-1);
+        this.matched = this.matched.substr(0, this.matched.length-1);
+
+        if (lines.length-1) this.yylineno -= lines.length-1;
+        var r = this.yylloc.range;
+
+        this.yylloc = {first_line: this.yylloc.first_line,
+          last_line: this.yylineno+1,
+          first_column: this.yylloc.first_column,
+          last_column: lines ?
+              (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length:
+              this.yylloc.first_column - len
+          };
+
+        if (this.options.ranges) {
+            this.yylloc.range = [r[0], r[0] + this.yyleng - len];
+        }
+        return this;
+    },
+more:function () {
+        this._more = true;
+        return this;
+    },
+less:function (n) {
+        this.unput(this.match.slice(n));
+    },
+pastInput:function () {
+        var past = this.matched.substr(0, this.matched.length - this.match.length);
+        return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
+    },
+upcomingInput:function () {
+        var next = this.match;
+        if (next.length < 20) {
+            next += this._input.substr(0, 20-next.length);
+        }
+        return (next.substr(0,20)+(next.length > 20 ? '...':'')).replace(/\n/g, "");
+    },
+showPosition:function () {
+        var pre = this.pastInput();
+        var c = new Array(pre.length + 1).join("-");
+        return pre + this.upcomingInput() + "\n" + c+"^";
+    },
+next:function () {
+        if (this.done) {
+            return this.EOF;
+        }
+        if (!this._input) this.done = true;
+
+        var token,
+            match,
+            tempMatch,
+            index,
+            col,
+            lines;
+        if (!this._more) {
+            this.yytext = '';
+            this.match = '';
+        }
+        var rules = this._currentRules();
+        for (var i=0;i < rules.length; i++) {
+            tempMatch = this._input.match(this.rules[rules[i]]);
+            if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
+                match = tempMatch;
+                index = i;
+                if (!this.options.flex) break;
+            }
+        }
+        if (match) {
+            lines = match[0].match(/(?:\r\n?|\n).*/g);
+            if (lines) this.yylineno += lines.length;
+            this.yylloc = {first_line: this.yylloc.last_line,
+                           last_line: this.yylineno+1,
+                           first_column: this.yylloc.last_column,
+                           last_column: lines ? lines[lines.length-1].length-lines[lines.length-1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length};
+            this.yytext += match[0];
+            this.match += match[0];
+            this.matches = match;
+            this.yyleng = this.yytext.length;
+            if (this.options.ranges) {
+                this.yylloc.range = [this.offset, this.offset += this.yyleng];
+            }
+            this._more = false;
+            this._input = this._input.slice(match[0].length);
+            this.matched += match[0];
+            token = this.performAction.call(this, this.yy, this, rules[index],this.conditionStack[this.conditionStack.length-1]);
+            if (this.done && this._input) this.done = false;
+            if (token) return token;
+            else return;
+        }
+        if (this._input === "") {
+            return this.EOF;
+        } else {
+            return this.parseError('Lexical error on line '+(this.yylineno+1)+'. Unrecognized text.\n'+this.showPosition(),
+                    {text: "", token: null, line: this.yylineno});
+        }
+    },
+lex:function lex() {
+        var r = this.next();
+        if (typeof r !== 'undefined') {
+            return r;
+        } else {
+            return this.lex();
+        }
+    },
+begin:function begin(condition) {
+        this.conditionStack.push(condition);
+    },
+popState:function popState() {
+        return this.conditionStack.pop();
+    },
+_currentRules:function _currentRules() {
+        return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules;
+    },
+topState:function () {
+        return this.conditionStack[this.conditionStack.length-2];
+    },
+pushState:function begin(condition) {
+        this.begin(condition);
+    }});
+lexer.options = {};
+lexer.performAction = function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
+
+var YYSTATE=YY_START
+switch($avoiding_name_collisions) {
+case 0: yy_.yytext = "\\"; return 14; 
+break;
+case 1:
+                                   if(yy_.yytext.slice(-1) !== "\\") this.begin("mu");
+                                   if(yy_.yytext.slice(-1) === "\\") yy_.yytext = yy_.yytext.substr(0,yy_.yyleng-1), this.begin("emu");
+                                   if(yy_.yytext) return 14;
+                                 
+break;
+case 2: return 14; 
+break;
+case 3:
+                                   if(yy_.yytext.slice(-1) !== "\\") this.popState();
+                                   if(yy_.yytext.slice(-1) === "\\") yy_.yytext = yy_.yytext.substr(0,yy_.yyleng-1);
+                                   return 14;
+                                 
+break;
+case 4: yy_.yytext = yy_.yytext.substr(0, yy_.yyleng-4); this.popState(); return 15; 
+break;
+case 5: return 25; 
+break;
+case 6: return 16; 
+break;
+case 7: return 20; 
+break;
+case 8: return 19; 
+break;
+case 9: return 19; 
+break;
+case 10: return 23; 
+break;
+case 11: return 22; 
+break;
+case 12: this.popState(); this.begin('com'); 
+break;
+case 13: yy_.yytext = yy_.yytext.substr(3,yy_.yyleng-5); this.popState(); return 15; 
+break;
+case 14: return 22; 
+break;
+case 15: return 37; 
+break;
+case 16: return 36; 
+break;
+case 17: return 36; 
+break;
+case 18: return 40; 
+break;
+case 19: /*ignore whitespace*/ 
+break;
+case 20: this.popState(); return 24; 
+break;
+case 21: this.popState(); return 18; 
+break;
+case 22: yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2).replace(/\\"/g,'"'); return 31; 
+break;
+case 23: yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2).replace(/\\'/g,"'"); return 31; 
+break;
+case 24: return 38; 
+break;
+case 25: return 33; 
+break;
+case 26: return 33; 
+break;
+case 27: return 32; 
+break;
+case 28: return 36; 
+break;
+case 29: yy_.yytext = yy_.yytext.substr(1, yy_.yyleng-2); return 36; 
+break;
+case 30: return 'INVALID'; 
+break;
+case 31: return 5; 
+break;
+}
+};
+lexer.rules = [/^(?:\\\\(?=(\{\{)))/,/^(?:[^\x00]*?(?=(\{\{)))/,/^(?:[^\x00]+)/,/^(?:[^\x00]{2,}?(?=(\{\{|$)))/,/^(?:[\s\S]*?--\}\})/,/^(?:\{\{>)/,/^(?:\{\{#)/,/^(?:\{\{\/)/,/^(?:\{\{\^)/,/^(?:\{\{\s*else\b)/,/^(?:\{\{\{)/,/^(?:\{\{&)/,/^(?:\{\{!--)/,/^(?:\{\{![\s\S]*?\}\})/,/^(?:\{\{)/,/^(?:=)/,/^(?:\.(?=[}\/ ]))/,/^(?:\.\.)/,/^(?:[\/.])/,/^(?:\s+)/,/^(?:\}\}\})/,/^(?:\}\})/,/^(?:"(\\["]|[^"])*")/,/^(?:'(\\[']|[^'])*')/,/^(?:@)/,/^(?:true(?=[}\s]))/,/^(?:false(?=[}\s]))/,/^(?:-?[0-9]+(?=[}\s]))/,/^(?:[^\s!"#%-,\.\/;->@\[-\^` + "`" + `\{-~]+(?=[=}\s\/.]))/,/^(?:\[[^\]]*\])/,/^(?:.)/,/^(?:$)/];
+lexer.conditions = {"mu":{"rules":[5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31],"inclusive":false},"emu":{"rules":[3],"inclusive":false},"com":{"rules":[4],"inclusive":false},"INITIAL":{"rules":[0,1,2,31],"inclusive":true}};
+return lexer;})()
+parser.lexer = lexer;
+function Parser () { this.yy = {}; }Parser.prototype = parser;parser.Parser = Parser;
+return new Parser;
+})();;
+// lib/handlebars/compiler/base.js
+
+Handlebars.Parser = handlebars;
+
+Handlebars.parse = function(input) {
+
+  // Just return if an already-compile AST was passed in.
+  if(input.constructor === Handlebars.AST.ProgramNode) { return input; }
+
+  Handlebars.Parser.yy = Handlebars.AST;
+  return Handlebars.Parser.parse(input);
+};
+;
+// lib/handlebars/compiler/ast.js
+Handlebars.AST = {};
+
+Handlebars.AST.ProgramNode = function(statements, inverse) {
+  this.type = "program";
+  this.statements = statements;
+  if(inverse) { this.inverse = new Handlebars.AST.ProgramNode(inverse); }
+};
+
+Handlebars.AST.MustacheNode = function(rawParams, hash, unescaped) {
+  this.type = "mustache";
+  this.escaped = !unescaped;
+  this.hash = hash;
+
+  var id = this.id = rawParams[0];
+  var params = this.params = rawParams.slice(1);
+
+  // a mustache is an eligible helper if:
+  // * its id is simple (a single part, not ` + "`" + `this` + "`" + ` or ` + "`" + `..` + "`" + `)
+  var eligibleHelper = this.eligibleHelper = id.isSimple;
+
+  // a mustache is definitely a helper if:
+  // * it is an eligible helper, and
+  // * it has at least one parameter or hash segment
+  this.isHelper = eligibleHelper && (params.length || hash);
+
+  // if a mustache is an eligible helper but not a definite
+  // helper, it is ambiguous, and will be resolved in a later
+  // pass or at runtime.
+};
+
+Handlebars.AST.PartialNode = function(partialName, context) {
+  this.type         = "partial";
+  this.partialName  = partialName;
+  this.context      = context;
+};
+
+Handlebars.AST.BlockNode = function(mustache, program, inverse, close) {
+  var verifyMatch = function(open, close) {
+    if(open.original !== close.original) {
+      throw new Handlebars.Exception(open.original + " doesn't match " + close.original);
+    }
+  };
+
+  verifyMatch(mustache.id, close);
+  this.type = "block";
+  this.mustache = mustache;
+  this.program  = program;
+  this.inverse  = inverse;
+
+  if (this.inverse && !this.program) {
+    this.isInverse = true;
+  }
+};
+
+Handlebars.AST.ContentNode = function(string) {
+  this.type = "content";
+  this.string = string;
+};
+
+Handlebars.AST.HashNode = function(pairs) {
+  this.type = "hash";
+  this.pairs = pairs;
+};
+
+Handlebars.AST.IdNode = function(parts) {
+  this.type = "ID";
+
+  var original = "",
+      dig = [],
+      depth = 0;
+
+  for(var i=0,l=parts.length; i<l; i++) {
+    var part = parts[i].part;
+    original += (parts[i].separator || '') + part;
+
+    if (part === ".." || part === "." || part === "this") {
+      if (dig.length > 0) { throw new Handlebars.Exception("Invalid path: " + original); }
+      else if (part === "..") { depth++; }
+      else { this.isScoped = true; }
+    }
+    else { dig.push(part); }
+  }
+
+  this.original = original;
+  this.parts    = dig;
+  this.string   = dig.join('.');
+  this.depth    = depth;
+
+  // an ID is simple if it only has one part, and that part is not
+  // ` + "`" + `..` + "`" + ` or ` + "`" + `this` + "`" + `.
+  this.isSimple = parts.length === 1 && !this.isScoped && depth === 0;
+
+  this.stringModeValue = this.string;
+};
+
+Handlebars.AST.PartialNameNode = function(name) {
+  this.type = "PARTIAL_NAME";
+  this.name = name.original;
+};
+
+Handlebars.AST.DataNode = function(id) {
+  this.type = "DATA";
+  this.id = id;
+};
+
+Handlebars.AST.StringNode = function(string) {
+  this.type = "STRING";
+  this.original =
+    this.string =
+    this.stringModeValue = string;
+};
+
+Handlebars.AST.IntegerNode = function(integer) {
+  this.type = "INTEGER";
+  this.original =
+    this.integer = integer;
+  this.stringModeValue = Number(integer);
+};
+
+Handlebars.AST.BooleanNode = function(bool) {
+  this.type = "BOOLEAN";
+  this.bool = bool;
+  this.stringModeValue = bool === "true";
+};
+
+Handlebars.AST.CommentNode = function(comment) {
+  this.type = "comment";
+  this.comment = comment;
+};
+;
+// lib/handlebars/utils.js
+
+var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack'];
+
+Handlebars.Exception = function(message) {
+  var tmp = Error.prototype.constructor.apply(this, arguments);
+
+  // Unfortunately errors are not enumerable in Chrome (at least), so ` + "`" + `for prop in tmp` + "`" + ` doesn't work.
+  for (var idx = 0; idx < errorProps.length; idx++) {
+    this[errorProps[idx]] = tmp[errorProps[idx]];
+  }
+};
+Handlebars.Exception.prototype = new Error();
+
+// Build out our basic SafeString type
+Handlebars.SafeString = function(string) {
+  this.string = string;
+};
+Handlebars.SafeString.prototype.toString = function() {
+  return this.string.toString();
+};
+
+var escape = {
+  "&": "&amp;",
+  "<": "&lt;",
+  ">": "&gt;",
+  '"': "&quot;",
+  "'": "&#x27;",
+  "` + "`" + `": "&#x60;"
+};
+
+var badChars = /[&<>"'` + "`" + `]/g;
+var possible = /[&<>"'` + "`" + `]/;
+
+var escapeChar = function(chr) {
+  return escape[chr] || "&amp;";
+};
+
+Handlebars.Utils = {
+  extend: function(obj, value) {
+    for(var key in value) {
+      if(value.hasOwnProperty(key)) {
+        obj[key] = value[key];
+      }
+    }
+  },
+
+  escapeExpression: function(string) {
+    // don't escape SafeStrings, since they're already safe
+    if (string instanceof Handlebars.SafeString) {
+      return string.toString();
+    } else if (string == null || string === false) {
+      return "";
+    }
+
+    // Force a string conversion as this will be done by the append regardless and
+    // the regex test will do this transparently behind the scenes, causing issues if
+    // an object's to string has escaped characters in it.
+    string = string.toString();
+
+    if(!possible.test(string)) { return string; }
+    return string.replace(badChars, escapeChar);
+  },
+
+  isEmpty: function(value) {
+    if (!value && value !== 0) {
+      return true;
+    } else if(toString.call(value) === "[object Array]" && value.length === 0) {
+      return true;
+    } else {
+      return false;
+    }
+  }
+};
+;
+// lib/handlebars/compiler/compiler.js
+
+/*jshint eqnull:true*/
+var Compiler = Handlebars.Compiler = function() {};
+var JavaScriptCompiler = Handlebars.JavaScriptCompiler = function() {};
+
+// the foundHelper register will disambiguate helper lookup from finding a
+// function in a context. This is necessary for mustache compatibility, which
+// requires that context functions in blocks are evaluated by blockHelperMissing,
+// and then proceed as if the resulting value was provided to blockHelperMissing.
+
+Compiler.prototype = {
+  compiler: Compiler,
+
+  disassemble: function() {
+    var opcodes = this.opcodes, opcode, out = [], params, param;
+
+    for (var i=0, l=opcodes.length; i<l; i++) {
+      opcode = opcodes[i];
+
+      if (opcode.opcode === 'DECLARE') {
+        out.push("DECLARE " + opcode.name + "=" + opcode.value);
+      } else {
+        params = [];
+        for (var j=0; j<opcode.args.length; j++) {
+          param = opcode.args[j];
+          if (typeof param === "string") {
+            param = "\"" + param.replace("\n", "\\n") + "\"";
+          }
+          params.push(param);
+        }
+        out.push(opcode.opcode + " " + params.join(" "));
+      }
+    }
+
+    return out.join("\n");
+  },
+  equals: function(other) {
+    var len = this.opcodes.length;
+    if (other.opcodes.length !== len) {
+      return false;
+    }
+
+    for (var i = 0; i < len; i++) {
+      var opcode = this.opcodes[i],
+          otherOpcode = other.opcodes[i];
+      if (opcode.opcode !== otherOpcode.opcode || opcode.args.length !== otherOpcode.args.length) {
+        return false;
+      }
+      for (var j = 0; j < opcode.args.length; j++) {
+        if (opcode.args[j] !== otherOpcode.args[j]) {
+          return false;
+        }
+      }
+    }
+
+    len = this.children.length;
+    if (other.children.length !== len) {
+      return false;
+    }
+    for (i = 0; i < len; i++) {
+      if (!this.children[i].equals(other.children[i])) {
+        return false;
+      }
+    }
+
+    return true;
+  },
+
+  guid: 0,
+
+  compile: function(program, options) {
+    this.children = [];
+    this.depths = {list: []};
+    this.options = options;
+
+    // These changes will propagate to the other compiler components
+    var knownHelpers = this.options.knownHelpers;
+    this.options.knownHelpers = {
+      'helperMissing': true,
+      'blockHelperMissing': true,
+      'each': true,
+      'if': true,
+      'unless': true,
+      'with': true,
+      'log': true
+    };
+    if (knownHelpers) {
+      for (var name in knownHelpers) {
+        this.options.knownHelpers[name] = knownHelpers[name];
+      }
+    }
+
+    return this.program(program);
+  },
+
+  accept: function(node) {
+    return this[node.type](node);
+  },
+
+  program: function(program) {
+    var statements = program.statements, statement;
+    this.opcodes = [];
+
+    for(var i=0, l=statements.length; i<l; i++) {
+      statement = statements[i];
+      this[statement.type](statement);
+    }
+    this.isSimple = l === 1;
+
+    this.depths.list = this.depths.list.sort(function(a, b) {
+      return a - b;
+    });
+
+    return this;
+  },
+
+  compileProgram: function(program) {
+    var result = new this.compiler().compile(program, this.options);
+    var guid = this.guid++, depth;
+
+    this.usePartial = this.usePartial || result.usePartial;
+
+    this.children[guid] = result;
+
+    for(var i=0, l=result.depths.list.length; i<l; i++) {
+      depth = result.depths.list[i];
+
+      if(depth < 2) { continue; }
+      else { this.addDepth(depth - 1); }
+    }
+
+    return guid;
+  },
+
+  block: function(block) {
+    var mustache = block.mustache,
+        program = block.program,
+        inverse = block.inverse;
+
+    if (program) {
+      program = this.compileProgram(program);
+    }
+
+    if (inverse) {
+      inverse = this.compileProgram(inverse);
+    }
+
+    var type = this.classifyMustache(mustache);
+
+    if (type === "helper") {
+      this.helperMustache(mustache, program, inverse);
+    } else if (type === "simple") {
+      this.simpleMustache(mustache);
+
+      // now that the simple mustache is resolved, we need to
+      // evaluate it by executing ` + "`" + `blockHelperMissing` + "`" + `
+      this.opcode('pushProgram', program);
+      this.opcode('pushProgram', inverse);
+      this.opcode('emptyHash');
+      this.opcode('blockValue');
+    } else {
+      this.ambiguousMustache(mustache, program, inverse);
+
+      // now that the simple mustache is resolved, we need to
+      // evaluate it by executing ` + "`" + `blockHelperMissing` + "`" + `
+      this.opcode('pushProgram', program);
+      this.opcode('pushProgram', inverse);
+      this.opcode('emptyHash');
+      this.opcode('ambiguousBlockValue');
+    }
+
+    this.opcode('append');
+  },
+
+  hash: function(hash) {
+    var pairs = hash.pairs, pair, val;
+
+    this.opcode('pushHash');
+
+    for(var i=0, l=pairs.length; i<l; i++) {
+      pair = pairs[i];
+      val  = pair[1];
+
+      if (this.options.stringParams) {
+        if(val.depth) {
+          this.addDepth(val.depth);
+        }
+        this.opcode('getContext', val.depth || 0);
+        this.opcode('pushStringParam', val.stringModeValue, val.type);
+      } else {
+        this.accept(val);
+      }
+
+      this.opcode('assignToHash', pair[0]);
+    }
+    this.opcode('popHash');
+  },
+
+  partial: function(partial) {
+    var partialName = partial.partialName;
+    this.usePartial = true;
+
+    if(partial.context) {
+      this.ID(partial.context);
+    } else {
+      this.opcode('push', 'depth0');
+    }
+
+    this.opcode('invokePartial', partialName.name);
+    this.opcode('append');
+  },
+
+  content: function(content) {
+    this.opcode('appendContent', content.string);
+  },
+
+  mustache: function(mustache) {
+    var options = this.options;
+    var type = this.classifyMustache(mustache);
+
+    if (type === "simple") {
+      this.simpleMustache(mustache);
+    } else if (type === "helper") {
+      this.helperMustache(mustache);
+    } else {
+      this.ambiguousMustache(mustache);
+    }
+
+    if(mustache.escaped && !options.noEscape) {
+      this.opcode('appendEscaped');
+    } else {
+      this.opcode('append');
+    }
+  },
+
+  ambiguousMustache: function(mustache, program, inverse) {
+    var id = mustache.id,
+        name = id.parts[0],
+        isBlock = program != null || inverse != null;
+
+    this.opcode('getContext', id.depth);
+
+    this.opcode('pushProgram', program);
+    this.opcode('pushProgram', inverse);
+
+    this.opcode('invokeAmbiguous', name, isBlock);
+  },
+
+  simpleMustache: function(mustache) {
+    var id = mustache.id;
+
+    if (id.type === 'DATA') {
+      this.DATA(id);
+    } else if (id.parts.length) {
+      this.ID(id);
+    } else {
+      // Simplified ID for ` + "`" + `this` + "`" + `
+      this.addDepth(id.depth);
+      this.opcode('getContext', id.depth);
+      this.opcode('pushContext');
+    }
+
+    this.opcode('resolvePossibleLambda');
+  },
+
+  helperMustache: function(mustache, program, inverse) {
+    var params = this.setupFullMustacheParams(mustache, program, inverse),
+        name = mustache.id.parts[0];
+
+    if (this.options.knownHelpers[name]) {
+      this.opcode('invokeKnownHelper', params.length, name);
+    } else if (this.options.knownHelpersOnly) {
+      throw new Error("You specified knownHelpersOnly, but used the unknown helper " + name);
+    } else {
+      this.opcode('invokeHelper', params.length, name);
+    }
+  },
+
+  ID: function(id) {
+    this.addDepth(id.depth);
+    this.opcode('getContext', id.depth);
+
+    var name = id.parts[0];
+    if (!name) {
+      this.opcode('pushContext');
+    } else {
+      this.opcode('lookupOnContext', id.parts[0]);
+    }
+
+    for(var i=1, l=id.parts.length; i<l; i++) {
+      this.opcode('lookup', id.parts[i]);
+    }
+  },
+
+  DATA: function(data) {
+    this.options.data = true;
+    if (data.id.isScoped || data.id.depth) {
+      throw new Handlebars.Exception('Scoped data references are not supported: ' + data.original);
+    }
+
+    this.opcode('lookupData');
+    var parts = data.id.parts;
+    for(var i=0, l=parts.length; i<l; i++) {
+      this.opcode('lookup', parts[i]);
+    }
+  },
+
+  STRING: function(string) {
+    this.opcode('pushString', string.string);
+  },
+
+  INTEGER: function(integer) {
+    this.opcode('pushLiteral', integer.integer);
+  },
+
+  BOOLEAN: function(bool) {
+    this.opcode('pushLiteral', bool.bool);
+  },
+
+  comment: function() {},
+
+  // HELPERS
+  opcode: function(name) {
+    this.opcodes.push({ opcode: name, args: [].slice.call(arguments, 1) });
+  },
+
+  declare: function(name, value) {
+    this.opcodes.push({ opcode: 'DECLARE', name: name, value: value });
+  },
+
+  addDepth: function(depth) {
+    if(isNaN(depth)) { throw new Error("EWOT"); }
+    if(depth === 0) { return; }
+
+    if(!this.depths[depth]) {
+      this.depths[depth] = true;
+      this.depths.list.push(depth);
+    }
+  },
+
+  classifyMustache: function(mustache) {
+    var isHelper   = mustache.isHelper;
+    var isEligible = mustache.eligibleHelper;
+    var options    = this.options;
+
+    // if ambiguous, we can possibly resolve the ambiguity now
+    if (isEligible && !isHelper) {
+      var name = mustache.id.parts[0];
+
+      if (options.knownHelpers[name]) {
+        isHelper = true;
+      } else if (options.knownHelpersOnly) {
+        isEligible = false;
+      }
+    }
+
+    if (isHelper) { return "helper"; }
+    else if (isEligible) { return "ambiguous"; }
+    else { return "simple"; }
+  },
+
+  pushParams: function(params) {
+    var i = params.length, param;
+
+    while(i--) {
+      param = params[i];
+
+      if(this.options.stringParams) {
+        if(param.depth) {
+          this.addDepth(param.depth);
+        }
+
+        this.opcode('getContext', param.depth || 0);
+        this.opcode('pushStringParam', param.stringModeValue, param.type);
+      } else {
+        this[param.type](param);
+      }
+    }
+  },
+
+  setupMustacheParams: function(mustache) {
+    var params = mustache.params;
+    this.pushParams(params);
+
+    if(mustache.hash) {
+      this.hash(mustache.hash);
+    } else {
+      this.opcode('emptyHash');
+    }
+
+    return params;
+  },
+
+  // this will replace setupMustacheParams when we're done
+  setupFullMustacheParams: function(mustache, program, inverse) {
+    var params = mustache.params;
+    this.pushParams(params);
+
+    this.opcode('pushProgram', program);
+    this.opcode('pushProgram', inverse);
+
+    if(mustache.hash) {
+      this.hash(mustache.hash);
+    } else {
+      this.opcode('emptyHash');
+    }
+
+    return params;
+  }
+};
+
+var Literal = function(value) {
+  this.value = value;
+};
+
+JavaScriptCompiler.prototype = {
+  // PUBLIC API: You can override these methods in a subclass to provide
+  // alternative compiled forms for name lookup and buffering semantics
+  nameLookup: function(parent, name /* , type*/) {
+    if (/^[0-9]+$/.test(name)) {
+      return parent + "[" + name + "]";
+    } else if (JavaScriptCompiler.isValidJavaScriptVariableName(name)) {
+      return parent + "." + name;
+    }
+    else {
+      return parent + "['" + name + "']";
+    }
+  },
+
+  appendToBuffer: function(string) {
+    if (this.environment.isSimple) {
+      return "return " + string + ";";
+    } else {
+      return {
+        appendToBuffer: true,
+        content: string,
+        toString: function() { return "buffer += " + string + ";"; }
+      };
+    }
+  },
+
+  initializeBuffer: function() {
+    return this.quotedString("");
+  },
+
+  namespace: "Handlebars",
+  // END PUBLIC API
+
+  compile: function(environment, options, context, asObject) {
+    this.environment = environment;
+    this.options = options || {};
+
+    Handlebars.log(Handlebars.logger.DEBUG, this.environment.disassemble() + "\n\n");
+
+    this.name = this.environment.name;
+    this.isChild = !!context;
+    this.context = context || {
+      programs: [],
+      environments: [],
+      aliases: { }
+    };
+
+    this.preamble();
+
+    this.stackSlot = 0;
+    this.stackVars = [];
+    this.registers = { list: [] };
+    this.compileStack = [];
+    this.inlineStack = [];
+
+    this.compileChildren(environment, options);
+
+    var opcodes = environment.opcodes, opcode;
+
+    this.i = 0;
+
+    for(l=opcodes.length; this.i<l; this.i++) {
+      opcode = opcodes[this.i];
+
+      if(opcode.opcode === 'DECLARE') {
+        this[opcode.name] = opcode.value;
+      } else {
+        this[opcode.opcode].apply(this, opcode.args);
+      }
+    }
+
+    return this.createFunctionContext(asObject);
+  },
+
+  nextOpcode: function() {
+    var opcodes = this.environment.opcodes;
+    return opcodes[this.i + 1];
+  },
+
+  eat: function() {
+    this.i = this.i + 1;
+  },
+
+  preamble: function() {
+    var out = [];
+
+    if (!this.isChild) {
+      var namespace = this.namespace;
+
+      var copies = "helpers = this.merge(helpers, " + namespace + ".helpers);";
+      if (this.environment.usePartial) { copies = copies + " partials = this.merge(partials, " + namespace + ".partials);"; }
+      if (this.options.data) { copies = copies + " data = data || {};"; }
+      out.push(copies);
+    } else {
+      out.push('');
+    }
+
+    if (!this.environment.isSimple) {
+      out.push(", buffer = " + this.initializeBuffer());
+    } else {
+      out.push("");
+    }
+
+    // track the last context pushed into place to allow skipping the
+    // getContext opcode when it would be a noop
+    this.lastContext = 0;
+    this.source = out;
+  },
+
+  createFunctionContext: function(asObject) {
+    var locals = this.stackVars.concat(this.registers.list);
+
+    if(locals.length > 0) {
+      this.source[1] = this.source[1] + ", " + locals.join(", ");
+    }
+
+    // Generate minimizer alias mappings
+    if (!this.isChild) {
+      for (var alias in this.context.aliases) {
+        if (this.context.aliases.hasOwnProperty(alias)) {
+          this.source[1] = this.source[1] + ', ' + alias + '=' + this.context.aliases[alias];
+        }
+      }
+    }
+
+    if (this.source[1]) {
+      this.source[1] = "var " + this.source[1].substring(2) + ";";
+    }
+
+    // Merge children
+    if (!this.isChild) {
+      this.source[1] += '\n' + this.context.programs.join('\n') + '\n';
+    }
+
+    if (!this.environment.isSimple) {
+      this.source.push("return buffer;");
+    }
+
+    var params = this.isChild ? ["depth0", "data"] : ["Handlebars", "depth0", "helpers", "partials", "data"];
+
+    for(var i=0, l=this.environment.depths.list.length; i<l; i++) {
+      params.push("depth" + this.environment.depths.list[i]);
+    }
+
+    // Perform a second pass over the output to merge content when possible
+    var source = this.mergeSource();
+
+    if (!this.isChild) {
+      var revision = Handlebars.COMPILER_REVISION,
+          versions = Handlebars.REVISION_CHANGES[revision];
+      source = "this.compilerInfo = ["+revision+",'"+versions+"'];\n"+source;
+    }
+
+    if (asObject) {
+      params.push(source);
+
+      return Function.apply(this, params);
+    } else {
+      var functionSource = 'function ' + (this.name || '') + '(' + params.join(',') + ') {\n  ' + source + '}';
+      Handlebars.log(Handlebars.logger.DEBUG, functionSource + "\n\n");
+      return functionSource;
+    }
+  },
+  mergeSource: function() {
+    // WARN: We are not handling the case where buffer is still populated as the source should
+    // not have buffer append operations as their final action.
+    var source = '',
+        buffer;
+    for (var i = 0, len = this.source.length; i < len; i++) {
+      var line = this.source[i];
+      if (line.appendToBuffer) {
+        if (buffer) {
+          buffer = buffer + '\n    + ' + line.content;
+        } else {
+          buffer = line.content;
+        }
+      } else {
+        if (buffer) {
+          source += 'buffer += ' + buffer + ';\n  ';
+          buffer = undefined;
+        }
+        source += line + '\n  ';
+      }
+    }
+    return source;
+  },
+
+  // [blockValue]
+  //
+  // On stack, before: hash, inverse, program, value
+  // On stack, after: return value of blockHelperMissing
+  //
+  // The purpose of this opcode is to take a block of the form
+  // ` + "`" + `{{#foo}}...{{/foo}}` + "`" + `, resolve the value of ` + "`" + `foo` + "`" + `, and
+  // replace it on the stack with the result of properly
+  // invoking blockHelperMissing.
+  blockValue: function() {
+    this.context.aliases.blockHelperMissing = 'helpers.blockHelperMissing';
+
+    var params = ["depth0"];
+    this.setupParams(0, params);
+
+    this.replaceStack(function(current) {
+      params.splice(1, 0, current);
+      return "blockHelperMissing.call(" + params.join(", ") + ")";
+    });
+  },
+
+  // [ambiguousBlockValue]
+  //
+  // On stack, before: hash, inverse, program, value
+  // Compiler value, before: lastHelper=value of last found helper, if any
+  // On stack, after, if no lastHelper: same as [blockValue]
+  // On stack, after, if lastHelper: value
+  ambiguousBlockValue: function() {
+    this.context.aliases.blockHelperMissing = 'helpers.blockHelperMissing';
+
+    var params = ["depth0"];
+    this.setupParams(0, params);
+
+    var current = this.topStack();
+    params.splice(1, 0, current);
+
+    // Use the options value generated from the invocation
+    params[params.length-1] = 'options';
+
+    this.source.push("if (!" + this.lastHelper + ") { " + current + " = blockHelperMissing.call(" + params.join(", ") + "); }");
+  },
+
+  // [appendContent]
+  //
+  // On stack, before: ...
+  // On stack, after: ...
+  //
+  // Appends the string value of ` + "`" + `content` + "`" + ` to the current buffer
+  appendContent: function(content) {
+    this.source.push(this.appendToBuffer(this.quotedString(content)));
+  },
+
+  // [append]
+  //
+  // On stack, before: value, ...
+  // On stack, after: ...
+  //
+  // Coerces ` + "`" + `value` + "`" + ` to a String and appends it to the current buffer.
+  //
+  // If ` + "`" + `value` + "`" + ` is truthy, or 0, it is coerced into a string and appended
+  // Otherwise, the empty string is appended
+  append: function() {
+    // Force anything that is inlined onto the stack so we don't have duplication
+    // when we examine local
+    this.flushInline();
+    var local = this.popStack();
+    this.source.push("if(" + local + " || " + local + " === 0) { " + this.appendToBuffer(local) + " }");
+    if (this.environment.isSimple) {
+      this.source.push("else { " + this.appendToBuffer("''") + " }");
+    }
+  },
+
+  // [appendEscaped]
+  //
+  // On stack, before: value, ...
+  // On stack, after: ...
+  //
+  // Escape ` + "`" + `value` + "`" + ` and append it to the buffer
+  appendEscaped: function() {
+    this.context.aliases.escapeExpression = 'this.escapeExpression';
+
+    this.source.push(this.appendToBuffer("escapeExpression(" + this.popStack() + ")"));
+  },
+
+  // [getContext]
+  //
+  // On stack, before: ...
+  // On stack, after: ...
+  // Compiler value, after: lastContext=depth
+  //
+  // Set the value of the ` + "`" + `lastContext` + "`" + ` compiler value to the depth
+  getContext: function(depth) {
+    if(this.lastContext !== depth) {
+      this.lastContext = depth;
+    }
+  },
+
+  // [lookupOnContext]
+  //
+  // On stack, before: ...
+  // On stack, after: currentContext[name], ...
+  //
+  // Looks up the value of ` + "`" + `name` + "`" + ` on the current context and pushes
+  // it onto the stack.
+  lookupOnContext: function(name) {
+    this.push(this.nameLookup('depth' + this.lastContext, name, 'context'));
+  },
+
+  // [pushContext]
+  //
+  // On stack, before: ...
+  // On stack, after: currentContext, ...
+  //
+  // Pushes the value of the current context onto the stack.
+  pushContext: function() {
+    this.pushStackLiteral('depth' + this.lastContext);
+  },
+
+  // [resolvePossibleLambda]
+  //
+  // On stack, before: value, ...
+  // On stack, after: resolved value, ...
+  //
+  // If the ` + "`" + `value` + "`" + ` is a lambda, replace it on the stack by
+  // the return value of the lambda
+  resolvePossibleLambda: function() {
+    this.context.aliases.functionType = '"function"';
+
+    this.replaceStack(function(current) {
+      return "typeof " + current + " === functionType ? " + current + ".apply(depth0) : " + current;
+    });
+  },
+
+  // [lookup]
+  //
+  // On stack, before: value, ...
+  // On stack, after: value[name], ...
+  //
+  // Replace the value on the stack with the result of looking
+  // up ` + "`" + `name` + "`" + ` on ` + "`" + `value` + "`" + `
+  lookup: function(name) {
+    this.replaceStack(function(current) {
+      return current + " == null || " + current + " === false ? " + current + " : " + this.nameLookup(current, name, 'context');
+    });
+  },
+
+  // [lookupData]
+  //
+  // On stack, before: ...
+  // On stack, after: data[id], ...
+  //
+  // Push the result of looking up ` + "`" + `id` + "`" + ` on the current data
+  lookupData: function(id) {
+    this.push('data');
+  },
+
+  // [pushStringParam]
+  //
+  // On stack, before: ...
+  // On stack, after: string, currentContext, ...
+  //
+  // This opcode is designed for use in string mode, which
+  // provides the string value of a parameter along with its
+  // depth rather than resolving it immediately.
+  pushStringParam: function(string, type) {
+    this.pushStackLiteral('depth' + this.lastContext);
+
+    this.pushString(type);
+
+    if (typeof string === 'string') {
+      this.pushString(string);
+    } else {
+      this.pushStackLiteral(string);
+    }
+  },
+
+  emptyHash: function() {
+    this.pushStackLiteral('{}');
+
+    if (this.options.stringParams) {
+      this.register('hashTypes', '{}');
+      this.register('hashContexts', '{}');
+    }
+  },
+  pushHash: function() {
+    this.hash = {values: [], types: [], contexts: []};
+  },
+  popHash: function() {
+    var hash = this.hash;
+    this.hash = undefined;
+
+    if (this.options.stringParams) {
+      this.register('hashContexts', '{' + hash.contexts.join(',') + '}');
+      this.register('hashTypes', '{' + hash.types.join(',') + '}');
+    }
+    this.push('{\n    ' + hash.values.join(',\n    ') + '\n  }');
+  },
+
+  // [pushString]
+  //
+  // On stack, before: ...
+  // On stack, after: quotedString(string), ...
+  //
+  // Push a quoted version of ` + "`" + `string` + "`" + ` onto the stack
+  pushString: function(string) {
+    this.pushStackLiteral(this.quotedString(string));
+  },
+
+  // [push]
+  //
+  // On stack, before: ...
+  // On stack, after: expr, ...
+  //
+  // Push an expression onto the stack
+  push: function(expr) {
+    this.inlineStack.push(expr);
+    return expr;
+  },
+
+  // [pushLiteral]
+  //
+  // On stack, before: ...
+  // On stack, after: value, ...
+  //
+  // Pushes a value onto the stack. This operation prevents
+  // the compiler from creating a temporary variable to hold
+  // it.
+  pushLiteral: function(value) {
+    this.pushStackLiteral(value);
+  },
+
+  // [pushProgram]
+  //
+  // On stack, before: ...
+  // On stack, after: program(guid), ...
+  //
+  // Push a program expression onto the stack. This takes
+  // a compile-time guid and converts it into a runtime-accessible
+  // expression.
+  pushProgram: function(guid) {
+    if (guid != null) {
+      this.pushStackLiteral(this.programExpression(guid));
+    } else {
+      this.pushStackLiteral(null);
+    }
+  },
+
+  // [invokeHelper]
+  //
+  // On stack, before: hash, inverse, program, params..., ...
+  // On stack, after: result of helper invocation
+  //
+  // Pops off the helper's parameters, invokes the helper,
+  // and pushes the helper's return value onto the stack.
+  //
+  // If the helper is not found, ` + "`" + `helperMissing` + "`" + ` is called.
+  invokeHelper: function(paramSize, name) {
+    this.context.aliases.helperMissing = 'helpers.helperMissing';
+
+    var helper = this.lastHelper = this.setupHelper(paramSize, name, true);
+    var nonHelper = this.nameLookup('depth' + this.lastContext, name, 'context');
+
+    this.push(helper.name + ' || ' + nonHelper);
+    this.replaceStack(function(name) {
+      return name + ' ? ' + name + '.call(' +
+          helper.callParams + ") " + ": helperMissing.call(" +
+          helper.helperMissingParams + ")";
+    });
+  },
+
+  // [invokeKnownHelper]
+  //
+  // On stack, before: hash, inverse, program, params..., ...
+  // On stack, after: result of helper invocation
+  //
+  // This operation is used when the helper is known to exist,
+  // so a ` + "`" + `helperMissing` + "`" + ` fallback is not required.
+  invokeKnownHelper: function(paramSize, name) {
+    var helper = this.setupHelper(paramSize, name);
+    this.push(helper.name + ".call(" + helper.callParams + ")");
+  },
+
+  // [invokeAmbiguous]
+  //
+  // On stack, before: hash, inverse, program, params..., ...
+  // On stack, after: result of disambiguation
+  //
+  // This operation is used when an expression like ` + "`" + `{{foo}}` + "`" + `
+  // is provided, but we don't know at compile-time whether it
+  // is a helper or a path.
+  //
+  // This operation emits more code than the other options,
+  // and can be avoided by passing the ` + "`" + `knownHelpers` + "`" + ` and
+  // ` + "`" + `knownHelpersOnly` + "`" + ` flags at compile-time.
+  invokeAmbiguous: function(name, helperCall) {
+    this.context.aliases.functionType = '"function"';
+
+    this.pushStackLiteral('{}');    // Hash value
+    var helper = this.setupHelper(0, name, helperCall);
+
+    var helperName = this.lastHelper = this.nameLookup('helpers', name, 'helper');
+
+    var nonHelper = this.nameLookup('depth' + this.lastContext, name, 'context');
+    var nextStack = this.nextStack();
+
+    this.source.push('if (' + nextStack + ' = ' + helperName + ') { ' + nextStack + ' = ' + nextStack + '.call(' + helper.callParams + '); }');
+    this.source.push('else { ' + nextStack + ' = ' + nonHelper + '; ' + nextStack + ' = typeof ' + nextStack + ' === functionType ? ' + nextStack + '.apply(depth0) : ' + nextStack + '; }');
+  },
+
+  // [invokePartial]
+  //
+  // On stack, before: context, ...
+  // On stack after: result of partial invocation
+  //
+  // This operation pops off a context, invokes a partial with that context,
+  // and pushes the result of the invocation back.
+  invokePartial: function(name) {
+    var params = [this.nameLookup('partials', name, 'partial'), "'" + name + "'", this.popStack(), "helpers", "partials"];
+
+    if (this.options.data) {
+      params.push("data");
+    }
+
+    this.context.aliases.self = "this";
+    this.push("self.invokePartial(" + params.join(", ") + ")");
+  },
+
+  // [assignToHash]
+  //
+  // On stack, before: value, hash, ...
+  // On stack, after: hash, ...
+  //
+  // Pops a value and hash off the stack, assigns ` + "`" + `hash[key] = value` + "`" + `
+  // and pushes the hash back onto the stack.
+  assignToHash: function(key) {
+    var value = this.popStack(),
+        context,
+        type;
+
+    if (this.options.stringParams) {
+      type = this.popStack();
+      context = this.popStack();
+    }
+
+    var hash = this.hash;
+    if (context) {
+      hash.contexts.push("'" + key + "': " + context);
+    }
+    if (type) {
+      hash.types.push("'" + key + "': " + type);
+    }
+    hash.values.push("'" + key + "': (" + value + ")");
+  },
+
+  // HELPERS
+
+  compiler: JavaScriptCompiler,
+
+  compileChildren: function(environment, options) {
+    var children = environment.children, child, compiler;
+
+    for(var i=0, l=children.length; i<l; i++) {
+      child = children[i];
+      compiler = new this.compiler();
+
+      var index = this.matchExistingProgram(child);
+
+      if (index == null) {
+        this.context.programs.push('');     // Placeholder to prevent name conflicts for nested children
+        index = this.context.programs.length;
+        child.index = index;
+        child.name = 'program' + index;
+        this.context.programs[index] = compiler.compile(child, options, this.context);
+        this.context.environments[index] = child;
+      } else {
+        child.index = index;
+        child.name = 'program' + index;
+      }
+    }
+  },
+  matchExistingProgram: function(child) {
+    for (var i = 0, len = this.context.environments.length; i < len; i++) {
+      var environment = this.context.environments[i];
+      if (environment && environment.equals(child)) {
+        return i;
+      }
+    }
+  },
+
+  programExpression: function(guid) {
+    this.context.aliases.self = "this";
+
+    if(guid == null) {
+      return "self.noop";
+    }
+
+    var child = this.environment.children[guid],
+        depths = child.depths.list, depth;
+
+    var programParams = [child.index, child.name, "data"];
+
+    for(var i=0, l = depths.length; i<l; i++) {
+      depth = depths[i];
+
+      if(depth === 1) { programParams.push("depth0"); }
+      else { programParams.push("depth" + (depth - 1)); }
+    }
+
+    return (depths.length === 0 ? "self.program(" : "self.programWithDepth(") + programParams.join(", ") + ")";
+  },
+
+  register: function(name, val) {
+    this.useRegister(name);
+    this.source.push(name + " = " + val + ";");
+  },
+
+  useRegister: function(name) {
+    if(!this.registers[name]) {
+      this.registers[name] = true;
+      this.registers.list.push(name);
+    }
+  },
+
+  pushStackLiteral: function(item) {
+    return this.push(new Literal(item));
+  },
+
+  pushStack: function(item) {
+    this.flushInline();
+
+    var stack = this.incrStack();
+    if (item) {
+      this.source.push(stack + " = " + item + ";");
+    }
+    this.compileStack.push(stack);
+    return stack;
+  },
+
+  replaceStack: function(callback) {
+    var prefix = '',
+        inline = this.isInline(),
+        stack;
+
+    // If we are currently inline then we want to merge the inline statement into the
+    // replacement statement via ','
+    if (inline) {
+      var top = this.popStack(true);
+
+      if (top instanceof Literal) {
+        // Literals do not need to be inlined
+        stack = top.value;
+      } else {
+        // Get or create the current stack name for use by the inline
+        var name = this.stackSlot ? this.topStackName() : this.incrStack();
+
+        prefix = '(' + this.push(name) + ' = ' + top + '),';
+        stack = this.topStack();
+      }
+    } else {
+      stack = this.topStack();
+    }
+
+    var item = callback.call(this, stack);
+
+    if (inline) {
+      if (this.inlineStack.length || this.compileStack.length) {
+        this.popStack();
+      }
+      this.push('(' + prefix + item + ')');
+    } else {
+      // Prevent modification of the context depth variable. Through replaceStack
+      if (!/^stack/.test(stack)) {
+        stack = this.nextStack();
+      }
+
+      this.source.push(stack + " = (" + prefix + item + ");");
+    }
+    return stack;
+  },
+
+  nextStack: function() {
+    return this.pushStack();
+  },
+
+  incrStack: function() {
+    this.stackSlot++;
+    if(this.stackSlot > this.stackVars.length) { this.stackVars.push("stack" + this.stackSlot); }
+    return this.topStackName();
+  },
+  topStackName: function() {
+    return "stack" + this.stackSlot;
+  },
+  flushInline: function() {
+    var inlineStack = this.inlineStack;
+    if (inlineStack.length) {
+      this.inlineStack = [];
+      for (var i = 0, len = inlineStack.length; i < len; i++) {
+        var entry = inlineStack[i];
+        if (entry instanceof Literal) {
+          this.compileStack.push(entry);
+        } else {
+          this.pushStack(entry);
+        }
+      }
+    }
+  },
+  isInline: function() {
+    return this.inlineStack.length;
+  },
+
+  popStack: function(wrapped) {
+    var inline = this.isInline(),
+        item = (inline ? this.inlineStack : this.compileStack).pop();
+
+    if (!wrapped && (item instanceof Literal)) {
+      return item.value;
+    } else {
+      if (!inline) {
+        this.stackSlot--;
+      }
+      return item;
+    }
+  },
+
+  topStack: function(wrapped) {
+    var stack = (this.isInline() ? this.inlineStack : this.compileStack),
+        item = stack[stack.length - 1];
+
+    if (!wrapped && (item instanceof Literal)) {
+      return item.value;
+    } else {
+      return item;
+    }
+  },
+
+  quotedString: function(str) {
+    return '"' + str
+      .replace(/\\/g, '\\\\')
+      .replace(/"/g, '\\"')
+      .replace(/\n/g, '\\n')
+      .replace(/\r/g, '\\r')
+      .replace(/\u2028/g, '\\u2028')   // Per Ecma-262 7.3 + 7.8.4
+      .replace(/\u2029/g, '\\u2029') + '"';
+  },
+
+  setupHelper: function(paramSize, name, missingParams) {
+    var params = [];
+    this.setupParams(paramSize, params, missingParams);
+    var foundHelper = this.nameLookup('helpers', name, 'helper');
+
+    return {
+      params: params,
+      name: foundHelper,
+      callParams: ["depth0"].concat(params).join(", "),
+      helperMissingParams: missingParams && ["depth0", this.quotedString(name)].concat(params).join(", ")
+    };
+  },
+
+  // the params and contexts arguments are passed in arrays
+  // to fill in
+  setupParams: function(paramSize, params, useRegister) {
+    var options = [], contexts = [], types = [], param, inverse, program;
+
+    options.push("hash:" + this.popStack());
+
+    inverse = this.popStack();
+    program = this.popStack();
+
+    // Avoid setting fn and inverse if neither are set. This allows
+    // helpers to do a check for ` + "`" + `if (options.fn)` + "`" + `
+    if (program || inverse) {
+      if (!program) {
+        this.context.aliases.self = "this";
+        program = "self.noop";
+      }
+
+      if (!inverse) {
+       this.context.aliases.self = "this";
+        inverse = "self.noop";
+      }
+
+      options.push("inverse:" + inverse);
+      options.push("fn:" + program);
+    }
+
+    for(var i=0; i<paramSize; i++) {
+      param = this.popStack();
+      params.push(param);
+
+      if(this.options.stringParams) {
+        types.push(this.popStack());
+        contexts.push(this.popStack());
+      }
+    }
+
+    if (this.options.stringParams) {
+      options.push("contexts:[" + contexts.join(",") + "]");
+      options.push("types:[" + types.join(",") + "]");
+      options.push("hashContexts:hashContexts");
+      options.push("hashTypes:hashTypes");
+    }
+
+    if(this.options.data) {
+      options.push("data:data");
+    }
+
+    options = "{" + options.join(",") + "}";
+    if (useRegister) {
+      this.register('options', options);
+      params.push('options');
+    } else {
+      params.push(options);
+    }
+    return params.join(", ");
+  }
+};
+
+var reservedWords = (
+  "break else new var" +
+  " case finally return void" +
+  " catch for switch while" +
+  " continue function this with" +
+  " default if throw" +
+  " delete in try" +
+  " do instanceof typeof" +
+  " abstract enum int short" +
+  " boolean export interface static" +
+  " byte extends long super" +
+  " char final native synchronized" +
+  " class float package throws" +
+  " const goto private transient" +
+  " debugger implements protected volatile" +
+  " double import public let yield"
+).split(" ");
+
+var compilerWords = JavaScriptCompiler.RESERVED_WORDS = {};
+
+for(var i=0, l=reservedWords.length; i<l; i++) {
+  compilerWords[reservedWords[i]] = true;
+}
+
+JavaScriptCompiler.isValidJavaScriptVariableName = function(name) {
+  if(!JavaScriptCompiler.RESERVED_WORDS[name] && /^[a-zA-Z_$][0-9a-zA-Z_$]+$/.test(name)) {
+    return true;
+  }
+  return false;
+};
+
+Handlebars.precompile = function(input, options) {
+  if (input == null || (typeof input !== 'string' && input.constructor !== Handlebars.AST.ProgramNode)) {
+    throw new Handlebars.Exception("You must pass a string or Handlebars AST to Handlebars.precompile. You passed " + input);
+  }
+
+  options = options || {};
+  if (!('data' in options)) {
+    options.data = true;
+  }
+  var ast = Handlebars.parse(input);
+  var environment = new Compiler().compile(ast, options);
+  return new JavaScriptCompiler().compile(environment, options);
+};
+
+Handlebars.compile = function(input, options) {
+  if (input == null || (typeof input !== 'string' && input.constructor !== Handlebars.AST.ProgramNode)) {
+    throw new Handlebars.Exception("You must pass a string or Handlebars AST to Handlebars.compile. You passed " + input);
+  }
+
+  options = options || {};
+  if (!('data' in options)) {
+    options.data = true;
+  }
+  var compiled;
+  function compile() {
+    var ast = Handlebars.parse(input);
+    var environment = new Compiler().compile(ast, options);
+    var templateSpec = new JavaScriptCompiler().compile(environment, options, undefined, true);
+    return Handlebars.template(templateSpec);
+  }
+
+  // Template is only compiled on first use and cached after that point.
+  return function(context, options) {
+    if (!compiled) {
+      compiled = compile();
+    }
+    return compiled.call(this, context, options);
+  };
+};
+
+;
+// lib/handlebars/runtime.js
+
+Handlebars.VM = {
+  template: function(templateSpec) {
+    // Just add water
+    var container = {
+      escapeExpression: Handlebars.Utils.escapeExpression,
+      invokePartial: Handlebars.VM.invokePartial,
+      programs: [],
+      program: function(i, fn, data) {
+        var programWrapper = this.programs[i];
+        if(data) {
+          programWrapper = Handlebars.VM.program(i, fn, data);
+        } else if (!programWrapper) {
+          programWrapper = this.programs[i] = Handlebars.VM.program(i, fn);
+        }
+        return programWrapper;
+      },
+      merge: function(param, common) {
+        var ret = param || common;
+
+        if (param && common) {
+          ret = {};
+          Handlebars.Utils.extend(ret, common);
+          Handlebars.Utils.extend(ret, param);
+        }
+        return ret;
+      },
+      programWithDepth: Handlebars.VM.programWithDepth,
+      noop: Handlebars.VM.noop,
+      compilerInfo: null
+    };
+
+    return function(context, options) {
+      options = options || {};
+      var result = templateSpec.call(container, Handlebars, context, options.helpers, options.partials, options.data);
+
+      var compilerInfo = container.compilerInfo || [],
+          compilerRevision = compilerInfo[0] || 1,
+          currentRevision = Handlebars.COMPILER_REVISION;
+
+      if (compilerRevision !== currentRevision) {
+        if (compilerRevision < currentRevision) {
+          var runtimeVersions = Handlebars.REVISION_CHANGES[currentRevision],
+              compilerVersions = Handlebars.REVISION_CHANGES[compilerRevision];
+          throw "Template was precompiled with an older version of Handlebars than the current runtime. "+
+                "Please update your precompiler to a newer version ("+runtimeVersions+") or downgrade your runtime to an older version ("+compilerVersions+").";
+        } else {
+          // Use the embedded version info since the runtime doesn't know about this revision yet
+          throw "Template was precompiled with a newer version of Handlebars than the current runtime. "+
+                "Please update your runtime to a newer version ("+compilerInfo[1]+").";
+        }
+      }
+
+      return result;
+    };
+  },
+
+  programWithDepth: function(i, fn, data /*, $depth */) {
+    var args = Array.prototype.slice.call(arguments, 3);
+
+    var program = function(context, options) {
+      options = options || {};
+
+      return fn.apply(this, [context, options.data || data].concat(args));
+    };
+    program.program = i;
+    program.depth = args.length;
+    return program;
+  },
+  program: function(i, fn, data) {
+    var program = function(context, options) {
+      options = options || {};
+
+      return fn(context, options.data || data);
+    };
+    program.program = i;
+    program.depth = 0;
+    return program;
+  },
+  noop: function() { return ""; },
+  invokePartial: function(partial, name, context, helpers, partials, data) {
+    var options = { helpers: helpers, partials: partials, data: data };
+
+    if(partial === undefined) {
+      throw new Handlebars.Exception("The partial " + name + " could not be found");
+    } else if(partial instanceof Function) {
+      return partial(context, options);
+    } else if (!Handlebars.compile) {
+      throw new Handlebars.Exception("The partial " + name + " could not be compiled when running in runtime-only mode");
+    } else {
+      partials[name] = Handlebars.compile(partial, {data: data !== undefined});
+      return partials[name](context, options);
+    }
+  }
+};
+
+Handlebars.template = Handlebars.VM.template;
+;
+// lib/handlebars/browser-suffix.js
+})(Handlebars);
+;
+`)
+
+func third_partySwaggerUiLibHandlebars100JsBytes() ([]byte, error) {
+	return _third_partySwaggerUiLibHandlebars100Js, nil
+}
+
+func third_partySwaggerUiLibHandlebars100Js() (*asset, error) {
+	bytes, err := third_partySwaggerUiLibHandlebars100JsBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/lib/handlebars-1.0.0.js", size: 72766, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiLibHandlebars200Js = []byte(`/*!
+
+ handlebars v2.0.0
+
+Copyright (C) 2011-2014 by Yehuda Katz
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+@license
+*/
+!function(a,b){"function"==typeof define&&define.amd?define([],b):"object"==typeof exports?module.exports=b():a.Handlebars=a.Handlebars||b()}(this,function(){var a=function(){"use strict";function a(a){this.string=a}var b;return a.prototype.toString=function(){return""+this.string},b=a}(),b=function(a){"use strict";function b(a){return i[a]}function c(a){for(var b=1;b<arguments.length;b++)for(var c in arguments[b])Object.prototype.hasOwnProperty.call(arguments[b],c)&&(a[c]=arguments[b][c]);return a}function d(a){return a instanceof h?a.toString():null==a?"":a?(a=""+a,k.test(a)?a.replace(j,b):a):a+""}function e(a){return a||0===a?n(a)&&0===a.length?!0:!1:!0}function f(a,b){return(a?a+".":"")+b}var g={},h=a,i={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","` + "`" + `":"&#x60;"},j=/[&<>"'` + "`" + `]/g,k=/[&<>"'` + "`" + `]/;g.extend=c;var l=Object.prototype.toString;g.toString=l;var m=function(a){return"function"==typeof a};m(/x/)&&(m=function(a){return"function"==typeof a&&"[object Function]"===l.call(a)});var m;g.isFunction=m;var n=Array.isArray||function(a){return a&&"object"==typeof a?"[object Array]"===l.call(a):!1};return g.isArray=n,g.escapeExpression=d,g.isEmpty=e,g.appendContextPath=f,g}(a),c=function(){"use strict";function a(a,b){var d;b&&b.firstLine&&(d=b.firstLine,a+=" - "+d+":"+b.firstColumn);for(var e=Error.prototype.constructor.call(this,a),f=0;f<c.length;f++)this[c[f]]=e[c[f]];d&&(this.lineNumber=d,this.column=b.firstColumn)}var b,c=["description","fileName","lineNumber","message","name","number","stack"];return a.prototype=new Error,b=a}(),d=function(a,b){"use strict";function c(a,b){this.helpers=a||{},this.partials=b||{},d(this)}function d(a){a.registerHelper("helperMissing",function(){if(1===arguments.length)return void 0;throw new g("Missing helper: '"+arguments[arguments.length-1].name+"'")}),a.registerHelper("blockHelperMissing",function(b,c){var d=c.inverse,e=c.fn;if(b===!0)return e(this);if(b===!1||null==b)return d(this);if(k(b))return b.length>0?(c.ids&&(c.ids=[c.name]),a.helpers.each(b,c)):d(this);if(c.data&&c.ids){var g=q(c.data);g.contextPath=f.appendContextPath(c.data.contextPath,c.name),c={data:g}}return e(b,c)}),a.registerHelper("each",function(a,b){if(!b)throw new g("Must pass iterator to #each");var c,d,e=b.fn,h=b.inverse,i=0,j="";if(b.data&&b.ids&&(d=f.appendContextPath(b.data.contextPath,b.ids[0])+"."),l(a)&&(a=a.call(this)),b.data&&(c=q(b.data)),a&&"object"==typeof a)if(k(a))for(var m=a.length;m>i;i++)c&&(c.index=i,c.first=0===i,c.last=i===a.length-1,d&&(c.contextPath=d+i)),j+=e(a[i],{data:c});else for(var n in a)a.hasOwnProperty(n)&&(c&&(c.key=n,c.index=i,c.first=0===i,d&&(c.contextPath=d+n)),j+=e(a[n],{data:c}),i++);return 0===i&&(j=h(this)),j}),a.registerHelper("if",function(a,b){return l(a)&&(a=a.call(this)),!b.hash.includeZero&&!a||f.isEmpty(a)?b.inverse(this):b.fn(this)}),a.registerHelper("unless",function(b,c){return a.helpers["if"].call(this,b,{fn:c.inverse,inverse:c.fn,hash:c.hash})}),a.registerHelper("with",function(a,b){l(a)&&(a=a.call(this));var c=b.fn;if(f.isEmpty(a))return b.inverse(this);if(b.data&&b.ids){var d=q(b.data);d.contextPath=f.appendContextPath(b.data.contextPath,b.ids[0]),b={data:d}}return c(a,b)}),a.registerHelper("log",function(b,c){var d=c.data&&null!=c.data.level?parseInt(c.data.level,10):1;a.log(d,b)}),a.registerHelper("lookup",function(a,b){return a&&a[b]})}var e={},f=a,g=b,h="2.0.0";e.VERSION=h;var i=6;e.COMPILER_REVISION=i;var j={1:"<= 1.0.rc.2",2:"== 1.0.0-rc.3",3:"== 1.0.0-rc.4",4:"== 1.x.x",5:"== 2.0.0-alpha.x",6:">= 2.0.0-beta.1"};e.REVISION_CHANGES=j;var k=f.isArray,l=f.isFunction,m=f.toString,n="[object Object]";e.HandlebarsEnvironment=c,c.prototype={constructor:c,logger:o,log:p,registerHelper:function(a,b){if(m.call(a)===n){if(b)throw new g("Arg not supported with multiple helpers");f.extend(this.helpers,a)}else this.helpers[a]=b},unregisterHelper:function(a){delete this.helpers[a]},registerPartial:function(a,b){m.call(a)===n?f.extend(this.partials,a):this.partials[a]=b},unregisterPartial:function(a){delete this.partials[a]}};var o={methodMap:{0:"debug",1:"info",2:"warn",3:"error"},DEBUG:0,INFO:1,WARN:2,ERROR:3,level:3,log:function(a,b){if(o.level<=a){var c=o.methodMap[a];"undefined"!=typeof console&&console[c]&&console[c].call(console,b)}}};e.logger=o;var p=o.log;e.log=p;var q=function(a){var b=f.extend({},a);return b._parent=a,b};return e.createFrame=q,e}(b,c),e=function(a,b,c){"use strict";function d(a){var b=a&&a[0]||1,c=m;if(b!==c){if(c>b){var d=n[c],e=n[b];throw new l("Template was precompiled with an older version of Handlebars than the current runtime. Please update your precompiler to a newer version ("+d+") or downgrade your runtime to an older version ("+e+").")}throw new l("Template was precompiled with a newer version of Handlebars than the current runtime. Please update your runtime to a newer version ("+a[1]+").")}}function e(a,b){if(!b)throw new l("No environment passed to template");if(!a||!a.main)throw new l("Unknown template object: "+typeof a);b.VM.checkRevision(a.compiler);var c=function(c,d,e,f,g,h,i,j,m){g&&(f=k.extend({},f,g));var n=b.VM.invokePartial.call(this,c,e,f,h,i,j,m);if(null==n&&b.compile){var o={helpers:h,partials:i,data:j,depths:m};i[e]=b.compile(c,{data:void 0!==j,compat:a.compat},b),n=i[e](f,o)}if(null!=n){if(d){for(var p=n.split("\n"),q=0,r=p.length;r>q&&(p[q]||q+1!==r);q++)p[q]=d+p[q];n=p.join("\n")}return n}throw new l("The partial "+e+" could not be compiled when running in runtime-only mode")},d={lookup:function(a,b){for(var c=a.length,d=0;c>d;d++)if(a[d]&&null!=a[d][b])return a[d][b]},lambda:function(a,b){return"function"==typeof a?a.call(b):a},escapeExpression:k.escapeExpression,invokePartial:c,fn:function(b){return a[b]},programs:[],program:function(a,b,c){var d=this.programs[a],e=this.fn(a);return b||c?d=f(this,a,e,b,c):d||(d=this.programs[a]=f(this,a,e)),d},data:function(a,b){for(;a&&b--;)a=a._parent;return a},merge:function(a,b){var c=a||b;return a&&b&&a!==b&&(c=k.extend({},b,a)),c},noop:b.VM.noop,compilerInfo:a.compiler},e=function(b,c){c=c||{};var f=c.data;e._setup(c),!c.partial&&a.useData&&(f=i(b,f));var g;return a.useDepths&&(g=c.depths?[b].concat(c.depths):[b]),a.main.call(d,b,d.helpers,d.partials,f,g)};return e.isTop=!0,e._setup=function(c){c.partial?(d.helpers=c.helpers,d.partials=c.partials):(d.helpers=d.merge(c.helpers,b.helpers),a.usePartial&&(d.partials=d.merge(c.partials,b.partials)))},e._child=function(b,c,e){if(a.useDepths&&!e)throw new l("must pass parent depths");return f(d,b,a[b],c,e)},e}function f(a,b,c,d,e){var f=function(b,f){return f=f||{},c.call(a,b,a.helpers,a.partials,f.data||d,e&&[b].concat(e))};return f.program=b,f.depth=e?e.length:0,f}function g(a,b,c,d,e,f,g){var h={partial:!0,helpers:d,partials:e,data:f,depths:g};if(void 0===a)throw new l("The partial "+b+" could not be found");return a instanceof Function?a(c,h):void 0}function h(){return""}function i(a,b){return b&&"root"in b||(b=b?o(b):{},b.root=a),b}var j={},k=a,l=b,m=c.COMPILER_REVISION,n=c.REVISION_CHANGES,o=c.createFrame;return j.checkRevision=d,j.template=e,j.program=f,j.invokePartial=g,j.noop=h,j}(b,c,d),f=function(a,b,c,d,e){"use strict";var f,g=a,h=b,i=c,j=d,k=e,l=function(){var a=new g.HandlebarsEnvironment;return j.extend(a,g),a.SafeString=h,a.Exception=i,a.Utils=j,a.escapeExpression=j.escapeExpression,a.VM=k,a.template=function(b){return k.template(b,a)},a},m=l();return m.create=l,m["default"]=m,f=m}(d,a,c,b,e),g=function(a){"use strict";function b(a){a=a||{},this.firstLine=a.first_line,this.firstColumn=a.first_column,this.lastColumn=a.last_column,this.lastLine=a.last_line}var c,d=a,e={ProgramNode:function(a,c,d){b.call(this,d),this.type="program",this.statements=a,this.strip=c},MustacheNode:function(a,c,d,f,g){if(b.call(this,g),this.type="mustache",this.strip=f,null!=d&&d.charAt){var h=d.charAt(3)||d.charAt(2);this.escaped="{"!==h&&"&"!==h}else this.escaped=!!d;this.sexpr=a instanceof e.SexprNode?a:new e.SexprNode(a,c),this.id=this.sexpr.id,this.params=this.sexpr.params,this.hash=this.sexpr.hash,this.eligibleHelper=this.sexpr.eligibleHelper,this.isHelper=this.sexpr.isHelper},SexprNode:function(a,c,d){b.call(this,d),this.type="sexpr",this.hash=c;var e=this.id=a[0],f=this.params=a.slice(1);this.isHelper=!(!f.length&&!c),this.eligibleHelper=this.isHelper||e.isSimple},PartialNode:function(a,c,d,e,f){b.call(this,f),this.type="partial",this.partialName=a,this.context=c,this.hash=d,this.strip=e,this.strip.inlineStandalone=!0},BlockNode:function(a,c,d,e,f){b.call(this,f),this.type="block",this.mustache=a,this.program=c,this.inverse=d,this.strip=e,d&&!c&&(this.isInverse=!0)},RawBlockNode:function(a,c,f,g){if(b.call(this,g),a.sexpr.id.original!==f)throw new d(a.sexpr.id.original+" doesn't match "+f,this);c=new e.ContentNode(c,g),this.type="block",this.mustache=a,this.program=new e.ProgramNode([c],{},g)},ContentNode:function(a,c){b.call(this,c),this.type="content",this.original=this.string=a},HashNode:function(a,c){b.call(this,c),this.type="hash",this.pairs=a},IdNode:function(a,c){b.call(this,c),this.type="ID";for(var e="",f=[],g=0,h="",i=0,j=a.length;j>i;i++){var k=a[i].part;if(e+=(a[i].separator||"")+k,".."===k||"."===k||"this"===k){if(f.length>0)throw new d("Invalid path: "+e,this);".."===k?(g++,h+="../"):this.isScoped=!0}else f.push(k)}this.original=e,this.parts=f,this.string=f.join("."),this.depth=g,this.idName=h+this.string,this.isSimple=1===a.length&&!this.isScoped&&0===g,this.stringModeValue=this.string},PartialNameNode:function(a,c){b.call(this,c),this.type="PARTIAL_NAME",this.name=a.original},DataNode:function(a,c){b.call(this,c),this.type="DATA",this.id=a,this.stringModeValue=a.stringModeValue,this.idName="@"+a.stringModeValue},StringNode:function(a,c){b.call(this,c),this.type="STRING",this.original=this.string=this.stringModeValue=a},NumberNode:function(a,c){b.call(this,c),this.type="NUMBER",this.original=this.number=a,this.stringModeValue=Number(a)},BooleanNode:function(a,c){b.call(this,c),this.type="BOOLEAN",this.bool=a,this.stringModeValue="true"===a},CommentNode:function(a,c){b.call(this,c),this.type="comment",this.comment=a,this.strip={inlineStandalone:!0}}};return c=e}(c),h=function(){"use strict";var a,b=function(){function a(){this.yy={}}var b={trace:function(){},yy:{},symbols_:{error:2,root:3,program:4,EOF:5,program_repetition0:6,statement:7,mustache:8,block:9,rawBlock:10,partial:11,CONTENT:12,COMMENT:13,openRawBlock:14,END_RAW_BLOCK:15,OPEN_RAW_BLOCK:16,sexpr:17,CLOSE_RAW_BLOCK:18,openBlock:19,block_option0:20,closeBlock:21,openInverse:22,block_option1:23,OPEN_BLOCK:24,CLOSE:25,OPEN_INVERSE:26,inverseAndProgram:27,INVERSE:28,OPEN_ENDBLOCK:29,path:30,OPEN:31,OPEN_UNESCAPED:32,CLOSE_UNESCAPED:33,OPEN_PARTIAL:34,partialName:35,param:36,partial_option0:37,partial_option1:38,sexpr_repetition0:39,sexpr_option0:40,dataName:41,STRING:42,NUMBER:43,BOOLEAN:44,OPEN_SEXPR:45,CLOSE_SEXPR:46,hash:47,hash_repetition_plus0:48,hashSegment:49,ID:50,EQUALS:51,DATA:52,pathSegments:53,SEP:54,$accept:0,$end:1},terminals_:{2:"error",5:"EOF",12:"CONTENT",13:"COMMENT",15:"END_RAW_BLOCK",16:"OPEN_RAW_BLOCK",18:"CLOSE_RAW_BLOCK",24:"OPEN_BLOCK",25:"CLOSE",26:"OPEN_INVERSE",28:"INVERSE",29:"OPEN_ENDBLOCK",31:"OPEN",32:"OPEN_UNESCAPED",33:"CLOSE_UNESCAPED",34:"OPEN_PARTIAL",42:"STRING",43:"NUMBER",44:"BOOLEAN",45:"OPEN_SEXPR",46:"CLOSE_SEXPR",50:"ID",51:"EQUALS",52:"DATA",54:"SEP"},productions_:[0,[3,2],[4,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[10,3],[14,3],[9,4],[9,4],[19,3],[22,3],[27,2],[21,3],[8,3],[8,3],[11,5],[11,4],[17,3],[17,1],[36,1],[36,1],[36,1],[36,1],[36,1],[36,3],[47,1],[49,3],[35,1],[35,1],[35,1],[41,2],[30,1],[53,3],[53,1],[6,0],[6,2],[20,0],[20,1],[23,0],[23,1],[37,0],[37,1],[38,0],[38,1],[39,0],[39,2],[40,0],[40,1],[48,1],[48,2]],performAction:function(a,b,c,d,e,f){var g=f.length-1;switch(e){case 1:return d.prepareProgram(f[g-1].statements,!0),f[g-1];case 2:this.$=new d.ProgramNode(d.prepareProgram(f[g]),{},this._$);break;case 3:this.$=f[g];break;case 4:this.$=f[g];break;case 5:this.$=f[g];break;case 6:this.$=f[g];break;case 7:this.$=new d.ContentNode(f[g],this._$);break;case 8:this.$=new d.CommentNode(f[g],this._$);break;case 9:this.$=new d.RawBlockNode(f[g-2],f[g-1],f[g],this._$);break;case 10:this.$=new d.MustacheNode(f[g-1],null,"","",this._$);break;case 11:this.$=d.prepareBlock(f[g-3],f[g-2],f[g-1],f[g],!1,this._$);break;case 12:this.$=d.prepareBlock(f[g-3],f[g-2],f[g-1],f[g],!0,this._$);break;case 13:this.$=new d.MustacheNode(f[g-1],null,f[g-2],d.stripFlags(f[g-2],f[g]),this._$);break;case 14:this.$=new d.MustacheNode(f[g-1],null,f[g-2],d.stripFlags(f[g-2],f[g]),this._$);break;case 15:this.$={strip:d.stripFlags(f[g-1],f[g-1]),program:f[g]};break;case 16:this.$={path:f[g-1],strip:d.stripFlags(f[g-2],f[g])};break;case 17:this.$=new d.MustacheNode(f[g-1],null,f[g-2],d.stripFlags(f[g-2],f[g]),this._$);break;case 18:this.$=new d.MustacheNode(f[g-1],null,f[g-2],d.stripFlags(f[g-2],f[g]),this._$);break;case 19:this.$=new d.PartialNode(f[g-3],f[g-2],f[g-1],d.stripFlags(f[g-4],f[g]),this._$);break;case 20:this.$=new d.PartialNode(f[g-2],void 0,f[g-1],d.stripFlags(f[g-3],f[g]),this._$);break;case 21:this.$=new d.SexprNode([f[g-2]].concat(f[g-1]),f[g],this._$);break;case 22:this.$=new d.SexprNode([f[g]],null,this._$);break;case 23:this.$=f[g];break;case 24:this.$=new d.StringNode(f[g],this._$);break;case 25:this.$=new d.NumberNode(f[g],this._$);break;case 26:this.$=new d.BooleanNode(f[g],this._$);break;case 27:this.$=f[g];break;case 28:f[g-1].isHelper=!0,this.$=f[g-1];break;case 29:this.$=new d.HashNode(f[g],this._$);break;case 30:this.$=[f[g-2],f[g]];break;case 31:this.$=new d.PartialNameNode(f[g],this._$);break;case 32:this.$=new d.PartialNameNode(new d.StringNode(f[g],this._$),this._$);break;case 33:this.$=new d.PartialNameNode(new d.NumberNode(f[g],this._$));break;case 34:this.$=new d.DataNode(f[g],this._$);break;case 35:this.$=new d.IdNode(f[g],this._$);break;case 36:f[g-2].push({part:f[g],separator:f[g-1]}),this.$=f[g-2];break;case 37:this.$=[{part:f[g]}];break;case 38:this.$=[];break;case 39:f[g-1].push(f[g]);break;case 48:this.$=[];break;case 49:f[g-1].push(f[g]);break;case 52:this.$=[f[g]];break;case 53:f[g-1].push(f[g])}},table:[{3:1,4:2,5:[2,38],6:3,12:[2,38],13:[2,38],16:[2,38],24:[2,38],26:[2,38],31:[2,38],32:[2,38],34:[2,38]},{1:[3]},{5:[1,4]},{5:[2,2],7:5,8:6,9:7,10:8,11:9,12:[1,10],13:[1,11],14:16,16:[1,20],19:14,22:15,24:[1,18],26:[1,19],28:[2,2],29:[2,2],31:[1,12],32:[1,13],34:[1,17]},{1:[2,1]},{5:[2,39],12:[2,39],13:[2,39],16:[2,39],24:[2,39],26:[2,39],28:[2,39],29:[2,39],31:[2,39],32:[2,39],34:[2,39]},{5:[2,3],12:[2,3],13:[2,3],16:[2,3],24:[2,3],26:[2,3],28:[2,3],29:[2,3],31:[2,3],32:[2,3],34:[2,3]},{5:[2,4],12:[2,4],13:[2,4],16:[2,4],24:[2,4],26:[2,4],28:[2,4],29:[2,4],31:[2,4],32:[2,4],34:[2,4]},{5:[2,5],12:[2,5],13:[2,5],16:[2,5],24:[2,5],26:[2,5],28:[2,5],29:[2,5],31:[2,5],32:[2,5],34:[2,5]},{5:[2,6],12:[2,6],13:[2,6],16:[2,6],24:[2,6],26:[2,6],28:[2,6],29:[2,6],31:[2,6],32:[2,6],34:[2,6]},{5:[2,7],12:[2,7],13:[2,7],16:[2,7],24:[2,7],26:[2,7],28:[2,7],29:[2,7],31:[2,7],32:[2,7],34:[2,7]},{5:[2,8],12:[2,8],13:[2,8],16:[2,8],24:[2,8],26:[2,8],28:[2,8],29:[2,8],31:[2,8],32:[2,8],34:[2,8]},{17:21,30:22,41:23,50:[1,26],52:[1,25],53:24},{17:27,30:22,41:23,50:[1,26],52:[1,25],53:24},{4:28,6:3,12:[2,38],13:[2,38],16:[2,38],24:[2,38],26:[2,38],28:[2,38],29:[2,38],31:[2,38],32:[2,38],34:[2,38]},{4:29,6:3,12:[2,38],13:[2,38],16:[2,38],24:[2,38],26:[2,38],28:[2,38],29:[2,38],31:[2,38],32:[2,38],34:[2,38]},{12:[1,30]},{30:32,35:31,42:[1,33],43:[1,34],50:[1,26],53:24},{17:35,30:22,41:23,50:[1,26],52:[1,25],53:24},{17:36,30:22,41:23,50:[1,26],52:[1,25],53:24},{17:37,30:22,41:23,50:[1,26],52:[1,25],53:24},{25:[1,38]},{18:[2,48],25:[2,48],33:[2,48],39:39,42:[2,48],43:[2,48],44:[2,48],45:[2,48],46:[2,48],50:[2,48],52:[2,48]},{18:[2,22],25:[2,22],33:[2,22],46:[2,22]},{18:[2,35],25:[2,35],33:[2,35],42:[2,35],43:[2,35],44:[2,35],45:[2,35],46:[2,35],50:[2,35],52:[2,35],54:[1,40]},{30:41,50:[1,26],53:24},{18:[2,37],25:[2,37],33:[2,37],42:[2,37],43:[2,37],44:[2,37],45:[2,37],46:[2,37],50:[2,37],52:[2,37],54:[2,37]},{33:[1,42]},{20:43,27:44,28:[1,45],29:[2,40]},{23:46,27:47,28:[1,45],29:[2,42]},{15:[1,48]},{25:[2,46],30:51,36:49,38:50,41:55,42:[1,52],43:[1,53],44:[1,54],45:[1,56],47:57,48:58,49:60,50:[1,59],52:[1,25],53:24},{25:[2,31],42:[2,31],43:[2,31],44:[2,31],45:[2,31],50:[2,31],52:[2,31]},{25:[2,32],42:[2,32],43:[2,32],44:[2,32],45:[2,32],50:[2,32],52:[2,32]},{25:[2,33],42:[2,33],43:[2,33],44:[2,33],45:[2,33],50:[2,33],52:[2,33]},{25:[1,61]},{25:[1,62]},{18:[1,63]},{5:[2,17],12:[2,17],13:[2,17],16:[2,17],24:[2,17],26:[2,17],28:[2,17],29:[2,17],31:[2,17],32:[2,17],34:[2,17]},{18:[2,50],25:[2,50],30:51,33:[2,50],36:65,40:64,41:55,42:[1,52],43:[1,53],44:[1,54],45:[1,56],46:[2,50],47:66,48:58,49:60,50:[1,59],52:[1,25],53:24},{50:[1,67]},{18:[2,34],25:[2,34],33:[2,34],42:[2,34],43:[2,34],44:[2,34],45:[2,34],46:[2,34],50:[2,34],52:[2,34]},{5:[2,18],12:[2,18],13:[2,18],16:[2,18],24:[2,18],26:[2,18],28:[2,18],29:[2,18],31:[2,18],32:[2,18],34:[2,18]},{21:68,29:[1,69]},{29:[2,41]},{4:70,6:3,12:[2,38],13:[2,38],16:[2,38],24:[2,38],26:[2,38],29:[2,38],31:[2,38],32:[2,38],34:[2,38]},{21:71,29:[1,69]},{29:[2,43]},{5:[2,9],12:[2,9],13:[2,9],16:[2,9],24:[2,9],26:[2,9],28:[2,9],29:[2,9],31:[2,9],32:[2,9],34:[2,9]},{25:[2,44],37:72,47:73,48:58,49:60,50:[1,74]},{25:[1,75]},{18:[2,23],25:[2,23],33:[2,23],42:[2,23],43:[2,23],44:[2,23],45:[2,23],46:[2,23],50:[2,23],52:[2,23]},{18:[2,24],25:[2,24],33:[2,24],42:[2,24],43:[2,24],44:[2,24],45:[2,24],46:[2,24],50:[2,24],52:[2,24]},{18:[2,25],25:[2,25],33:[2,25],42:[2,25],43:[2,25],44:[2,25],45:[2,25],46:[2,25],50:[2,25],52:[2,25]},{18:[2,26],25:[2,26],33:[2,26],42:[2,26],43:[2,26],44:[2,26],45:[2,26],46:[2,26],50:[2,26],52:[2,26]},{18:[2,27],25:[2,27],33:[2,27],42:[2,27],43:[2,27],44:[2,27],45:[2,27],46:[2,27],50:[2,27],52:[2,27]},{17:76,30:22,41:23,50:[1,26],52:[1,25],53:24},{25:[2,47]},{18:[2,29],25:[2,29],33:[2,29],46:[2,29],49:77,50:[1,74]},{18:[2,37],25:[2,37],33:[2,37],42:[2,37],43:[2,37],44:[2,37],45:[2,37],46:[2,37],50:[2,37],51:[1,78],52:[2,37],54:[2,37]},{18:[2,52],25:[2,52],33:[2,52],46:[2,52],50:[2,52]},{12:[2,13],13:[2,13],16:[2,13],24:[2,13],26:[2,13],28:[2,13],29:[2,13],31:[2,13],32:[2,13],34:[2,13]},{12:[2,14],13:[2,14],16:[2,14],24:[2,14],26:[2,14],28:[2,14],29:[2,14],31:[2,14],32:[2,14],34:[2,14]},{12:[2,10]},{18:[2,21],25:[2,21],33:[2,21],46:[2,21]},{18:[2,49],25:[2,49],33:[2,49],42:[2,49],43:[2,49],44:[2,49],45:[2,49],46:[2,49],50:[2,49],52:[2,49]},{18:[2,51],25:[2,51],33:[2,51],46:[2,51]},{18:[2,36],25:[2,36],33:[2,36],42:[2,36],43:[2,36],44:[2,36],45:[2,36],46:[2,36],50:[2,36],52:[2,36],54:[2,36]},{5:[2,11],12:[2,11],13:[2,11],16:[2,11],24:[2,11],26:[2,11],28:[2,11],29:[2,11],31:[2,11],32:[2,11],34:[2,11]},{30:79,50:[1,26],53:24},{29:[2,15]},{5:[2,12],12:[2,12],13:[2,12],16:[2,12],24:[2,12],26:[2,12],28:[2,12],29:[2,12],31:[2,12],32:[2,12],34:[2,12]},{25:[1,80]},{25:[2,45]},{51:[1,78]},{5:[2,20],12:[2,20],13:[2,20],16:[2,20],24:[2,20],26:[2,20],28:[2,20],29:[2,20],31:[2,20],32:[2,20],34:[2,20]},{46:[1,81]},{18:[2,53],25:[2,53],33:[2,53],46:[2,53],50:[2,53]},{30:51,36:82,41:55,42:[1,52],43:[1,53],44:[1,54],45:[1,56],50:[1,26],52:[1,25],53:24},{25:[1,83]},{5:[2,19],12:[2,19],13:[2,19],16:[2,19],24:[2,19],26:[2,19],28:[2,19],29:[2,19],31:[2,19],32:[2,19],34:[2,19]},{18:[2,28],25:[2,28],33:[2,28],42:[2,28],43:[2,28],44:[2,28],45:[2,28],46:[2,28],50:[2,28],52:[2,28]},{18:[2,30],25:[2,30],33:[2,30],46:[2,30],50:[2,30]},{5:[2,16],12:[2,16],13:[2,16],16:[2,16],24:[2,16],26:[2,16],28:[2,16],29:[2,16],31:[2,16],32:[2,16],34:[2,16]}],defaultActions:{4:[2,1],44:[2,41],47:[2,43],57:[2,47],63:[2,10],70:[2,15],73:[2,45]},parseError:function(a){throw new Error(a)},parse:function(a){function b(){var a;return a=c.lexer.lex()||1,"number"!=typeof a&&(a=c.symbols_[a]||a),a}var c=this,d=[0],e=[null],f=[],g=this.table,h="",i=0,j=0,k=0;this.lexer.setInput(a),this.lexer.yy=this.yy,this.yy.lexer=this.lexer,this.yy.parser=this,"undefined"==typeof this.lexer.yylloc&&(this.lexer.yylloc={});var l=this.lexer.yylloc;f.push(l);var m=this.lexer.options&&this.lexer.options.ranges;"function"==typeof this.yy.parseError&&(this.parseError=this.yy.parseError);for(var n,o,p,q,r,s,t,u,v,w={};;){if(p=d[d.length-1],this.defaultActions[p]?q=this.defaultActions[p]:((null===n||"undefined"==typeof n)&&(n=b()),q=g[p]&&g[p][n]),"undefined"==typeof q||!q.length||!q[0]){var x="";if(!k){v=[];for(s in g[p])this.terminals_[s]&&s>2&&v.push("'"+this.terminals_[s]+"'");x=this.lexer.showPosition?"Parse error on line "+(i+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+v.join(", ")+", got '"+(this.terminals_[n]||n)+"'":"Parse error on line "+(i+1)+": Unexpected "+(1==n?"end of input":"'"+(this.terminals_[n]||n)+"'"),this.parseError(x,{text:this.lexer.match,token:this.terminals_[n]||n,line:this.lexer.yylineno,loc:l,expected:v})}}if(q[0]instanceof Array&&q.length>1)throw new Error("Parse Error: multiple actions possible at state: "+p+", token: "+n);switch(q[0]){case 1:d.push(n),e.push(this.lexer.yytext),f.push(this.lexer.yylloc),d.push(q[1]),n=null,o?(n=o,o=null):(j=this.lexer.yyleng,h=this.lexer.yytext,i=this.lexer.yylineno,l=this.lexer.yylloc,k>0&&k--);break;case 2:if(t=this.productions_[q[1]][1],w.$=e[e.length-t],w._$={first_line:f[f.length-(t||1)].first_line,last_line:f[f.length-1].last_line,first_column:f[f.length-(t||1)].first_column,last_column:f[f.length-1].last_column},m&&(w._$.range=[f[f.length-(t||1)].range[0],f[f.length-1].range[1]]),r=this.performAction.call(w,h,j,i,this.yy,q[1],e,f),"undefined"!=typeof r)return r;t&&(d=d.slice(0,-1*t*2),e=e.slice(0,-1*t),f=f.slice(0,-1*t)),d.push(this.productions_[q[1]][0]),e.push(w.$),f.push(w._$),u=g[d[d.length-2]][d[d.length-1]],d.push(u);break;case 3:return!0}}return!0}},c=function(){var a={EOF:1,parseError:function(a,b){if(!this.yy.parser)throw new Error(a);this.yy.parser.parseError(a,b)},setInput:function(a){return this._input=a,this._more=this._less=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var a=this._input[0];this.yytext+=a,this.yyleng++,this.offset++,this.match+=a,this.matched+=a;var b=a.match(/(?:\r\n?|\n).*/g);return b?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),a},unput:function(a){var b=a.length,c=a.split(/(?:\r\n?|\n)/g);this._input=a+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-b-1),this.offset-=b;var d=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),c.length-1&&(this.yylineno-=c.length-1);var e=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:c?(c.length===d.length?this.yylloc.first_column:0)+d[d.length-c.length].length-c[0].length:this.yylloc.first_column-b},this.options.ranges&&(this.yylloc.range=[e[0],e[0]+this.yyleng-b]),this},more:function(){return this._more=!0,this},less:function(a){this.unput(this.match.slice(a))},pastInput:function(){var a=this.matched.substr(0,this.matched.length-this.match.length);return(a.length>20?"...":"")+a.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var a=this.match;return a.length<20&&(a+=this._input.substr(0,20-a.length)),(a.substr(0,20)+(a.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var a=this.pastInput(),b=new Array(a.length+1).join("-");return a+this.upcomingInput()+"\n"+b+"^"},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var a,b,c,d,e;this._more||(this.yytext="",this.match="");for(var f=this._currentRules(),g=0;g<f.length&&(c=this._input.match(this.rules[f[g]]),!c||b&&!(c[0].length>b[0].length)||(b=c,d=g,this.options.flex));g++);return b?(e=b[0].match(/(?:\r\n?|\n).*/g),e&&(this.yylineno+=e.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:e?e[e.length-1].length-e[e.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+b[0].length},this.yytext+=b[0],this.match+=b[0],this.matches=b,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._input=this._input.slice(b[0].length),this.matched+=b[0],a=this.performAction.call(this,this.yy,this,f[d],this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),a?a:void 0):""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var a=this.next();return"undefined"!=typeof a?a:this.lex()},begin:function(a){this.conditionStack.push(a)},popState:function(){return this.conditionStack.pop()},_currentRules:function(){return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules},topState:function(){return this.conditionStack[this.conditionStack.length-2]},pushState:function(a){this.begin(a)}};return a.options={},a.performAction=function(a,b,c,d){function e(a,c){return b.yytext=b.yytext.substr(a,b.yyleng-c)}switch(c){case 0:if("\\\\"===b.yytext.slice(-2)?(e(0,1),this.begin("mu")):"\\"===b.yytext.slice(-1)?(e(0,1),this.begin("emu")):this.begin("mu"),b.yytext)return 12;break;case 1:return 12;case 2:return this.popState(),12;case 3:return b.yytext=b.yytext.substr(5,b.yyleng-9),this.popState(),15;case 4:return 12;case 5:return e(0,4),this.popState(),13;case 6:return 45;case 7:return 46;case 8:return 16;case 9:return this.popState(),this.begin("raw"),18;case 10:return 34;case 11:return 24;case 12:return 29;case 13:return this.popState(),28;case 14:return this.popState(),28;case 15:return 26;case 16:return 26;case 17:return 32;case 18:return 31;case 19:this.popState(),this.begin("com");break;case 20:return e(3,5),this.popState(),13;case 21:return 31;case 22:return 51;case 23:return 50;case 24:return 50;case 25:return 54;case 26:break;case 27:return this.popState(),33;case 28:return this.popState(),25;case 29:return b.yytext=e(1,2).replace(/\\"/g,'"'),42;case 30:return b.yytext=e(1,2).replace(/\\'/g,"'"),42;case 31:return 52;case 32:return 44;case 33:return 44;case 34:return 43;case 35:return 50;case 36:return b.yytext=e(1,2),50;case 37:return"INVALID";case 38:return 5}},a.rules=[/^(?:[^\x00]*?(?=(\{\{)))/,/^(?:[^\x00]+)/,/^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/,/^(?:\{\{\{\{\/[^\s!"#%-,\.\/;->@\[-\^` + "`" + `\{-~]+(?=[=}\s\/.])\}\}\}\})/,/^(?:[^\x00]*?(?=(\{\{\{\{\/)))/,/^(?:[\s\S]*?--\}\})/,/^(?:\()/,/^(?:\))/,/^(?:\{\{\{\{)/,/^(?:\}\}\}\})/,/^(?:\{\{(~)?>)/,/^(?:\{\{(~)?#)/,/^(?:\{\{(~)?\/)/,/^(?:\{\{(~)?\^\s*(~)?\}\})/,/^(?:\{\{(~)?\s*else\s*(~)?\}\})/,/^(?:\{\{(~)?\^)/,/^(?:\{\{(~)?\s*else\b)/,/^(?:\{\{(~)?\{)/,/^(?:\{\{(~)?&)/,/^(?:\{\{!--)/,/^(?:\{\{![\s\S]*?\}\})/,/^(?:\{\{(~)?)/,/^(?:=)/,/^(?:\.\.)/,/^(?:\.(?=([=~}\s\/.)])))/,/^(?:[\/.])/,/^(?:\s+)/,/^(?:\}(~)?\}\})/,/^(?:(~)?\}\})/,/^(?:"(\\["]|[^"])*")/,/^(?:'(\\[']|[^'])*')/,/^(?:@)/,/^(?:true(?=([~}\s)])))/,/^(?:false(?=([~}\s)])))/,/^(?:-?[0-9]+(?:\.[0-9]+)?(?=([~}\s)])))/,/^(?:([^\s!"#%-,\.\/;->@\[-\^` + "`" + `\{-~]+(?=([=~}\s\/.)]))))/,/^(?:\[[^\]]*\])/,/^(?:.)/,/^(?:$)/],a.conditions={mu:{rules:[6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],inclusive:!1},emu:{rules:[2],inclusive:!1},com:{rules:[5],inclusive:!1},raw:{rules:[3,4],inclusive:!1},INITIAL:{rules:[0,1,38],inclusive:!0}},a}();return b.lexer=c,a.prototype=b,b.Parser=a,new a}();return a=b}(),i=function(a){"use strict";function b(a,b){return{left:"~"===a.charAt(2),right:"~"===b.charAt(b.length-3)}}function c(a,b,c,d,i,k){if(a.sexpr.id.original!==d.path.original)throw new j(a.sexpr.id.original+" doesn't match "+d.path.original,a);var l=c&&c.program,m={left:a.strip.left,right:d.strip.right,openStandalone:f(b.statements),closeStandalone:e((l||b).statements)};if(a.strip.right&&g(b.statements,null,!0),l){var n=c.strip;n.left&&h(b.statements,null,!0),n.right&&g(l.statements,null,!0),d.strip.left&&h(l.statements,null,!0),e(b.statements)&&f(l.statements)&&(h(b.statements),g(l.statements))}else d.strip.left&&h(b.statements,null,!0);return i?new this.BlockNode(a,l,b,m,k):new this.BlockNode(a,b,l,m,k)}function d(a,b){for(var c=0,d=a.length;d>c;c++){var i=a[c],j=i.strip;if(j){var k=e(a,c,b,"partial"===i.type),l=f(a,c,b),m=j.openStandalone&&k,n=j.closeStandalone&&l,o=j.inlineStandalone&&k&&l;j.right&&g(a,c,!0),j.left&&h(a,c,!0),o&&(g(a,c),h(a,c)&&"partial"===i.type&&(i.indent=/([ \t]+$)/.exec(a[c-1].original)?RegExp.$1:"")),m&&(g((i.program||i.inverse).statements),h(a,c)),n&&(g(a,c),h((i.inverse||i.program).statements))}}return a}function e(a,b,c){void 0===b&&(b=a.length);var d=a[b-1],e=a[b-2];return d?"content"===d.type?(e||!c?/\r?\n\s*?$/:/(^|\r?\n)\s*?$/).test(d.original):void 0:c}function f(a,b,c){void 0===b&&(b=-1);var d=a[b+1],e=a[b+2];return d?"content"===d.type?(e||!c?/^\s*?\r?\n/:/^\s*?(\r?\n|$)/).test(d.original):void 0:c}function g(a,b,c){var d=a[null==b?0:b+1];if(d&&"content"===d.type&&(c||!d.rightStripped)){var e=d.string;d.string=d.string.replace(c?/^\s+/:/^[ \t]*\r?\n?/,""),d.rightStripped=d.string!==e}}function h(a,b,c){var d=a[null==b?a.length-1:b-1];if(d&&"content"===d.type&&(c||!d.leftStripped)){var e=d.string;return d.string=d.string.replace(c?/\s+$/:/[ \t]+$/,""),d.leftStripped=d.string!==e,d.leftStripped}}var i={},j=a;return i.stripFlags=b,i.prepareBlock=c,i.prepareProgram=d,i}(c),j=function(a,b,c,d){"use strict";function e(a){return a.constructor===h.ProgramNode?a:(g.yy=k,g.parse(a))}var f={},g=a,h=b,i=c,j=d.extend;f.parser=g;var k={};return j(k,i,h),f.parse=e,f}(h,g,i,b),k=function(a,b){"use strict";function c(){}function d(a,b,c){if(null==a||"string"!=typeof a&&a.constructor!==c.AST.ProgramNode)throw new h("You must pass a string or Handlebars AST to Handlebars.precompile. You passed "+a);b=b||{},"data"in b||(b.data=!0),b.compat&&(b.useDepths=!0);var d=c.parse(a),e=(new c.Compiler).compile(d,b);return(new c.JavaScriptCompiler).compile(e,b)}function e(a,b,c){function d(){var d=c.parse(a),e=(new c.Compiler).compile(d,b),f=(new c.JavaScriptCompiler).compile(e,b,void 0,!0);return c.template(f)}if(null==a||"string"!=typeof a&&a.constructor!==c.AST.ProgramNode)throw new h("You must pass a string or Handlebars AST to Handlebars.compile. You passed "+a);b=b||{},"data"in b||(b.data=!0),b.compat&&(b.useDepths=!0);var e,f=function(a,b){return e||(e=d()),e.call(this,a,b)};return f._setup=function(a){return e||(e=d()),e._setup(a)},f._child=function(a,b,c){return e||(e=d()),e._child(a,b,c)},f}function f(a,b){if(a===b)return!0;if(i(a)&&i(b)&&a.length===b.length){for(var c=0;c<a.length;c++)if(!f(a[c],b[c]))return!1;return!0}}var g={},h=a,i=b.isArray,j=[].slice;return g.Compiler=c,c.prototype={compiler:c,equals:function(a){var b=this.opcodes.length;if(a.opcodes.length!==b)return!1;for(var c=0;b>c;c++){var d=this.opcodes[c],e=a.opcodes[c];if(d.opcode!==e.opcode||!f(d.args,e.args))return!1}for(b=this.children.length,c=0;b>c;c++)if(!this.children[c].equals(a.children[c]))return!1;return!0},guid:0,compile:function(a,b){this.opcodes=[],this.children=[],this.depths={list:[]},this.options=b,this.stringParams=b.stringParams,this.trackIds=b.trackIds;var c=this.options.knownHelpers;if(this.options.knownHelpers={helperMissing:!0,blockHelperMissing:!0,each:!0,"if":!0,unless:!0,"with":!0,log:!0,lookup:!0},c)for(var d in c)this.options.knownHelpers[d]=c[d];return this.accept(a)},accept:function(a){return this[a.type](a)},program:function(a){for(var b=a.statements,c=0,d=b.length;d>c;c++)this.accept(b[c]);return this.isSimple=1===d,this.depths.list=this.depths.list.sort(function(a,b){return a-b}),this},compileProgram:function(a){var b,c=(new this.compiler).compile(a,this.options),d=this.guid++;
+this.usePartial=this.usePartial||c.usePartial,this.children[d]=c;for(var e=0,f=c.depths.list.length;f>e;e++)b=c.depths.list[e],2>b||this.addDepth(b-1);return d},block:function(a){var b=a.mustache,c=a.program,d=a.inverse;c&&(c=this.compileProgram(c)),d&&(d=this.compileProgram(d));var e=b.sexpr,f=this.classifySexpr(e);"helper"===f?this.helperSexpr(e,c,d):"simple"===f?(this.simpleSexpr(e),this.opcode("pushProgram",c),this.opcode("pushProgram",d),this.opcode("emptyHash"),this.opcode("blockValue",e.id.original)):(this.ambiguousSexpr(e,c,d),this.opcode("pushProgram",c),this.opcode("pushProgram",d),this.opcode("emptyHash"),this.opcode("ambiguousBlockValue")),this.opcode("append")},hash:function(a){var b,c,d=a.pairs;for(this.opcode("pushHash"),b=0,c=d.length;c>b;b++)this.pushParam(d[b][1]);for(;b--;)this.opcode("assignToHash",d[b][0]);this.opcode("popHash")},partial:function(a){var b=a.partialName;this.usePartial=!0,a.hash?this.accept(a.hash):this.opcode("push","undefined"),a.context?this.accept(a.context):(this.opcode("getContext",0),this.opcode("pushContext")),this.opcode("invokePartial",b.name,a.indent||""),this.opcode("append")},content:function(a){a.string&&this.opcode("appendContent",a.string)},mustache:function(a){this.sexpr(a.sexpr),a.escaped&&!this.options.noEscape?this.opcode("appendEscaped"):this.opcode("append")},ambiguousSexpr:function(a,b,c){var d=a.id,e=d.parts[0],f=null!=b||null!=c;this.opcode("getContext",d.depth),this.opcode("pushProgram",b),this.opcode("pushProgram",c),this.ID(d),this.opcode("invokeAmbiguous",e,f)},simpleSexpr:function(a){var b=a.id;"DATA"===b.type?this.DATA(b):b.parts.length?this.ID(b):(this.addDepth(b.depth),this.opcode("getContext",b.depth),this.opcode("pushContext")),this.opcode("resolvePossibleLambda")},helperSexpr:function(a,b,c){var d=this.setupFullMustacheParams(a,b,c),e=a.id,f=e.parts[0];if(this.options.knownHelpers[f])this.opcode("invokeKnownHelper",d.length,f);else{if(this.options.knownHelpersOnly)throw new h("You specified knownHelpersOnly, but used the unknown helper "+f,a);e.falsy=!0,this.ID(e),this.opcode("invokeHelper",d.length,e.original,e.isSimple)}},sexpr:function(a){var b=this.classifySexpr(a);"simple"===b?this.simpleSexpr(a):"helper"===b?this.helperSexpr(a):this.ambiguousSexpr(a)},ID:function(a){this.addDepth(a.depth),this.opcode("getContext",a.depth);var b=a.parts[0];b?this.opcode("lookupOnContext",a.parts,a.falsy,a.isScoped):this.opcode("pushContext")},DATA:function(a){this.options.data=!0,this.opcode("lookupData",a.id.depth,a.id.parts)},STRING:function(a){this.opcode("pushString",a.string)},NUMBER:function(a){this.opcode("pushLiteral",a.number)},BOOLEAN:function(a){this.opcode("pushLiteral",a.bool)},comment:function(){},opcode:function(a){this.opcodes.push({opcode:a,args:j.call(arguments,1)})},addDepth:function(a){0!==a&&(this.depths[a]||(this.depths[a]=!0,this.depths.list.push(a)))},classifySexpr:function(a){var b=a.isHelper,c=a.eligibleHelper,d=this.options;if(c&&!b){var e=a.id.parts[0];d.knownHelpers[e]?b=!0:d.knownHelpersOnly&&(c=!1)}return b?"helper":c?"ambiguous":"simple"},pushParams:function(a){for(var b=0,c=a.length;c>b;b++)this.pushParam(a[b])},pushParam:function(a){this.stringParams?(a.depth&&this.addDepth(a.depth),this.opcode("getContext",a.depth||0),this.opcode("pushStringParam",a.stringModeValue,a.type),"sexpr"===a.type&&this.sexpr(a)):(this.trackIds&&this.opcode("pushId",a.type,a.idName||a.stringModeValue),this.accept(a))},setupFullMustacheParams:function(a,b,c){var d=a.params;return this.pushParams(d),this.opcode("pushProgram",b),this.opcode("pushProgram",c),a.hash?this.hash(a.hash):this.opcode("emptyHash"),d}},g.precompile=d,g.compile=e,g}(c,b),l=function(a,b){"use strict";function c(a){this.value=a}function d(){}var e,f=a.COMPILER_REVISION,g=a.REVISION_CHANGES,h=b;d.prototype={nameLookup:function(a,b){return d.isValidJavaScriptVariableName(b)?a+"."+b:a+"['"+b+"']"},depthedLookup:function(a){return this.aliases.lookup="this.lookup",'lookup(depths, "'+a+'")'},compilerInfo:function(){var a=f,b=g[a];return[a,b]},appendToBuffer:function(a){return this.environment.isSimple?"return "+a+";":{appendToBuffer:!0,content:a,toString:function(){return"buffer += "+a+";"}}},initializeBuffer:function(){return this.quotedString("")},namespace:"Handlebars",compile:function(a,b,c,d){this.environment=a,this.options=b,this.stringParams=this.options.stringParams,this.trackIds=this.options.trackIds,this.precompile=!d,this.name=this.environment.name,this.isChild=!!c,this.context=c||{programs:[],environments:[]},this.preamble(),this.stackSlot=0,this.stackVars=[],this.aliases={},this.registers={list:[]},this.hashes=[],this.compileStack=[],this.inlineStack=[],this.compileChildren(a,b),this.useDepths=this.useDepths||a.depths.list.length||this.options.compat;var e,f,g,i=a.opcodes;for(f=0,g=i.length;g>f;f++)e=i[f],this[e.opcode].apply(this,e.args);if(this.pushSource(""),this.stackSlot||this.inlineStack.length||this.compileStack.length)throw new h("Compile completed with content left on stack");var j=this.createFunctionContext(d);if(this.isChild)return j;var k={compiler:this.compilerInfo(),main:j},l=this.context.programs;for(f=0,g=l.length;g>f;f++)l[f]&&(k[f]=l[f]);return this.environment.usePartial&&(k.usePartial=!0),this.options.data&&(k.useData=!0),this.useDepths&&(k.useDepths=!0),this.options.compat&&(k.compat=!0),d||(k.compiler=JSON.stringify(k.compiler),k=this.objectLiteral(k)),k},preamble:function(){this.lastContext=0,this.source=[]},createFunctionContext:function(a){var b="",c=this.stackVars.concat(this.registers.list);c.length>0&&(b+=", "+c.join(", "));for(var d in this.aliases)this.aliases.hasOwnProperty(d)&&(b+=", "+d+"="+this.aliases[d]);var e=["depth0","helpers","partials","data"];this.useDepths&&e.push("depths");var f=this.mergeSource(b);return a?(e.push(f),Function.apply(this,e)):"function("+e.join(",")+") {\n  "+f+"}"},mergeSource:function(a){for(var b,c,d="",e=!this.forceBuffer,f=0,g=this.source.length;g>f;f++){var h=this.source[f];h.appendToBuffer?b=b?b+"\n    + "+h.content:h.content:(b&&(d?d+="buffer += "+b+";\n  ":(c=!0,d=b+";\n  "),b=void 0),d+=h+"\n  ",this.environment.isSimple||(e=!1))}return e?(b||!d)&&(d+="return "+(b||'""')+";\n"):(a+=", buffer = "+(c?"":this.initializeBuffer()),d+=b?"return buffer + "+b+";\n":"return buffer;\n"),a&&(d="var "+a.substring(2)+(c?"":";\n  ")+d),d},blockValue:function(a){this.aliases.blockHelperMissing="helpers.blockHelperMissing";var b=[this.contextName(0)];this.setupParams(a,0,b);var c=this.popStack();b.splice(1,0,c),this.push("blockHelperMissing.call("+b.join(", ")+")")},ambiguousBlockValue:function(){this.aliases.blockHelperMissing="helpers.blockHelperMissing";var a=[this.contextName(0)];this.setupParams("",0,a,!0),this.flushInline();var b=this.topStack();a.splice(1,0,b),this.pushSource("if (!"+this.lastHelper+") { "+b+" = blockHelperMissing.call("+a.join(", ")+"); }")},appendContent:function(a){this.pendingContent&&(a=this.pendingContent+a),this.pendingContent=a},append:function(){this.flushInline();var a=this.popStack();this.pushSource("if ("+a+" != null) { "+this.appendToBuffer(a)+" }"),this.environment.isSimple&&this.pushSource("else { "+this.appendToBuffer("''")+" }")},appendEscaped:function(){this.aliases.escapeExpression="this.escapeExpression",this.pushSource(this.appendToBuffer("escapeExpression("+this.popStack()+")"))},getContext:function(a){this.lastContext=a},pushContext:function(){this.pushStackLiteral(this.contextName(this.lastContext))},lookupOnContext:function(a,b,c){var d=0,e=a.length;for(c||!this.options.compat||this.lastContext?this.pushContext():this.push(this.depthedLookup(a[d++]));e>d;d++)this.replaceStack(function(c){var e=this.nameLookup(c,a[d],"context");return b?" && "+e:" != null ? "+e+" : "+c})},lookupData:function(a,b){a?this.pushStackLiteral("this.data(data, "+a+")"):this.pushStackLiteral("data");for(var c=b.length,d=0;c>d;d++)this.replaceStack(function(a){return" && "+this.nameLookup(a,b[d],"data")})},resolvePossibleLambda:function(){this.aliases.lambda="this.lambda",this.push("lambda("+this.popStack()+", "+this.contextName(0)+")")},pushStringParam:function(a,b){this.pushContext(),this.pushString(b),"sexpr"!==b&&("string"==typeof a?this.pushString(a):this.pushStackLiteral(a))},emptyHash:function(){this.pushStackLiteral("{}"),this.trackIds&&this.push("{}"),this.stringParams&&(this.push("{}"),this.push("{}"))},pushHash:function(){this.hash&&this.hashes.push(this.hash),this.hash={values:[],types:[],contexts:[],ids:[]}},popHash:function(){var a=this.hash;this.hash=this.hashes.pop(),this.trackIds&&this.push("{"+a.ids.join(",")+"}"),this.stringParams&&(this.push("{"+a.contexts.join(",")+"}"),this.push("{"+a.types.join(",")+"}")),this.push("{\n    "+a.values.join(",\n    ")+"\n  }")},pushString:function(a){this.pushStackLiteral(this.quotedString(a))},push:function(a){return this.inlineStack.push(a),a},pushLiteral:function(a){this.pushStackLiteral(a)},pushProgram:function(a){null!=a?this.pushStackLiteral(this.programExpression(a)):this.pushStackLiteral(null)},invokeHelper:function(a,b,c){this.aliases.helperMissing="helpers.helperMissing";var d=this.popStack(),e=this.setupHelper(a,b),f=(c?e.name+" || ":"")+d+" || helperMissing";this.push("(("+f+").call("+e.callParams+"))")},invokeKnownHelper:function(a,b){var c=this.setupHelper(a,b);this.push(c.name+".call("+c.callParams+")")},invokeAmbiguous:function(a,b){this.aliases.functionType='"function"',this.aliases.helperMissing="helpers.helperMissing",this.useRegister("helper");var c=this.popStack();this.emptyHash();var d=this.setupHelper(0,a,b),e=this.lastHelper=this.nameLookup("helpers",a,"helper");this.push("((helper = (helper = "+e+" || "+c+") != null ? helper : helperMissing"+(d.paramsInit?"),("+d.paramsInit:"")+"),(typeof helper === functionType ? helper.call("+d.callParams+") : helper))")},invokePartial:function(a,b){var c=[this.nameLookup("partials",a,"partial"),"'"+b+"'","'"+a+"'",this.popStack(),this.popStack(),"helpers","partials"];this.options.data?c.push("data"):this.options.compat&&c.push("undefined"),this.options.compat&&c.push("depths"),this.push("this.invokePartial("+c.join(", ")+")")},assignToHash:function(a){var b,c,d,e=this.popStack();this.trackIds&&(d=this.popStack()),this.stringParams&&(c=this.popStack(),b=this.popStack());var f=this.hash;b&&f.contexts.push("'"+a+"': "+b),c&&f.types.push("'"+a+"': "+c),d&&f.ids.push("'"+a+"': "+d),f.values.push("'"+a+"': ("+e+")")},pushId:function(a,b){"ID"===a||"DATA"===a?this.pushString(b):"sexpr"===a?this.pushStackLiteral("true"):this.pushStackLiteral("null")},compiler:d,compileChildren:function(a,b){for(var c,d,e=a.children,f=0,g=e.length;g>f;f++){c=e[f],d=new this.compiler;var h=this.matchExistingProgram(c);null==h?(this.context.programs.push(""),h=this.context.programs.length,c.index=h,c.name="program"+h,this.context.programs[h]=d.compile(c,b,this.context,!this.precompile),this.context.environments[h]=c,this.useDepths=this.useDepths||d.useDepths):(c.index=h,c.name="program"+h)}},matchExistingProgram:function(a){for(var b=0,c=this.context.environments.length;c>b;b++){var d=this.context.environments[b];if(d&&d.equals(a))return b}},programExpression:function(a){var b=this.environment.children[a],c=(b.depths.list,this.useDepths),d=[b.index,"data"];return c&&d.push("depths"),"this.program("+d.join(", ")+")"},useRegister:function(a){this.registers[a]||(this.registers[a]=!0,this.registers.list.push(a))},pushStackLiteral:function(a){return this.push(new c(a))},pushSource:function(a){this.pendingContent&&(this.source.push(this.appendToBuffer(this.quotedString(this.pendingContent))),this.pendingContent=void 0),a&&this.source.push(a)},pushStack:function(a){this.flushInline();var b=this.incrStack();return this.pushSource(b+" = "+a+";"),this.compileStack.push(b),b},replaceStack:function(a){{var b,d,e,f="";this.isInline()}if(!this.isInline())throw new h("replaceStack on non-inline");var g=this.popStack(!0);if(g instanceof c)f=b=g.value,e=!0;else{d=!this.stackSlot;var i=d?this.incrStack():this.topStackName();f="("+this.push(i)+" = "+g+")",b=this.topStack()}var j=a.call(this,b);e||this.popStack(),d&&this.stackSlot--,this.push("("+f+j+")")},incrStack:function(){return this.stackSlot++,this.stackSlot>this.stackVars.length&&this.stackVars.push("stack"+this.stackSlot),this.topStackName()},topStackName:function(){return"stack"+this.stackSlot},flushInline:function(){var a=this.inlineStack;if(a.length){this.inlineStack=[];for(var b=0,d=a.length;d>b;b++){var e=a[b];e instanceof c?this.compileStack.push(e):this.pushStack(e)}}},isInline:function(){return this.inlineStack.length},popStack:function(a){var b=this.isInline(),d=(b?this.inlineStack:this.compileStack).pop();if(!a&&d instanceof c)return d.value;if(!b){if(!this.stackSlot)throw new h("Invalid stack pop");this.stackSlot--}return d},topStack:function(){var a=this.isInline()?this.inlineStack:this.compileStack,b=a[a.length-1];return b instanceof c?b.value:b},contextName:function(a){return this.useDepths&&a?"depths["+a+"]":"depth"+a},quotedString:function(a){return'"'+a.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")+'"'},objectLiteral:function(a){var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(this.quotedString(c)+":"+a[c]);return"{"+b.join(",")+"}"},setupHelper:function(a,b,c){var d=[],e=this.setupParams(b,a,d,c),f=this.nameLookup("helpers",b,"helper");return{params:d,paramsInit:e,name:f,callParams:[this.contextName(0)].concat(d).join(", ")}},setupOptions:function(a,b,c){var d,e,f,g={},h=[],i=[],j=[];g.name=this.quotedString(a),g.hash=this.popStack(),this.trackIds&&(g.hashIds=this.popStack()),this.stringParams&&(g.hashTypes=this.popStack(),g.hashContexts=this.popStack()),e=this.popStack(),f=this.popStack(),(f||e)&&(f||(f="this.noop"),e||(e="this.noop"),g.fn=f,g.inverse=e);for(var k=b;k--;)d=this.popStack(),c[k]=d,this.trackIds&&(j[k]=this.popStack()),this.stringParams&&(i[k]=this.popStack(),h[k]=this.popStack());return this.trackIds&&(g.ids="["+j.join(",")+"]"),this.stringParams&&(g.types="["+i.join(",")+"]",g.contexts="["+h.join(",")+"]"),this.options.data&&(g.data="data"),g},setupParams:function(a,b,c,d){var e=this.objectLiteral(this.setupOptions(a,b,c));return d?(this.useRegister("options"),c.push("options"),"options="+e):(c.push(e),"")}};for(var i="break else new var case finally return void catch for switch while continue function this with default if throw delete in try do instanceof typeof abstract enum int short boolean export interface static byte extends long super char final native synchronized class float package throws const goto private transient debugger implements protected volatile double import public let yield".split(" "),j=d.RESERVED_WORDS={},k=0,l=i.length;l>k;k++)j[i[k]]=!0;return d.isValidJavaScriptVariableName=function(a){return!d.RESERVED_WORDS[a]&&/^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(a)},e=d}(d,c),m=function(a,b,c,d,e){"use strict";var f,g=a,h=b,i=c.parser,j=c.parse,k=d.Compiler,l=d.compile,m=d.precompile,n=e,o=g.create,p=function(){var a=o();return a.compile=function(b,c){return l(b,c,a)},a.precompile=function(b,c){return m(b,c,a)},a.AST=h,a.Compiler=k,a.JavaScriptCompiler=n,a.Parser=i,a.parse=j,a};return g=p(),g.create=p,g["default"]=g,f=g}(f,g,j,k,l);return m});`)
+
+func third_partySwaggerUiLibHandlebars200JsBytes() ([]byte, error) {
+	return _third_partySwaggerUiLibHandlebars200Js, nil
+}
+
+func third_partySwaggerUiLibHandlebars200Js() (*asset, error) {
+	bytes, err := third_partySwaggerUiLibHandlebars200JsBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/lib/handlebars-2.0.0.js", size: 48517, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiLibHighlight73PackJs = []byte(`var hljs=new function(){function l(o){return o.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;")}function b(p){for(var o=p.firstChild;o;o=o.nextSibling){if(o.nodeName=="CODE"){return o}if(!(o.nodeType==3&&o.nodeValue.match(/\s+/))){break}}}function h(p,o){return Array.prototype.map.call(p.childNodes,function(q){if(q.nodeType==3){return o?q.nodeValue.replace(/\n/g,""):q.nodeValue}if(q.nodeName=="BR"){return"\n"}return h(q,o)}).join("")}function a(q){var p=(q.className+" "+q.parentNode.className).split(/\s+/);p=p.map(function(r){return r.replace(/^language-/,"")});for(var o=0;o<p.length;o++){if(e[p[o]]||p[o]=="no-highlight"){return p[o]}}}function c(q){var o=[];(function p(r,s){for(var t=r.firstChild;t;t=t.nextSibling){if(t.nodeType==3){s+=t.nodeValue.length}else{if(t.nodeName=="BR"){s+=1}else{if(t.nodeType==1){o.push({event:"start",offset:s,node:t});s=p(t,s);o.push({event:"stop",offset:s,node:t})}}}}return s})(q,0);return o}function j(x,v,w){var p=0;var y="";var r=[];function t(){if(x.length&&v.length){if(x[0].offset!=v[0].offset){return(x[0].offset<v[0].offset)?x:v}else{return v[0].event=="start"?x:v}}else{return x.length?x:v}}function s(A){function z(B){return" "+B.nodeName+'="'+l(B.value)+'"'}return"<"+A.nodeName+Array.prototype.map.call(A.attributes,z).join("")+">"}while(x.length||v.length){var u=t().splice(0,1)[0];y+=l(w.substr(p,u.offset-p));p=u.offset;if(u.event=="start"){y+=s(u.node);r.push(u.node)}else{if(u.event=="stop"){var o,q=r.length;do{q--;o=r[q];y+=("</"+o.nodeName.toLowerCase()+">")}while(o!=u.node);r.splice(q,1);while(q<r.length){y+=s(r[q]);q++}}}}return y+l(w.substr(p))}function f(q){function o(s,r){return RegExp(s,"m"+(q.cI?"i":"")+(r?"g":""))}function p(y,w){if(y.compiled){return}y.compiled=true;var s=[];if(y.k){var r={};function z(A,t){t.split(" ").forEach(function(B){var C=B.split("|");r[C[0]]=[A,C[1]?Number(C[1]):1];s.push(C[0])})}y.lR=o(y.l||hljs.IR,true);if(typeof y.k=="string"){z("keyword",y.k)}else{for(var x in y.k){if(!y.k.hasOwnProperty(x)){continue}z(x,y.k[x])}}y.k=r}if(w){if(y.bWK){y.b="\\b("+s.join("|")+")\\s"}y.bR=o(y.b?y.b:"\\B|\\b");if(!y.e&&!y.eW){y.e="\\B|\\b"}if(y.e){y.eR=o(y.e)}y.tE=y.e||"";if(y.eW&&w.tE){y.tE+=(y.e?"|":"")+w.tE}}if(y.i){y.iR=o(y.i)}if(y.r===undefined){y.r=1}if(!y.c){y.c=[]}for(var v=0;v<y.c.length;v++){if(y.c[v]=="self"){y.c[v]=y}p(y.c[v],y)}if(y.starts){p(y.starts,w)}var u=[];for(var v=0;v<y.c.length;v++){u.push(y.c[v].b)}if(y.tE){u.push(y.tE)}if(y.i){u.push(y.i)}y.t=u.length?o(u.join("|"),true):{exec:function(t){return null}}}p(q)}function d(D,E){function o(r,M){for(var L=0;L<M.c.length;L++){var K=M.c[L].bR.exec(r);if(K&&K.index==0){return M.c[L]}}}function s(K,r){if(K.e&&K.eR.test(r)){return K}if(K.eW){return s(K.parent,r)}}function t(r,K){return K.i&&K.iR.test(r)}function y(L,r){var K=F.cI?r[0].toLowerCase():r[0];return L.k.hasOwnProperty(K)&&L.k[K]}function G(){var K=l(w);if(!A.k){return K}var r="";var N=0;A.lR.lastIndex=0;var L=A.lR.exec(K);while(L){r+=K.substr(N,L.index-N);var M=y(A,L);if(M){v+=M[1];r+='<span class="'+M[0]+'">'+L[0]+"</span>"}else{r+=L[0]}N=A.lR.lastIndex;L=A.lR.exec(K)}return r+K.substr(N)}function z(){if(A.sL&&!e[A.sL]){return l(w)}var r=A.sL?d(A.sL,w):g(w);if(A.r>0){v+=r.keyword_count;B+=r.r}return'<span class="'+r.language+'">'+r.value+"</span>"}function J(){return A.sL!==undefined?z():G()}function I(L,r){var K=L.cN?'<span class="'+L.cN+'">':"";if(L.rB){x+=K;w=""}else{if(L.eB){x+=l(r)+K;w=""}else{x+=K;w=r}}A=Object.create(L,{parent:{value:A}});B+=L.r}function C(K,r){w+=K;if(r===undefined){x+=J();return 0}var L=o(r,A);if(L){x+=J();I(L,r);return L.rB?0:r.length}var M=s(A,r);if(M){if(!(M.rE||M.eE)){w+=r}x+=J();do{if(A.cN){x+="</span>"}A=A.parent}while(A!=M.parent);if(M.eE){x+=l(r)}w="";if(M.starts){I(M.starts,"")}return M.rE?0:r.length}if(t(r,A)){throw"Illegal"}w+=r;return r.length||1}var F=e[D];f(F);var A=F;var w="";var B=0;var v=0;var x="";try{var u,q,p=0;while(true){A.t.lastIndex=p;u=A.t.exec(E);if(!u){break}q=C(E.substr(p,u.index-p),u[0]);p=u.index+q}C(E.substr(p));return{r:B,keyword_count:v,value:x,language:D}}catch(H){if(H=="Illegal"){return{r:0,keyword_count:0,value:l(E)}}else{throw H}}}function g(s){var o={keyword_count:0,r:0,value:l(s)};var q=o;for(var p in e){if(!e.hasOwnProperty(p)){continue}var r=d(p,s);r.language=p;if(r.keyword_count+r.r>q.keyword_count+q.r){q=r}if(r.keyword_count+r.r>o.keyword_count+o.r){q=o;o=r}}if(q.language){o.second_best=q}return o}function i(q,p,o){if(p){q=q.replace(/^((<[^>]+>|\t)+)/gm,function(r,v,u,t){return v.replace(/\t/g,p)})}if(o){q=q.replace(/\n/g,"<br>")}return q}function m(r,u,p){var v=h(r,p);var t=a(r);if(t=="no-highlight"){return}var w=t?d(t,v):g(v);t=w.language;var o=c(r);if(o.length){var q=document.createElement("pre");q.innerHTML=w.value;w.value=j(o,c(q),v)}w.value=i(w.value,u,p);var s=r.className;if(!s.match("(\\s|^)(language-)?"+t+"(\\s|$)")){s=s?(s+" "+t):t}r.innerHTML=w.value;r.className=s;r.result={language:t,kw:w.keyword_count,re:w.r};if(w.second_best){r.second_best={language:w.second_best.language,kw:w.second_best.keyword_count,re:w.second_best.r}}}function n(){if(n.called){return}n.called=true;Array.prototype.map.call(document.getElementsByTagName("pre"),b).filter(Boolean).forEach(function(o){m(o,hljs.tabReplace)})}function k(){window.addEventListener("DOMContentLoaded",n,false);window.addEventListener("load",n,false)}var e={};this.LANGUAGES=e;this.highlight=d;this.highlightAuto=g;this.fixMarkup=i;this.highlightBlock=m;this.initHighlighting=n;this.initHighlightingOnLoad=k;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";this.BNR="\\b(0b[01]+)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|\\.|-|-=|/|/=|:|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\[\\s\\S]",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.inherit=function(q,r){var o={};for(var p in q){o[p]=q[p]}if(r){for(var p in r){o[p]=r[p]}}return o}}();hljs.LANGUAGES.xml=function(a){var c="[A-Za-z0-9\\._:-]+";var b={eW:true,c:[{cN:"attribute",b:c,r:0},{b:'="',rB:true,e:'"',c:[{cN:"value",b:'"',eW:true}]},{b:"='",rB:true,e:"'",c:[{cN:"value",b:"'",eW:true}]},{b:"=",c:[{cN:"value",b:"[^\\s/>]+"}]}]};return{cI:true,c:[{cN:"pi",b:"<\\?",e:"\\?>",r:10},{cN:"doctype",b:"<!DOCTYPE",e:">",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"<!--",e:"-->",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"<style(?=\\s|>|$)",e:">",k:{title:"style"},c:[b],starts:{e:"</style>",rE:true,sL:"css"}},{cN:"tag",b:"<script(?=\\s|>|$)",e:">",k:{title:"script"},c:[b],starts:{e:"<\/script>",rE:true,sL:"javascript"}},{b:"<%",e:"%>",sL:"vbscript"},{cN:"tag",b:"</?",e:"/?>",c:[{cN:"title",b:"[^ />]+"},b]}]}}(hljs);hljs.LANGUAGES.json=function(a){var e={literal:"true false null"};var d=[a.QSM,a.CNM];var c={cN:"value",e:",",eW:true,eE:true,c:d,k:e};var b={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:true,eE:true,c:[a.BE],i:"\\n",starts:c}],i:"\\S"};var f={b:"\\[",e:"\\]",c:[a.inherit(c,{cN:null})],i:"\\S"};d.splice(d.length,0,b,f);return{c:d,k:e,i:"\\S"}}(hljs);`)
+
+func third_partySwaggerUiLibHighlight73PackJsBytes() ([]byte, error) {
+	return _third_partySwaggerUiLibHighlight73PackJs, nil
+}
+
+func third_partySwaggerUiLibHighlight73PackJs() (*asset, error) {
+	bytes, err := third_partySwaggerUiLibHighlight73PackJsBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/lib/highlight.7.3.pack.js", size: 7499, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiLibJquery180MinJs = []byte(`/*! jQuery v@1.8.0 jquery.com | jquery.org/license */
+(function(a,b){function G(a){var b=F[a]={};return p.each(a.split(s),function(a,c){b[c]=!0}),b}function J(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(I,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:+d+""===d?+d:H.test(d)?p.parseJSON(d):d}catch(f){}p.data(a,c,d)}else d=b}return d}function K(a){var b;for(b in a){if(b==="data"&&p.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function ba(){return!1}function bb(){return!0}function bh(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function bi(a,b){do a=a[b];while(a&&a.nodeType!==1);return a}function bj(a,b,c){b=b||0;if(p.isFunction(b))return p.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return p.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=p.grep(a,function(a){return a.nodeType===1});if(be.test(b))return p.filter(b,d,!c);b=p.filter(b,d)}return p.grep(a,function(a,d){return p.inArray(a,b)>=0===c})}function bk(a){var b=bl.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function bC(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d<e;d++)p.event.add(b,c,h[c][d])}g.data&&(g.data=p.extend({},g.data))}function bE(a,b){var c;if(b.nodeType!==1)return;b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c==="object"?(b.parentNode&&(b.outerHTML=a.outerHTML),p.support.html5Clone&&a.innerHTML&&!p.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):c==="input"&&bv.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):c==="option"?b.selected=a.defaultSelected:c==="input"||c==="textarea"?b.defaultValue=a.defaultValue:c==="script"&&b.text!==a.text&&(b.text=a.text),b.removeAttribute(p.expando)}function bF(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bG(a){bv.test(a.type)&&(a.defaultChecked=a.checked)}function bX(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=bV.length;while(e--){b=bV[e]+c;if(b in a)return b}return d}function bY(a,b){return a=b||a,p.css(a,"display")==="none"||!p.contains(a.ownerDocument,a)}function bZ(a,b){var c,d,e=[],f=0,g=a.length;for(;f<g;f++){c=a[f];if(!c.style)continue;e[f]=p._data(c,"olddisplay"),b?(!e[f]&&c.style.display==="none"&&(c.style.display=""),c.style.display===""&&bY(c)&&(e[f]=p._data(c,"olddisplay",cb(c.nodeName)))):(d=bH(c,"display"),!e[f]&&d!=="none"&&p._data(c,"olddisplay",d))}for(f=0;f<g;f++){c=a[f];if(!c.style)continue;if(!b||c.style.display==="none"||c.style.display==="")c.style.display=b?e[f]||"":"none"}return a}function b$(a,b,c){var d=bO.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function b_(a,b,c,d){var e=c===(d?"border":"content")?4:b==="width"?1:0,f=0;for(;e<4;e+=2)c==="margin"&&(f+=p.css(a,c+bU[e],!0)),d?(c==="content"&&(f-=parseFloat(bH(a,"padding"+bU[e]))||0),c!=="margin"&&(f-=parseFloat(bH(a,"border"+bU[e]+"Width"))||0)):(f+=parseFloat(bH(a,"padding"+bU[e]))||0,c!=="padding"&&(f+=parseFloat(bH(a,"border"+bU[e]+"Width"))||0));return f}function ca(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=!0,f=p.support.boxSizing&&p.css(a,"boxSizing")==="border-box";if(d<=0){d=bH(a,b);if(d<0||d==null)d=a.style[b];if(bP.test(d))return d;e=f&&(p.support.boxSizingReliable||d===a.style[b]),d=parseFloat(d)||0}return d+b_(a,b,c||(f?"border":"content"),e)+"px"}function cb(a){if(bR[a])return bR[a];var b=p("<"+a+">").appendTo(e.body),c=b.css("display");b.remove();if(c==="none"||c===""){bI=e.body.appendChild(bI||p.extend(e.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write("<!doctype html><html><body>"),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,"display"),e.body.removeChild(bI)}return bR[a]=c,c}function ch(a,b,c,d){var e;if(p.isArray(b))p.each(b,function(b,e){c||cd.test(a)?d(a,e):ch(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&p.type(b)==="object")for(e in b)ch(a+"["+e+"]",b[e],c,d);else d(a,b)}function cy(a){return function(b,c){typeof b!="string"&&(c=b,b="*");var d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h<i;h++)d=g[h],f=/^\+/.test(d),f&&(d=d.substr(1)||"*"),e=a[d]=a[d]||[],e[f?"unshift":"push"](c)}}function cz(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h,i=a[f],j=0,k=i?i.length:0,l=a===cu;for(;j<k&&(l||!h);j++)h=i[j](c,d,e),typeof h=="string"&&(!l||g[h]?h=b:(c.dataTypes.unshift(h),h=cz(a,c,d,e,h,g)));return(l||!h)&&!g["*"]&&(h=cz(a,c,d,e,"*",g)),h}function cA(a,c){var d,e,f=p.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((f[d]?a:e||(e={}))[d]=c[d]);e&&p.extend(!0,a,e)}function cB(a,c,d){var e,f,g,h,i=a.contents,j=a.dataTypes,k=a.responseFields;for(f in k)f in d&&(c[k[f]]=d[f]);while(j[0]==="*")j.shift(),e===b&&(e=a.mimeType||c.getResponseHeader("content-type"));if(e)for(f in i)if(i[f]&&i[f].test(e)){j.unshift(f);break}if(j[0]in d)g=j[0];else{for(f in d){if(!j[0]||a.converters[f+" "+j[0]]){g=f;break}h||(h=f)}g=g||h}if(g)return g!==j[0]&&j.unshift(g),d[g]}function cC(a,b){var c,d,e,f,g=a.dataTypes.slice(),h=g[0],i={},j=0;a.dataFilter&&(b=a.dataFilter(b,a.dataType));if(g[1])for(c in a.converters)i[c.toLowerCase()]=a.converters[c];for(;e=g[++j];)if(e!=="*"){if(h!=="*"&&h!==e){c=i[h+" "+e]||i["* "+e];if(!c)for(d in i){f=d.split(" ");if(f[1]===e){c=i[h+" "+f[0]]||i["* "+f[0]];if(c){c===!0?c=i[d]:i[d]!==!0&&(e=f[0],g.splice(j--,0,e));break}}}if(c!==!0)if(c&&a["throws"])b=c(b);else try{b=c(b)}catch(k){return{state:"parsererror",error:c?k:"No conversion from "+h+" to "+e}}}h=e}return{state:"success",data:b}}function cK(){try{return new a.XMLHttpRequest}catch(b){}}function cL(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function cT(){return setTimeout(function(){cM=b},0),cM=p.now()}function cU(a,b){p.each(b,function(b,c){var d=(cS[b]||[]).concat(cS["*"]),e=0,f=d.length;for(;e<f;e++)if(d[e].call(a,b,c))return})}function cV(a,b,c){var d,e=0,f=0,g=cR.length,h=p.Deferred().always(function(){delete i.elem}),i=function(){var b=cM||cT(),c=Math.max(0,j.startTime+j.duration-b),d=1-(c/j.duration||0),e=0,f=j.tweens.length;for(;e<f;e++)j.tweens[e].run(d);return h.notifyWith(a,[j,d,c]),d<1&&f?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:p.extend({},b),opts:p.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:cM||cT(),duration:c.duration,tweens:[],createTween:function(b,c,d){var e=p.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(e),e},stop:function(b){var c=0,d=b?j.tweens.length:0;for(;c<d;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;cW(k,j.opts.specialEasing);for(;e<g;e++){d=cR[e].call(j,a,k,j.opts);if(d)return d}return cU(j,k),p.isFunction(j.opts.start)&&j.opts.start.call(a,j),p.fx.timer(p.extend(i,{anim:j,queue:j.opts.queue,elem:a})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}function cW(a,b){var c,d,e,f,g;for(c in a){d=p.camelCase(c),e=b[d],f=a[c],p.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=p.cssHooks[d];if(g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}}function cX(a,b,c){var d,e,f,g,h,i,j,k,l=this,m=a.style,n={},o=[],q=a.nodeType&&bY(a);c.queue||(j=p._queueHooks(a,"fx"),j.unqueued==null&&(j.unqueued=0,k=j.empty.fire,j.empty.fire=function(){j.unqueued||k()}),j.unqueued++,l.always(function(){l.always(function(){j.unqueued--,p.queue(a,"fx").length||j.empty.fire()})})),a.nodeType===1&&("height"in b||"width"in b)&&(c.overflow=[m.overflow,m.overflowX,m.overflowY],p.css(a,"display")==="inline"&&p.css(a,"float")==="none"&&(!p.support.inlineBlockNeedsLayout||cb(a.nodeName)==="inline"?m.display="inline-block":m.zoom=1)),c.overflow&&(m.overflow="hidden",p.support.shrinkWrapBlocks||l.done(function(){m.overflow=c.overflow[0],m.overflowX=c.overflow[1],m.overflowY=c.overflow[2]}));for(d in b){f=b[d];if(cO.exec(f)){delete b[d];if(f===(q?"hide":"show"))continue;o.push(d)}}g=o.length;if(g){h=p._data(a,"fxshow")||p._data(a,"fxshow",{}),q?p(a).show():l.done(function(){p(a).hide()}),l.done(function(){var b;p.removeData(a,"fxshow",!0);for(b in n)p.style(a,b,n[b])});for(d=0;d<g;d++)e=o[d],i=l.createTween(e,q?h[e]:0),n[e]=h[e]||p.style(a,e),e in h||(h[e]=i.start,q&&(i.end=i.start,i.start=e==="width"||e==="height"?1:0))}}function cY(a,b,c,d,e){return new cY.prototype.init(a,b,c,d,e)}function cZ(a,b){var c,d={height:a},e=0;for(;e<4;e+=2-b)c=bU[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function c_(a){return p.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}var c,d,e=a.document,f=a.location,g=a.navigator,h=a.jQuery,i=a.$,j=Array.prototype.push,k=Array.prototype.slice,l=Array.prototype.indexOf,m=Object.prototype.toString,n=Object.prototype.hasOwnProperty,o=String.prototype.trim,p=function(a,b){return new p.fn.init(a,b,c)},q=/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,r=/\S/,s=/\s+/,t=r.test(" ")?/^[\s\xA0]+|[\s\xA0]+$/g:/^\s+|\s+$/g,u=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,y=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,z=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,A=/^-ms-/,B=/-([\da-z])/gi,C=function(a,b){return(b+"").toUpperCase()},D=function(){e.addEventListener?(e.removeEventListener("DOMContentLoaded",D,!1),p.ready()):e.readyState==="complete"&&(e.detachEvent("onreadystatechange",D),p.ready())},E={};p.fn=p.prototype={constructor:p,init:function(a,c,d){var f,g,h,i;if(!a)return this;if(a.nodeType)return this.context=this[0]=a,this.length=1,this;if(typeof a=="string"){a.charAt(0)==="<"&&a.charAt(a.length-1)===">"&&a.length>=3?f=[null,a,null]:f=u.exec(a);if(f&&(f[1]||!c)){if(f[1])return c=c instanceof p?c[0]:c,i=c&&c.nodeType?c.ownerDocument||c:e,a=p.parseHTML(f[1],i,!0),v.test(f[1])&&p.isPlainObject(c)&&this.attr.call(a,c,!0),p.merge(this,a);g=e.getElementById(f[2]);if(g&&g.parentNode){if(g.id!==f[2])return d.find(a);this.length=1,this[0]=g}return this.context=e,this.selector=a,this}return!c||c.jquery?(c||d).find(a):this.constructor(c).find(a)}return p.isFunction(a)?d.ready(a):(a.selector!==b&&(this.selector=a.selector,this.context=a.context),p.makeArray(a,this))},selector:"",jquery:"1.8.0",length:0,size:function(){return this.length},toArray:function(){return k.call(this)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=p.merge(this.constructor(),a);return d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")"),d},each:function(a,b){return p.each(this,a,b)},ready:function(a){return p.ready.promise().done(a),this},eq:function(a){return a=+a,a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(k.apply(this,arguments),"slice",k.call(arguments).join(","))},map:function(a){return this.pushStack(p.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:j,sort:[].sort,splice:[].splice},p.fn.init.prototype=p.fn,p.extend=p.fn.extend=function(){var a,c,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;typeof h=="boolean"&&(k=h,h=arguments[1]||{},i=2),typeof h!="object"&&!p.isFunction(h)&&(h={}),j===i&&(h=this,--i);for(;i<j;i++)if((a=arguments[i])!=null)for(c in a){d=h[c],e=a[c];if(h===e)continue;k&&e&&(p.isPlainObject(e)||(f=p.isArray(e)))?(f?(f=!1,g=d&&p.isArray(d)?d:[]):g=d&&p.isPlainObject(d)?d:{},h[c]=p.extend(k,g,e)):e!==b&&(h[c]=e)}return h},p.extend({noConflict:function(b){return a.$===p&&(a.$=i),b&&a.jQuery===p&&(a.jQuery=h),p},isReady:!1,readyWait:1,holdReady:function(a){a?p.readyWait++:p.ready(!0)},ready:function(a){if(a===!0?--p.readyWait:p.isReady)return;if(!e.body)return setTimeout(p.ready,1);p.isReady=!0;if(a!==!0&&--p.readyWait>0)return;d.resolveWith(e,[p]),p.fn.trigger&&p(e).trigger("ready").off("ready")},isFunction:function(a){return p.type(a)==="function"},isArray:Array.isArray||function(a){return p.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):E[m.call(a)]||"object"},isPlainObject:function(a){if(!a||p.type(a)!=="object"||a.nodeType||p.isWindow(a))return!1;try{if(a.constructor&&!n.call(a,"constructor")&&!n.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||n.call(a,d)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},error:function(a){throw new Error(a)},parseHTML:function(a,b,c){var d;return!a||typeof a!="string"?null:(typeof b=="boolean"&&(c=b,b=0),b=b||e,(d=v.exec(a))?[b.createElement(d[1])]:(d=p.buildFragment([a],b,c?null:[]),p.merge([],(d.cacheable?p.clone(d.fragment):d.fragment).childNodes)))},parseJSON:function(b){if(!b||typeof b!="string")return null;b=p.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(w.test(b.replace(y,"@").replace(z,"]").replace(x,"")))return(new Function("return "+b))();p.error("Invalid JSON: "+b)},parseXML:function(c){var d,e;if(!c||typeof c!="string")return null;try{a.DOMParser?(e=new DOMParser,d=e.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(f){d=b}return(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&p.error("Invalid XML: "+c),d},noop:function(){},globalEval:function(b){b&&r.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(A,"ms-").replace(B,C)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var e,f=0,g=a.length,h=g===b||p.isFunction(a);if(d){if(h){for(e in a)if(c.apply(a[e],d)===!1)break}else for(;f<g;)if(c.apply(a[f++],d)===!1)break}else if(h){for(e in a)if(c.call(a[e],e,a[e])===!1)break}else for(;f<g;)if(c.call(a[f],f,a[f++])===!1)break;return a},trim:o?function(a){return a==null?"":o.call(a)}:function(a){return a==null?"":a.toString().replace(t,"")},makeArray:function(a,b){var c,d=b||[];return a!=null&&(c=p.type(a),a.length==null||c==="string"||c==="function"||c==="regexp"||p.isWindow(a)?j.call(d,a):p.merge(d,a)),d},inArray:function(a,b,c){var d;if(b){if(l)return l.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=c.length,e=a.length,f=0;if(typeof d=="number")for(;f<d;f++)a[e++]=c[f];else while(c[f]!==b)a[e++]=c[f++];return a.length=e,a},grep:function(a,b,c){var d,e=[],f=0,g=a.length;c=!!c;for(;f<g;f++)d=!!b(a[f],f),c!==d&&e.push(a[f]);return e},map:function(a,c,d){var e,f,g=[],h=0,i=a.length,j=a instanceof p||i!==b&&typeof i=="number"&&(i>0&&a[0]&&a[i-1]||i===0||p.isArray(a));if(j)for(;h<i;h++)e=c(a[h],h,d),e!=null&&(g[g.length]=e);else for(f in a)e=c(a[f],f,d),e!=null&&(g[g.length]=e);return g.concat.apply([],g)},guid:1,proxy:function(a,c){var d,e,f;return typeof c=="string"&&(d=a[c],c=a,a=d),p.isFunction(a)?(e=k.call(arguments,2),f=function(){return a.apply(c,e.concat(k.call(arguments)))},f.guid=a.guid=a.guid||f.guid||p.guid++,f):b},access:function(a,c,d,e,f,g,h){var i,j=d==null,k=0,l=a.length;if(d&&typeof d=="object"){for(k in d)p.access(a,c,k,d[k],1,g,e);f=1}else if(e!==b){i=h===b&&p.isFunction(e),j&&(i?(i=c,c=function(a,b,c){return i.call(p(a),c)}):(c.call(a,e),c=null));if(c)for(;k<l;k++)c(a[k],d,i?e.call(a[k],k,c(a[k],d)):e,h);f=1}return f?a:j?c.call(a):l?c(a[0],d):g},now:function(){return(new Date).getTime()}}),p.ready.promise=function(b){if(!d){d=p.Deferred();if(e.readyState==="complete"||e.readyState!=="loading"&&e.addEventListener)setTimeout(p.ready,1);else if(e.addEventListener)e.addEventListener("DOMContentLoaded",D,!1),a.addEventListener("load",p.ready,!1);else{e.attachEvent("onreadystatechange",D),a.attachEvent("onload",p.ready);var c=!1;try{c=a.frameElement==null&&e.documentElement}catch(f){}c&&c.doScroll&&function g(){if(!p.isReady){try{c.doScroll("left")}catch(a){return setTimeout(g,50)}p.ready()}}()}}return d.promise(b)},p.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){E["[object "+b+"]"]=b.toLowerCase()}),c=p(e);var F={};p.Callbacks=function(a){a=typeof a=="string"?F[a]||G(a):p.extend({},a);var c,d,e,f,g,h,i=[],j=!a.once&&[],k=function(b){c=a.memory&&b,d=!0,h=f||0,f=0,g=i.length,e=!0;for(;i&&h<g;h++)if(i[h].apply(b[0],b[1])===!1&&a.stopOnFalse){c=!1;break}e=!1,i&&(j?j.length&&k(j.shift()):c?i=[]:l.disable())},l={add:function(){if(i){var b=i.length;(function d(b){p.each(b,function(b,c){p.isFunction(c)&&(!a.unique||!l.has(c))?i.push(c):c&&c.length&&d(c)})})(arguments),e?g=i.length:c&&(f=b,k(c))}return this},remove:function(){return i&&p.each(arguments,function(a,b){var c;while((c=p.inArray(b,i,c))>-1)i.splice(c,1),e&&(c<=g&&g--,c<=h&&h--)}),this},has:function(a){return p.inArray(a,i)>-1},empty:function(){return i=[],this},disable:function(){return i=j=c=b,this},disabled:function(){return!i},lock:function(){return j=b,c||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return b=b||[],b=[a,b.slice?b.slice():b],i&&(!d||j)&&(e?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!d}};return l},p.extend({Deferred:function(a){var b=[["resolve","done",p.Callbacks("once memory"),"resolved"],["reject","fail",p.Callbacks("once memory"),"rejected"],["notify","progress",p.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return p.Deferred(function(c){p.each(b,function(b,d){var f=d[0],g=a[b];e[d[1]](p.isFunction(g)?function(){var a=g.apply(this,arguments);a&&p.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f+"With"](this===e?c:this,[a])}:c[f])}),a=null}).promise()},promise:function(a){return typeof a=="object"?p.extend(a,d):d}},e={};return d.pipe=d.then,p.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[a^1][2].disable,b[2][2].lock),e[f[0]]=g.fire,e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=k.call(arguments),d=c.length,e=d!==1||a&&p.isFunction(a.promise)?d:0,f=e===1?a:p.Deferred(),g=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?k.call(arguments):d,c===h?f.notifyWith(b,c):--e||f.resolveWith(b,c)}},h,i,j;if(d>1){h=new Array(d),i=new Array(d),j=new Array(d);for(;b<d;b++)c[b]&&p.isFunction(c[b].promise)?c[b].promise().done(g(b,j,c)).fail(f.reject).progress(g(b,i,h)):--e}return e||f.resolveWith(j,c),f.promise()}}),p.support=function(){var b,c,d,f,g,h,i,j,k,l,m,n=e.createElement("div");n.setAttribute("className","t"),n.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",c=n.getElementsByTagName("*"),d=n.getElementsByTagName("a")[0],d.style.cssText="top:1px;float:left;opacity:.5";if(!c||!c.length||!d)return{};f=e.createElement("select"),g=f.appendChild(e.createElement("option")),h=n.getElementsByTagName("input")[0],b={leadingWhitespace:n.firstChild.nodeType===3,tbody:!n.getElementsByTagName("tbody").length,htmlSerialize:!!n.getElementsByTagName("link").length,style:/top/.test(d.getAttribute("style")),hrefNormalized:d.getAttribute("href")==="/a",opacity:/^0.5/.test(d.style.opacity),cssFloat:!!d.style.cssFloat,checkOn:h.value==="on",optSelected:g.selected,getSetAttribute:n.className!=="t",enctype:!!e.createElement("form").enctype,html5Clone:e.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",boxModel:e.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},h.checked=!0,b.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,b.optDisabled=!g.disabled;try{delete n.test}catch(o){b.deleteExpando=!1}!n.addEventListener&&n.attachEvent&&n.fireEvent&&(n.attachEvent("onclick",m=function(){b.noCloneEvent=!1}),n.cloneNode(!0).fireEvent("onclick"),n.detachEvent("onclick",m)),h=e.createElement("input"),h.value="t",h.setAttribute("type","radio"),b.radioValue=h.value==="t",h.setAttribute("checked","checked"),h.setAttribute("name","t"),n.appendChild(h),i=e.createDocumentFragment(),i.appendChild(n.lastChild),b.checkClone=i.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=h.checked,i.removeChild(h),i.appendChild(n);if(n.attachEvent)for(k in{submit:!0,change:!0,focusin:!0})j="on"+k,l=j in n,l||(n.setAttribute(j,"return;"),l=typeof n[j]=="function"),b[k+"Bubbles"]=l;return p(function(){var c,d,f,g,h="padding:0;margin:0;border:0;display:block;overflow:hidden;",i=e.getElementsByTagName("body")[0];if(!i)return;c=e.createElement("div"),c.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",i.insertBefore(c,i.firstChild),d=e.createElement("div"),c.appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",f=d.getElementsByTagName("td"),f[0].style.cssText="padding:0;margin:0;border:0;display:none",l=f[0].offsetHeight===0,f[0].style.display="",f[1].style.display="none",b.reliableHiddenOffsets=l&&f[0].offsetHeight===0,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",b.boxSizing=d.offsetWidth===4,b.doesNotIncludeMarginInBodyOffset=i.offsetTop!==1,a.getComputedStyle&&(b.pixelPosition=(a.getComputedStyle(d,null)||{}).top!=="1%",b.boxSizingReliable=(a.getComputedStyle(d,null)||{width:"4px"}).width==="4px",g=e.createElement("div"),g.style.cssText=d.style.cssText=h,g.style.marginRight=g.style.width="0",d.style.width="1px",d.appendChild(g),b.reliableMarginRight=!parseFloat((a.getComputedStyle(g,null)||{}).marginRight)),typeof d.style.zoom!="undefined"&&(d.innerHTML="",d.style.cssText=h+"width:1px;padding:1px;display:inline;zoom:1",b.inlineBlockNeedsLayout=d.offsetWidth===3,d.style.display="block",d.style.overflow="visible",d.innerHTML="<div></div>",d.firstChild.style.width="5px",b.shrinkWrapBlocks=d.offsetWidth!==3,c.style.zoom=1),i.removeChild(c),c=d=f=g=null}),i.removeChild(n),c=d=f=g=h=i=n=null,b}();var H=/^(?:\{.*\}|\[.*\])$/,I=/([A-Z])/g;p.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(p.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){return a=a.nodeType?p.cache[a[p.expando]]:a[p.expando],!!a&&!K(a)},data:function(a,c,d,e){if(!p.acceptData(a))return;var f,g,h=p.expando,i=typeof c=="string",j=a.nodeType,k=j?p.cache:a,l=j?a[h]:a[h]&&h;if((!l||!k[l]||!e&&!k[l].data)&&i&&d===b)return;l||(j?a[h]=l=p.deletedIds.pop()||++p.uuid:l=h),k[l]||(k[l]={},j||(k[l].toJSON=p.noop));if(typeof c=="object"||typeof c=="function")e?k[l]=p.extend(k[l],c):k[l].data=p.extend(k[l].data,c);return f=k[l],e||(f.data||(f.data={}),f=f.data),d!==b&&(f[p.camelCase(c)]=d),i?(g=f[c],g==null&&(g=f[p.camelCase(c)])):g=f,g},removeData:function(a,b,c){if(!p.acceptData(a))return;var d,e,f,g=a.nodeType,h=g?p.cache:a,i=g?a[p.expando]:p.expando;if(!h[i])return;if(b){d=c?h[i]:h[i].data;if(d){p.isArray(b)||(b in d?b=[b]:(b=p.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,f=b.length;e<f;e++)delete d[b[e]];if(!(c?K:p.isEmptyObject)(d))return}}if(!c){delete h[i].data;if(!K(h[i]))return}g?p.cleanData([a],!0):p.support.deleteExpando||h!=h.window?delete h[i]:h[i]=null},_data:function(a,b,c){return p.data(a,b,c,!0)},acceptData:function(a){var b=a.nodeName&&p.noData[a.nodeName.toLowerCase()];return!b||b!==!0&&a.getAttribute("classid")===b}}),p.fn.extend({data:function(a,c){var d,e,f,g,h,i=this[0],j=0,k=null;if(a===b){if(this.length){k=p.data(i);if(i.nodeType===1&&!p._data(i,"parsedAttrs")){f=i.attributes;for(h=f.length;j<h;j++)g=f[j].name,g.indexOf("data-")===0&&(g=p.camelCase(g.substring(5)),J(i,g,k[g]));p._data(i,"parsedAttrs",!0)}}return k}return typeof a=="object"?this.each(function(){p.data(this,a)}):(d=a.split(".",2),d[1]=d[1]?"."+d[1]:"",e=d[1]+"!",p.access(this,function(c){if(c===b)return k=this.triggerHandler("getData"+e,[d[0]]),k===b&&i&&(k=p.data(i,a),k=J(i,a,k)),k===b&&d[1]?this.data(d[0]):k;d[1]=c,this.each(function(){var b=p(this);b.triggerHandler("setData"+e,d),p.data(this,a,c),b.triggerHandler("changeData"+e,d)})},null,c,arguments.length>1,null,!1))},removeData:function(a){return this.each(function(){p.removeData(this,a)})}}),p.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=p._data(a,b),c&&(!d||p.isArray(c)?d=p._data(a,b,p.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=p.queue(a,b),d=c.shift(),e=p._queueHooks(a,b),f=function(){p.dequeue(a,b)};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),delete e.stop,d.call(a,f,e)),!c.length&&e&&e.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return p._data(a,c)||p._data(a,c,{empty:p.Callbacks("once memory").add(function(){p.removeData(a,b+"queue",!0),p.removeData(a,c,!0)})})}}),p.fn.extend({queue:function(a,c){var d=2;return typeof a!="string"&&(c=a,a="fx",d--),arguments.length<d?p.queue(this[0],a):c===b?this:this.each(function(){var b=p.queue(this,a,c);p._queueHooks(this,a),a==="fx"&&b[0]!=="inprogress"&&p.dequeue(this,a)})},dequeue:function(a){return this.each(function(){p.dequeue(this,a)})},delay:function(a,b){return a=p.fx?p.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){var d,e=1,f=p.Deferred(),g=this,h=this.length,i=function(){--e||f.resolveWith(g,[g])};typeof a!="string"&&(c=a,a=b),a=a||"fx";while(h--)(d=p._data(g[h],a+"queueHooks"))&&d.empty&&(e++,d.empty.add(i));return i(),f.promise(c)}});var L,M,N,O=/[\t\r\n]/g,P=/\r/g,Q=/^(?:button|input)$/i,R=/^(?:button|input|object|select|textarea)$/i,S=/^a(?:rea|)$/i,T=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,U=p.support.getSetAttribute;p.fn.extend({attr:function(a,b){return p.access(this,p.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){p.removeAttr(this,a)})},prop:function(a,b){return p.access(this,p.prop,a,b,arguments.length>1)},removeProp:function(a){return a=p.propFix[a]||a,this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,f,g,h;if(p.isFunction(a))return this.each(function(b){p(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(s);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{f=" "+e.className+" ";for(g=0,h=b.length;g<h;g++)~f.indexOf(" "+b[g]+" ")||(f+=b[g]+" ");e.className=p.trim(f)}}}return this},removeClass:function(a){var c,d,e,f,g,h,i;if(p.isFunction(a))return this.each(function(b){p(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(s);for(h=0,i=this.length;h<i;h++){e=this[h];if(e.nodeType===1&&e.className){d=(" "+e.className+" ").replace(O," ");for(f=0,g=c.length;f<g;f++)while(d.indexOf(" "+c[f]+" ")>-1)d=d.replace(" "+c[f]+" "," ");e.className=a?p.trim(d):""}}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";return p.isFunction(a)?this.each(function(c){p(this).toggleClass(a.call(this,c,this.className,b),b)}):this.each(function(){if(c==="string"){var e,f=0,g=p(this),h=b,i=a.split(s);while(e=i[f++])h=d?h:!g.hasClass(e),g[h?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&p._data(this,"__className__",this.className),this.className=this.className||a===!1?"":p._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(O," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,f=this[0];if(!arguments.length){if(f)return c=p.valHooks[f.type]||p.valHooks[f.nodeName.toLowerCase()],c&&"get"in c&&(d=c.get(f,"value"))!==b?d:(d=f.value,typeof d=="string"?d.replace(P,""):d==null?"":d);return}return e=p.isFunction(a),this.each(function(d){var f,g=p(this);if(this.nodeType!==1)return;e?f=a.call(this,d,g.val()):f=a,f==null?f="":typeof f=="number"?f+="":p.isArray(f)&&(f=p.map(f,function(a){return a==null?"":a+""})),c=p.valHooks[this.type]||p.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,f,"value")===b)this.value=f})}}),p.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,f=a.selectedIndex,g=[],h=a.options,i=a.type==="select-one";if(f<0)return null;c=i?f:0,d=i?f+1:h.length;for(;c<d;c++){e=h[c];if(e.selected&&(p.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!p.nodeName(e.parentNode,"optgroup"))){b=p(e).val();if(i)return b;g.push(b)}}return i&&!g.length&&h.length?p(h[f]).val():g},set:function(a,b){var c=p.makeArray(b);return p(a).find("option").each(function(){this.selected=p.inArray(p(this).val(),c)>=0}),c.length||(a.selectedIndex=-1),c}}},attrFn:{},attr:function(a,c,d,e){var f,g,h,i=a.nodeType;if(!a||i===3||i===8||i===2)return;if(e&&p.isFunction(p.fn[c]))return p(a)[c](d);if(typeof a.getAttribute=="undefined")return p.prop(a,c,d);h=i!==1||!p.isXMLDoc(a),h&&(c=c.toLowerCase(),g=p.attrHooks[c]||(T.test(c)?M:L));if(d!==b){if(d===null){p.removeAttr(a,c);return}return g&&"set"in g&&h&&(f=g.set(a,d,c))!==b?f:(a.setAttribute(c,""+d),d)}return g&&"get"in g&&h&&(f=g.get(a,c))!==null?f:(f=a.getAttribute(c),f===null?b:f)},removeAttr:function(a,b){var c,d,e,f,g=0;if(b&&a.nodeType===1){d=b.split(s);for(;g<d.length;g++)e=d[g],e&&(c=p.propFix[e]||e,f=T.test(e),f||p.attr(a,e,""),a.removeAttribute(U?e:c),f&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(Q.test(a.nodeName)&&a.parentNode)p.error("type property can't be changed");else if(!p.support.radioValue&&b==="radio"&&p.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}},value:{get:function(a,b){return L&&p.nodeName(a,"button")?L.get(a,b):b in a?a.value:null},set:function(a,b,c){if(L&&p.nodeName(a,"button"))return L.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,f,g,h=a.nodeType;if(!a||h===3||h===8||h===2)return;return g=h!==1||!p.isXMLDoc(a),g&&(c=p.propFix[c]||c,f=p.propHooks[c]),d!==b?f&&"set"in f&&(e=f.set(a,d,c))!==b?e:a[c]=d:f&&"get"in f&&(e=f.get(a,c))!==null?e:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):R.test(a.nodeName)||S.test(a.nodeName)&&a.href?0:b}}}}),M={get:function(a,c){var d,e=p.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;return b===!1?p.removeAttr(a,c):(d=p.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase())),c}},U||(N={name:!0,id:!0,coords:!0},L=p.valHooks.button={get:function(a,c){var d;return d=a.getAttributeNode(c),d&&(N[c]?d.value!=="":d.specified)?d.value:b},set:function(a,b,c){var d=a.getAttributeNode(c);return d||(d=e.createAttribute(c),a.setAttributeNode(d)),d.value=b+""}},p.each(["width","height"],function(a,b){p.attrHooks[b]=p.extend(p.attrHooks[b],{set:function(a,c){if(c==="")return a.setAttribute(b,"auto"),c}})}),p.attrHooks.contenteditable={get:L.get,set:function(a,b,c){b===""&&(b="false"),L.set(a,b,c)}}),p.support.hrefNormalized||p.each(["href","src","width","height"],function(a,c){p.attrHooks[c]=p.extend(p.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),p.support.style||(p.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),p.support.optSelected||(p.propHooks.selected=p.extend(p.propHooks.selected,{get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}})),p.support.enctype||(p.propFix.enctype="encoding"),p.support.checkOn||p.each(["radio","checkbox"],function(){p.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),p.each(["radio","checkbox"],function(){p.valHooks[this]=p.extend(p.valHooks[this],{set:function(a,b){if(p.isArray(b))return a.checked=p.inArray(p(a).val(),b)>=0}})});var V=/^(?:textarea|input|select)$/i,W=/^([^\.]*|)(?:\.(.+)|)$/,X=/(?:^|\s)hover(\.\S+|)\b/,Y=/^key/,Z=/^(?:mouse|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=function(a){return p.event.special.hover?a:a.replace(X,"mouseenter$1 mouseleave$1")};p.event={add:function(a,c,d,e,f){var g,h,i,j,k,l,m,n,o,q,r;if(a.nodeType===3||a.nodeType===8||!c||!d||!(g=p._data(a)))return;d.handler&&(o=d,d=o.handler,f=o.selector),d.guid||(d.guid=p.guid++),i=g.events,i||(g.events=i={}),h=g.handle,h||(g.handle=h=function(a){return typeof p!="undefined"&&(!a||p.event.triggered!==a.type)?p.event.dispatch.apply(h.elem,arguments):b},h.elem=a),c=p.trim(_(c)).split(" ");for(j=0;j<c.length;j++){k=W.exec(c[j])||[],l=k[1],m=(k[2]||"").split(".").sort(),r=p.event.special[l]||{},l=(f?r.delegateType:r.bindType)||l,r=p.event.special[l]||{},n=p.extend({type:l,origType:k[1],data:e,handler:d,guid:d.guid,selector:f,namespace:m.join(".")},o),q=i[l];if(!q){q=i[l]=[],q.delegateCount=0;if(!r.setup||r.setup.call(a,e,m,h)===!1)a.addEventListener?a.addEventListener(l,h,!1):a.attachEvent&&a.attachEvent("on"+l,h)}r.add&&(r.add.call(a,n),n.handler.guid||(n.handler.guid=d.guid)),f?q.splice(q.delegateCount++,0,n):q.push(n),p.event.global[l]=!0}a=null},global:{},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,q,r=p.hasData(a)&&p._data(a);if(!r||!(m=r.events))return;b=p.trim(_(b||"")).split(" ");for(f=0;f<b.length;f++){g=W.exec(b[f])||[],h=i=g[1],j=g[2];if(!h){for(h in m)p.event.remove(a,h+b[f],c,d,!0);continue}n=p.event.special[h]||{},h=(d?n.delegateType:n.bindType)||h,o=m[h]||[],k=o.length,j=j?new RegExp("(^|\\.)"+j.split(".").sort().join("\\.(?:.*\\.|)")+"(\\.|$)"):null;for(l=0;l<o.length;l++)q=o[l],(e||i===q.origType)&&(!c||c.guid===q.guid)&&(!j||j.test(q.namespace))&&(!d||d===q.selector||d==="**"&&q.selector)&&(o.splice(l--,1),q.selector&&o.delegateCount--,n.remove&&n.remove.call(a,q));o.length===0&&k!==o.length&&((!n.teardown||n.teardown.call(a,j,r.handle)===!1)&&p.removeEvent(a,h,r.handle),delete m[h])}p.isEmptyObject(m)&&(delete r.handle,p.removeData(a,"events",!0))},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,f,g){if(!f||f.nodeType!==3&&f.nodeType!==8){var h,i,j,k,l,m,n,o,q,r,s=c.type||c,t=[];if($.test(s+p.event.triggered))return;s.indexOf("!")>=0&&(s=s.slice(0,-1),i=!0),s.indexOf(".")>=0&&(t=s.split("."),s=t.shift(),t.sort());if((!f||p.event.customEvent[s])&&!p.event.global[s])return;c=typeof c=="object"?c[p.expando]?c:new p.Event(s,c):new p.Event(s),c.type=s,c.isTrigger=!0,c.exclusive=i,c.namespace=t.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+t.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,m=s.indexOf(":")<0?"on"+s:"";if(!f){h=p.cache;for(j in h)h[j].events&&h[j].events[s]&&p.event.trigger(c,d,h[j].handle.elem,!0);return}c.result=b,c.target||(c.target=f),d=d!=null?p.makeArray(d):[],d.unshift(c),n=p.event.special[s]||{};if(n.trigger&&n.trigger.apply(f,d)===!1)return;q=[[f,n.bindType||s]];if(!g&&!n.noBubble&&!p.isWindow(f)){r=n.delegateType||s,k=$.test(r+s)?f:f.parentNode;for(l=f;k;k=k.parentNode)q.push([k,r]),l=k;l===(f.ownerDocument||e)&&q.push([l.defaultView||l.parentWindow||a,r])}for(j=0;j<q.length&&!c.isPropagationStopped();j++)k=q[j][0],c.type=q[j][1],o=(p._data(k,"events")||{})[c.type]&&p._data(k,"handle"),o&&o.apply(k,d),o=m&&k[m],o&&p.acceptData(k)&&o.apply(k,d)===!1&&c.preventDefault();return c.type=s,!g&&!c.isDefaultPrevented()&&(!n._default||n._default.apply(f.ownerDocument,d)===!1)&&(s!=="click"||!p.nodeName(f,"a"))&&p.acceptData(f)&&m&&f[s]&&(s!=="focus"&&s!=="blur"||c.target.offsetWidth!==0)&&!p.isWindow(f)&&(l=f[m],l&&(f[m]=null),p.event.triggered=s,f[s](),p.event.triggered=b,l&&(f[m]=l)),c.result}return},dispatch:function(c){c=p.event.fix(c||a.event);var d,e,f,g,h,i,j,k,l,m,n,o=(p._data(this,"events")||{})[c.type]||[],q=o.delegateCount,r=[].slice.call(arguments),s=!c.exclusive&&!c.namespace,t=p.event.special[c.type]||{},u=[];r[0]=c,c.delegateTarget=this;if(t.preDispatch&&t.preDispatch.call(this,c)===!1)return;if(q&&(!c.button||c.type!=="click")){g=p(this),g.context=this;for(f=c.target;f!=this;f=f.parentNode||this)if(f.disabled!==!0||c.type!=="click"){i={},k=[],g[0]=f;for(d=0;d<q;d++)l=o[d],m=l.selector,i[m]===b&&(i[m]=g.is(m)),i[m]&&k.push(l);k.length&&u.push({elem:f,matches:k})}}o.length>q&&u.push({elem:this,matches:o.slice(q)});for(d=0;d<u.length&&!c.isPropagationStopped();d++){j=u[d],c.currentTarget=j.elem;for(e=0;e<j.matches.length&&!c.isImmediatePropagationStopped();e++){l=j.matches[e];if(s||!c.namespace&&!l.namespace||c.namespace_re&&c.namespace_re.test(l.namespace))c.data=l.data,c.handleObj=l,h=((p.event.special[l.origType]||{}).handle||l.handler).apply(j.elem,r),h!==b&&(c.result=h,h===!1&&(c.preventDefault(),c.stopPropagation()))}}return t.postDispatch&&t.postDispatch.call(this,c),c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,c){var d,f,g,h=c.button,i=c.fromElement;return a.pageX==null&&c.clientX!=null&&(d=a.target.ownerDocument||e,f=d.documentElement,g=d.body,a.pageX=c.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=c.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?c.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0),a}},fix:function(a){if(a[p.expando])return a;var b,c,d=a,f=p.event.fixHooks[a.type]||{},g=f.props?this.props.concat(f.props):this.props;a=p.Event(d);for(b=g.length;b;)c=g[--b],a[c]=d[c];return a.target||(a.target=d.srcElement||e),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,f.filter?f.filter(a,d):a},special:{ready:{setup:p.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){p.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=p.extend(new p.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?p.event.trigger(e,null,b):p.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},p.event.handle=p.event.dispatch,p.removeEvent=e.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]=="undefined"&&(a[d]=null),a.detachEvent(d,c))},p.Event=function(a,b){if(this instanceof p.Event)a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?bb:ba):this.type=a,b&&p.extend(this,b),this.timeStamp=a&&a.timeStamp||p.now(),this[p.expando]=!0;else return new p.Event(a,b)},p.Event.prototype={preventDefault:function(){this.isDefaultPrevented=bb;var a=this.originalEvent;if(!a)return;a.preventDefault?a.preventDefault():a.returnValue=!1},stopPropagation:function(){this.isPropagationStopped=bb;var a=this.originalEvent;if(!a)return;a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=bb,this.stopPropagation()},isDefaultPrevented:ba,isPropagationStopped:ba,isImmediatePropagationStopped:ba},p.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){p.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj,g=f.selector;if(!e||e!==d&&!p.contains(d,e))a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b;return c}}}),p.support.submitBubbles||(p.event.special.submit={setup:function(){if(p.nodeName(this,"form"))return!1;p.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=p.nodeName(c,"input")||p.nodeName(c,"button")?c.form:b;d&&!p._data(d,"_submit_attached")&&(p.event.add(d,"submit._submit",function(a){a._submit_bubble=!0}),p._data(d,"_submit_attached",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&p.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){if(p.nodeName(this,"form"))return!1;p.event.remove(this,"._submit")}}),p.support.changeBubbles||(p.event.special.change={setup:function(){if(V.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")p.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),p.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),p.event.simulate("change",this,a,!0)});return!1}p.event.add(this,"beforeactivate._change",function(a){var b=a.target;V.test(b.nodeName)&&!p._data(b,"_change_attached")&&(p.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&p.event.simulate("change",this.parentNode,a,!0)}),p._data(b,"_change_attached",!0))})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){return p.event.remove(this,"._change"),V.test(this.nodeName)}}),p.support.focusinBubbles||p.each({focus:"focusin",blur:"focusout"},function(a,b){var c=0,d=function(a){p.event.simulate(b,a.target,p.event.fix(a),!0)};p.event.special[b]={setup:function(){c++===0&&e.addEventListener(a,d,!0)},teardown:function(){--c===0&&e.removeEventListener(a,d,!0)}}}),p.fn.extend({on:function(a,c,d,e,f){var g,h;if(typeof a=="object"){typeof c!="string"&&(d=d||c,c=b);for(h in a)this.on(h,c,d,a[h],f);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=ba;else if(!e)return this;return f===1&&(g=e,e=function(a){return p().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=p.guid++)),this.each(function(){p.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,c,d){var e,f;if(a&&a.preventDefault&&a.handleObj)return e=a.handleObj,p(a.delegateTarget).off(e.namespace?e.origType+"."+e.namespace:e.origType,e.selector,e.handler),this;if(typeof a=="object"){for(f in a)this.off(f,c,a[f]);return this}if(c===!1||typeof c=="function")d=c,c=b;return d===!1&&(d=ba),this.each(function(){p.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){return p(this.context).on(a,this.selector,b,c),this},die:function(a,b){return p(this.context).off(a,this.selector||"**",b),this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a||"**",c)},trigger:function(a,b){return this.each(function(){p.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return p.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||p.guid++,d=0,e=function(c){var e=(p._data(this,"lastToggle"+a.guid)||0)%d;return p._data(this,"lastToggle"+a.guid,e+1),c.preventDefault(),b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),p.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){p.fn[b]=function(a,c){return c==null&&(c=a,a=null),arguments.length>0?this.on(b,null,a,c):this.trigger(b)},Y.test(b)&&(p.event.fixHooks[b]=p.event.keyHooks),Z.test(b)&&(p.event.fixHooks[b]=p.event.mouseHooks)}),function(a,b){function bd(a,b,c,d){var e=0,f=b.length;for(;e<f;e++)Z(a,b[e],c,d)}function be(a,b,c,d,e,f){var g,h=$.setFilters[b.toLowerCase()];return h||Z.error(b),(a||!(g=e))&&bd(a||"*",d,g=[],e),g.length>0?h(g,c,f):[]}function bf(a,c,d,e,f){var g,h,i,j,k,l,m,n,p=0,q=f.length,s=L.POS,t=new RegExp("^"+s.source+"(?!"+r+")","i"),u=function(){var a=1,c=arguments.length-2;for(;a<c;a++)arguments[a]===b&&(g[a]=b)};for(;p<q;p++){s.exec(""),a=f[p],j=[],i=0,k=e;while(g=s.exec(a)){n=s.lastIndex=g.index+g[0].length;if(n>i){m=a.slice(i,g.index),i=n,l=[c],B.test(m)&&(k&&(l=k),k=e);if(h=H.test(m))m=m.slice(0,-5).replace(B,"$&*");g.length>1&&g[0].replace(t,u),k=be(m,g[1],g[2],l,k,h)}}k?(j=j.concat(k),(m=a.slice(i))&&m!==")"?B.test(m)?bd(m,j,d,e):Z(m,c,d,e?e.concat(k):k):o.apply(d,j)):Z(a,c,d,e)}return q===1?d:Z.uniqueSort(d)}function bg(a,b,c){var d,e,f,g=[],i=0,j=D.exec(a),k=!j.pop()&&!j.pop(),l=k&&a.match(C)||[""],m=$.preFilter,n=$.filter,o=!c&&b!==h;for(;(e=l[i])!=null&&k;i++){g.push(d=[]),o&&(e=" "+e);while(e){k=!1;if(j=B.exec(e))e=e.slice(j[0].length),k=d.push({part:j.pop().replace(A," "),captures:j});for(f in n)(j=L[f].exec(e))&&(!m[f]||(j=m[f](j,b,c)))&&(e=e.slice(j.shift().length),k=d.push({part:f,captures:j}));if(!k)break}}return k||Z.error(a),g}function bh(a,b,e){var f=b.dir,g=m++;return a||(a=function(a){return a===e}),b.first?function(b,c){while(b=b[f])if(b.nodeType===1)return a(b,c)&&b}:function(b,e){var h,i=g+"."+d,j=i+"."+c;while(b=b[f])if(b.nodeType===1){if((h=b[q])===j)return b.sizset;if(typeof h=="string"&&h.indexOf(i)===0){if(b.sizset)return b}else{b[q]=j;if(a(b,e))return b.sizset=!0,b;b.sizset=!1}}}}function bi(a,b){return a?function(c,d){var e=b(c,d);return e&&a(e===!0?c:e,d)}:b}function bj(a,b,c){var d,e,f=0;for(;d=a[f];f++)$.relative[d.part]?e=bh(e,$.relative[d.part],b):(d.captures.push(b,c),e=bi(e,$.filter[d.part].apply(null,d.captures)));return e}function bk(a){return function(b,c){var d,e=0;for(;d=a[e];e++)if(d(b,c))return!0;return!1}}var c,d,e,f,g,h=a.document,i=h.documentElement,j="undefined",k=!1,l=!0,m=0,n=[].slice,o=[].push,q=("sizcache"+Math.random()).replace(".",""),r="[\\x20\\t\\r\\n\\f]",s="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",t=s.replace("w","w#"),u="([*^$|!~]?=)",v="\\["+r+"*("+s+")"+r+"*(?:"+u+r+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+t+")|)|)"+r+"*\\]",w=":("+s+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|((?:[^,]|\\\\,|(?:,(?=[^\\[]*\\]))|(?:,(?=[^\\(]*\\))))*))\\)|)",x=":(nth|eq|gt|lt|first|last|even|odd)(?:\\((\\d*)\\)|)(?=[^-]|$)",y=r+"*([\\x20\\t\\r\\n\\f>+~])"+r+"*",z="(?=[^\\x20\\t\\r\\n\\f])(?:\\\\.|"+v+"|"+w.replace(2,7)+"|[^\\\\(),])+",A=new RegExp("^"+r+"+|((?:^|[^\\\\])(?:\\\\.)*)"+r+"+$","g"),B=new RegExp("^"+y),C=new RegExp(z+"?(?="+r+"*,|$)","g"),D=new RegExp("^(?:(?!,)(?:(?:^|,)"+r+"*"+z+")*?|"+r+"*(.*?))(\\)|$)"),E=new RegExp(z.slice(19,-6)+"\\x20\\t\\r\\n\\f>+~])+|"+y,"g"),F=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,G=/[\x20\t\r\n\f]*[+~]/,H=/:not\($/,I=/h\d/i,J=/input|select|textarea|button/i,K=/\\(?!\\)/g,L={ID:new RegExp("^#("+s+")"),CLASS:new RegExp("^\\.("+s+")"),NAME:new RegExp("^\\[name=['\"]?("+s+")['\"]?\\]"),TAG:new RegExp("^("+s.replace("[-","[-\\*")+")"),ATTR:new RegExp("^"+v),PSEUDO:new RegExp("^"+w),CHILD:new RegExp("^:(only|nth|last|first)-child(?:\\("+r+"*(even|odd|(([+-]|)(\\d*)n|)"+r+"*(?:([+-]|)"+r+"*(\\d+)|))"+r+"*\\)|)","i"),POS:new RegExp(x,"ig"),needsContext:new RegExp("^"+r+"*[>+~]|"+x,"i")},M={},N=[],O={},P=[],Q=function(a){return a.sizzleFilter=!0,a},R=function(a){return function(b){return b.nodeName.toLowerCase()==="input"&&b.type===a}},S=function(a){return function(b){var c=b.nodeName.toLowerCase();return(c==="input"||c==="button")&&b.type===a}},T=function(a){var b=!1,c=h.createElement("div");try{b=a(c)}catch(d){}return c=null,b},U=T(function(a){a.innerHTML="<select></select>";var b=typeof a.lastChild.getAttribute("multiple");return b!=="boolean"&&b!=="string"}),V=T(function(a){a.id=q+0,a.innerHTML="<a name='"+q+"'></a><div name='"+q+"'></div>",i.insertBefore(a,i.firstChild);var b=h.getElementsByName&&h.getElementsByName(q).length===2+h.getElementsByName(q+0).length;return g=!h.getElementById(q),i.removeChild(a),b}),W=T(function(a){return a.appendChild(h.createComment("")),a.getElementsByTagName("*").length===0}),X=T(function(a){return a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!==j&&a.firstChild.getAttribute("href")==="#"}),Y=T(function(a){return a.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",!a.getElementsByClassName||a.getElementsByClassName("e").length===0?!1:(a.lastChild.className="e",a.getElementsByClassName("e").length!==1)}),Z=function(a,b,c,d){c=c||[],b=b||h;var e,f,g,i,j=b.nodeType;if(j!==1&&j!==9)return[];if(!a||typeof a!="string")return c;g=ba(b);if(!g&&!d)if(e=F.exec(a))if(i=e[1]){if(j===9){f=b.getElementById(i);if(!f||!f.parentNode)return c;if(f.id===i)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(i))&&bb(b,f)&&f.id===i)return c.push(f),c}else{if(e[2])return o.apply(c,n.call(b.getElementsByTagName(a),0)),c;if((i=e[3])&&Y&&b.getElementsByClassName)return o.apply(c,n.call(b.getElementsByClassName(i),0)),c}return bm(a,b,c,d,g)},$=Z.selectors={cacheLength:50,match:L,order:["ID","TAG"],attrHandle:{},createPseudo:Q,find:{ID:g?function(a,b,c){if(typeof b.getElementById!==j&&!c){var d=b.getElementById(a);return d&&d.parentNode?[d]:[]}}:function(a,c,d){if(typeof c.getElementById!==j&&!d){var e=c.getElementById(a);return e?e.id===a||typeof e.getAttributeNode!==j&&e.getAttributeNode("id").value===a?[e]:b:[]}},TAG:W?function(a,b){if(typeof b.getElementsByTagName!==j)return b.getElementsByTagName(a)}:function(a,b){var c=b.getElementsByTagName(a);if(a==="*"){var d,e=[],f=0;for(;d=c[f];f++)d.nodeType===1&&e.push(d);return e}return c}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(K,""),a[3]=(a[4]||a[5]||"").replace(K,""),a[2]==="~="&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),a[1]==="nth"?(a[2]||Z.error(a[0]),a[3]=+(a[3]?a[4]+(a[5]||1):2*(a[2]==="even"||a[2]==="odd")),a[4]=+(a[6]+a[7]||a[2]==="odd")):a[2]&&Z.error(a[0]),a},PSEUDO:function(a){var b,c=a[4];return L.CHILD.test(a[0])?null:(c&&(b=D.exec(c))&&b.pop()&&(a[0]=a[0].slice(0,b[0].length-c.length-1),c=b[0].slice(0,-1)),a.splice(2,3,c||a[3]),a)}},filter:{ID:g?function(a){return a=a.replace(K,""),function(b){return b.getAttribute("id")===a}}:function(a){return a=a.replace(K,""),function(b){var c=typeof b.getAttributeNode!==j&&b.getAttributeNode("id");return c&&c.value===a}},TAG:function(a){return a==="*"?function(){return!0}:(a=a.replace(K,"").toLowerCase(),function(b){return b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var b=M[a];return b||(b=M[a]=new RegExp("(^|"+r+")"+a+"("+r+"|$)"),N.push(a),N.length>$.cacheLength&&delete M[N.shift()]),function(a){return b.test(a.className||typeof a.getAttribute!==j&&a.getAttribute("class")||"")}},ATTR:function(a,b,c){return b?function(d){var e=Z.attr(d,a),f=e+"";if(e==null)return b==="!=";switch(b){case"=":return f===c;case"!=":return f!==c;case"^=":return c&&f.indexOf(c)===0;case"*=":return c&&f.indexOf(c)>-1;case"$=":return c&&f.substr(f.length-c.length)===c;case"~=":return(" "+f+" ").indexOf(c)>-1;case"|=":return f===c||f.substr(0,c.length+1)===c+"-"}}:function(b){return Z.attr(b,a)!=null}},CHILD:function(a,b,c,d){if(a==="nth"){var e=m++;return function(a){var b,f,g=0,h=a;if(c===1&&d===0)return!0;b=a.parentNode;if(b&&(b[q]!==e||!a.sizset)){for(h=b.firstChild;h;h=h.nextSibling)if(h.nodeType===1){h.sizset=++g;if(h===a)break}b[q]=e}return f=a.sizset-d,c===0?f===0:f%c===0&&f/c>=0}}return function(b){var c=b;switch(a){case"only":case"first":while(c=c.previousSibling)if(c.nodeType===1)return!1;if(a==="first")return!0;c=b;case"last":while(c=c.nextSibling)if(c.nodeType===1)return!1;return!0}}},PSEUDO:function(a,b,c,d){var e=$.pseudos[a]||$.pseudos[a.toLowerCase()];return e||Z.error("unsupported pseudo: "+a),e.sizzleFilter?e(b,c,d):e}},pseudos:{not:Q(function(a,b,c){var d=bl(a.replace(A,"$1"),b,c);return function(a){return!d(a)}}),enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&!!a.checked||b==="option"&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},parent:function(a){return!$.pseudos.empty(a)},empty:function(a){var b;a=a.firstChild;while(a){if(a.nodeName>"@"||(b=a.nodeType)===3||b===4)return!1;a=a.nextSibling}return!0},contains:Q(function(a){return function(b){return(b.textContent||b.innerText||bc(b)).indexOf(a)>-1}}),has:Q(function(a){return function(b){return Z(a,b).length>0}}),header:function(a){return I.test(a.nodeName)},text:function(a){var b,c;return a.nodeName.toLowerCase()==="input"&&(b=a.type)==="text"&&((c=a.getAttribute("type"))==null||c.toLowerCase()===b)},radio:R("radio"),checkbox:R("checkbox"),file:R("file"),password:R("password"),image:R("image"),submit:S("submit"),reset:S("reset"),button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&a.type==="button"||b==="button"},input:function(a){return J.test(a.nodeName)},focus:function(a){var b=a.ownerDocument;return a===b.activeElement&&(!b.hasFocus||b.hasFocus())&&(!!a.type||!!a.href)},active:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b,c){return c?a.slice(1):[a[0]]},last:function(a,b,c){var d=a.pop();return c?a:[d]},even:function(a,b,c){var d=[],e=c?1:0,f=a.length;for(;e<f;e=e+2)d.push(a[e]);return d},odd:function(a,b,c){var d=[],e=c?0:1,f=a.length;for(;e<f;e=e+2)d.push(a[e]);return d},lt:function(a,b,c){return c?a.slice(+b):a.slice(0,+b)},gt:function(a,b,c){return c?a.slice(0,+b+1):a.slice(+b+1)},eq:function(a,b,c){var d=a.splice(+b,1);return c?a:d}}};$.setFilters.nth=$.setFilters.eq,$.filters=$.pseudos,X||($.attrHandle={href:function(a){return a.getAttribute("href",2)},type:function(a){return a.getAttribute("type")}}),V&&($.order.push("NAME"),$.find.NAME=function(a,b){if(typeof b.getElementsByName!==j)return b.getElementsByName(a)}),Y&&($.order.splice(1,0,"CLASS"),$.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!==j&&!c)return b.getElementsByClassName(a)});try{n.call(i.childNodes,0)[0].nodeType}catch(_){n=function(a){var b,c=[];for(;b=this[a];a++)c.push(b);return c}}var ba=Z.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?b.nodeName!=="HTML":!1},bb=Z.contains=i.compareDocumentPosition?function(a,b){return!!(a.compareDocumentPosition(b)&16)}:i.contains?function(a,b){var c=a.nodeType===9?a.documentElement:a,d=b.parentNode;return a===d||!!(d&&d.nodeType===1&&c.contains&&c.contains(d))}:function(a,b){while(b=b.parentNode)if(b===a)return!0;return!1},bc=Z.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(e===1||e===9||e===11){if(typeof a.textContent=="string")return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=bc(a)}else if(e===3||e===4)return a.nodeValue}else for(;b=a[d];d++)c+=bc(b);return c};Z.attr=function(a,b){var c,d=ba(a);return d||(b=b.toLowerCase()),$.attrHandle[b]?$.attrHandle[b](a):U||d?a.getAttribute(b):(c=a.getAttributeNode(b),c?typeof a[b]=="boolean"?a[b]?b:null:c.specified?c.value:null:null)},Z.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},[0,0].sort(function(){return l=0}),i.compareDocumentPosition?e=function(a,b){return a===b?(k=!0,0):(!a.compareDocumentPosition||!b.compareDocumentPosition?a.compareDocumentPosition:a.compareDocumentPosition(b)&4)?-1:1}:(e=function(a,b){if(a===b)return k=!0,0;if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],g=[],h=a.parentNode,i=b.parentNode,j=h;if(h===i)return f(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)g.unshift(j),j=j.parentNode;c=e.length,d=g.length;for(var l=0;l<c&&l<d;l++)if(e[l]!==g[l])return f(e[l],g[l]);return l===c?f(a,g[l],-1):f(e[l],b,1)},f=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),Z.uniqueSort=function(a){var b,c=1;if(e){k=l,a.sort(e);if(k)for(;b=a[c];c++)b===a[c-1]&&a.splice(c--,1)}return a};var bl=Z.compile=function(a,b,c){var d,e,f,g=O[a];if(g&&g.context===b)return g;e=bg(a,b,c);for(f=0;d=e[f];f++)e[f]=bj(d,b,c);return g=O[a]=bk(e),g.context=b,g.runs=g.dirruns=0,P.push(a),P.length>$.cacheLength&&delete O[P.shift()],g};Z.matches=function(a,b){return Z(a,null,null,b)},Z.matchesSelector=function(a,b){return Z(b,null,null,[a]).length>0};var bm=function(a,b,e,f,g){a=a.replace(A,"$1");var h,i,j,k,l,m,p,q,r,s=a.match(C),t=a.match(E),u=b.nodeType;if(L.POS.test(a))return bf(a,b,e,f,s);if(f)h=n.call(f,0);else if(s&&s.length===1){if(t.length>1&&u===9&&!g&&(s=L.ID.exec(t[0]))){b=$.find.ID(s[1],b,g)[0];if(!b)return e;a=a.slice(t.shift().length)}q=(s=G.exec(t[0]))&&!s.index&&b.parentNode||b,r=t.pop(),m=r.split(":not")[0];for(j=0,k=$.order.length;j<k;j++){p=$.order[j];if(s=L[p].exec(m)){h=$.find[p]((s[1]||"").replace(K,""),q,g);if(h==null)continue;m===r&&(a=a.slice(0,a.length-r.length)+m.replace(L[p],""),a||o.apply(e,n.call(h,0)));break}}}if(a){i=bl(a,b,g),d=i.dirruns++,h==null&&(h=$.find.TAG("*",G.test(a)&&b.parentNode||b));for(j=0;l=h[j];j++)c=i.runs++,i(l,b)&&e.push(l)}return e};h.querySelectorAll&&function(){var a,b=bm,c=/'|\\/g,d=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,e=[],f=[":active"],g=i.matchesSelector||i.mozMatchesSelector||i.webkitMatchesSelector||i.oMatchesSelector||i.msMatchesSelector;T(function(a){a.innerHTML="<select><option selected></option></select>",a.querySelectorAll("[selected]").length||e.push("\\["+r+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),a.querySelectorAll(":checked").length||e.push(":checked")}),T(function(a){a.innerHTML="<p test=''></p>",a.querySelectorAll("[test^='']").length&&e.push("[*^$]="+r+"*(?:\"\"|'')"),a.innerHTML="<input type='hidden'>",a.querySelectorAll(":enabled").length||e.push(":enabled",":disabled")}),e=e.length&&new RegExp(e.join("|")),bm=function(a,d,f,g,h){if(!g&&!h&&(!e||!e.test(a)))if(d.nodeType===9)try{return o.apply(f,n.call(d.querySelectorAll(a),0)),f}catch(i){}else if(d.nodeType===1&&d.nodeName.toLowerCase()!=="object"){var j=d.getAttribute("id"),k=j||q,l=G.test(a)&&d.parentNode||d;j?k=k.replace(c,"\\$&"):d.setAttribute("id",k);try{return o.apply(f,n.call(l.querySelectorAll(a.replace(C,"[id='"+k+"'] $&")),0)),f}catch(i){}finally{j||d.removeAttribute("id")}}return b(a,d,f,g,h)},g&&(T(function(b){a=g.call(b,"div");try{g.call(b,"[test!='']:sizzle"),f.push($.match.PSEUDO)}catch(c){}}),f=new RegExp(f.join("|")),Z.matchesSelector=function(b,c){c=c.replace(d,"='$1']");if(!ba(b)&&!f.test(c)&&(!e||!e.test(c)))try{var h=g.call(b,c);if(h||a||b.document&&b.document.nodeType!==11)return h}catch(i){}return Z(c,null,null,[b]).length>0})}(),Z.attr=p.attr,p.find=Z,p.expr=Z.selectors,p.expr[":"]=p.expr.pseudos,p.unique=Z.uniqueSort,p.text=Z.getText,p.isXMLDoc=Z.isXML,p.contains=Z.contains}(a);var bc=/Until$/,bd=/^(?:parents|prev(?:Until|All))/,be=/^.[^:#\[\.,]*$/,bf=p.expr.match.needsContext,bg={children:!0,contents:!0,next:!0,prev:!0};p.fn.extend({find:function(a){var b,c,d,e,f,g,h=this;if(typeof a!="string")return p(a).filter(function(){for(b=0,c=h.length;b<c;b++)if(p.contains(h[b],this))return!0});g=this.pushStack("","find",a);for(b=0,c=this.length;b<c;b++){d=g.length,p.find(a,this[b],g);if(b>0)for(e=d;e<g.length;e++)for(f=0;f<d;f++)if(g[f]===g[e]){g.splice(e--,1);break}}return g},has:function(a){var b,c=p(a,this),d=c.length;return this.filter(function(){for(b=0;b<d;b++)if(p.contains(this,c[b]))return!0})},not:function(a){return this.pushStack(bj(this,a,!1),"not",a)},filter:function(a){return this.pushStack(bj(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?bf.test(a)?p(a,this.context).index(this[0])>=0:p.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c,d=0,e=this.length,f=[],g=bf.test(a)||typeof a!="string"?p(a,b||this.context):0;for(;d<e;d++){c=this[d];while(c&&c.ownerDocument&&c!==b&&c.nodeType!==11){if(g?g.index(c)>-1:p.find.matchesSelector(c,a)){f.push(c);break}c=c.parentNode}}return f=f.length>1?p.unique(f):f,this.pushStack(f,"closest",a)},index:function(a){return a?typeof a=="string"?p.inArray(this[0],p(a)):p.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(a,b){var c=typeof a=="string"?p(a,b):p.makeArray(a&&a.nodeType?[a]:a),d=p.merge(this.get(),c);return this.pushStack(bh(c[0])||bh(d[0])?d:p.unique(d))},addBack:function(a){return this.add(a==null?this.prevObject:this.prevObject.filter(a))}}),p.fn.andSelf=p.fn.addBack,p.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return p.dir(a,"parentNode")},parentsUntil:function(a,b,c){return p.dir(a,"parentNode",c)},next:function(a){return bi(a,"nextSibling")},prev:function(a){return bi(a,"previousSibling")},nextAll:function(a){return p.dir(a,"nextSibling")},prevAll:function(a){return p.dir(a,"previousSibling")},nextUntil:function(a,b,c){return p.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return p.dir(a,"previousSibling",c)},siblings:function(a){return p.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return p.sibling(a.firstChild)},contents:function(a){return p.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:p.merge([],a.childNodes)}},function(a,b){p.fn[a]=function(c,d){var e=p.map(this,b,c);return bc.test(a)||(d=c),d&&typeof d=="string"&&(e=p.filter(d,e)),e=this.length>1&&!bg[a]?p.unique(e):e,this.length>1&&bd.test(a)&&(e=e.reverse()),this.pushStack(e,a,k.call(arguments).join(","))}}),p.extend({filter:function(a,b,c){return c&&(a=":not("+a+")"),b.length===1?p.find.matchesSelector(b[0],a)?[b[0]]:[]:p.find.matches(a,b)},dir:function(a,c,d){var e=[],f=a[c];while(f&&f.nodeType!==9&&(d===b||f.nodeType!==1||!p(f).is(d)))f.nodeType===1&&e.push(f),f=f[c];return e},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var bl="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",bm=/ jQuery\d+="(?:null|\d+)"/g,bn=/^\s+/,bo=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bp=/<([\w:]+)/,bq=/<tbody/i,br=/<|&#?\w+;/,bs=/<(?:script|style|link)/i,bt=/<(?:script|object|embed|option|style)/i,bu=new RegExp("<(?:"+bl+")[\\s/>]","i"),bv=/^(?:checkbox|radio)$/,bw=/checked\s*(?:[^=]|=\s*.checked.)/i,bx=/\/(java|ecma)script/i,by=/^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,bz={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bA=bk(e),bB=bA.appendChild(e.createElement("div"));bz.optgroup=bz.option,bz.tbody=bz.tfoot=bz.colgroup=bz.caption=bz.thead,bz.th=bz.td,p.support.htmlSerialize||(bz._default=[1,"X<div>","</div>"]),p.fn.extend({text:function(a){return p.access(this,function(a){return a===b?p.text(this):this.empty().append((this[0]&&this[0].ownerDocument||e).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(p.isFunction(a))return this.each(function(b){p(this).wrapAll(a.call(this,b))});if(this[0]){var b=p(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return p.isFunction(a)?this.each(function(b){p(this).wrapInner(a.call(this,b))}):this.each(function(){var b=p(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=p.isFunction(a);return this.each(function(c){p(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){p.nodeName(this,"body")||p(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(a,this.firstChild)})},before:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(a,this),"before",this.selector)}},after:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(this,a),"after",this.selector)}},remove:function(a,b){var c,d=0;for(;(c=this[d])!=null;d++)if(!a||p.filter(a,[c]).length)!b&&c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),p.cleanData([c])),c.parentNode&&c.parentNode.removeChild(c);return this},empty:function(){var a,b=0;for(;(a=this[b])!=null;b++){a.nodeType===1&&p.cleanData(a.getElementsByTagName("*"));while(a.firstChild)a.removeChild(a.firstChild)}return this},clone:function(a,b){return a=a==null?!1:a,b=b==null?a:b,this.map(function(){return p.clone(this,a,b)})},html:function(a){return p.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(bm,""):b;if(typeof a=="string"&&!bs.test(a)&&(p.support.htmlSerialize||!bu.test(a))&&(p.support.leadingWhitespace||!bn.test(a))&&!bz[(bp.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(bo,"<$1></$2>");try{for(;d<e;d++)c=this[d]||{},c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),c.innerHTML=a);c=0}catch(f){}}c&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(a){return bh(this[0])?this.length?this.pushStack(p(p.isFunction(a)?a():a),"replaceWith",a):this:p.isFunction(a)?this.each(function(b){var c=p(this),d=c.html();c.replaceWith(a.call(this,b,d))}):(typeof a!="string"&&(a=p(a).detach()),this.each(function(){var b=this.nextSibling,c=this.parentNode;p(this).remove(),b?p(b).before(a):p(c).append(a)}))},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){a=[].concat.apply([],a);var e,f,g,h,i=0,j=a[0],k=[],l=this.length;if(!p.support.checkClone&&l>1&&typeof j=="string"&&bw.test(j))return this.each(function(){p(this).domManip(a,c,d)});if(p.isFunction(j))return this.each(function(e){var f=p(this);a[0]=j.call(this,e,c?f.html():b),f.domManip(a,c,d)});if(this[0]){e=p.buildFragment(a,this,k),g=e.fragment,f=g.firstChild,g.childNodes.length===1&&(g=f);if(f){c=c&&p.nodeName(f,"tr");for(h=e.cacheable||l-1;i<l;i++)d.call(c&&p.nodeName(this[i],"table")?bC(this[i],"tbody"):this[i],i===h?g:p.clone(g,!0,!0))}g=f=null,k.length&&p.each(k,function(a,b){b.src?p.ajax?p.ajax({url:b.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):p.error("no ajax"):p.globalEval((b.text||b.textContent||b.innerHTML||"").replace(by,"")),b.parentNode&&b.parentNode.removeChild(b)})}return this}}),p.buildFragment=function(a,c,d){var f,g,h,i=a[0];return c=c||e,c=(c[0]||c).ownerDocument||c[0]||c,typeof c.createDocumentFragment=="undefined"&&(c=e),a.length===1&&typeof i=="string"&&i.length<512&&c===e&&i.charAt(0)==="<"&&!bt.test(i)&&(p.support.checkClone||!bw.test(i))&&(p.support.html5Clone||!bu.test(i))&&(g=!0,f=p.fragments[i],h=f!==b),f||(f=c.createDocumentFragment(),p.clean(a,c,f,d),g&&(p.fragments[i]=h&&f)),{fragment:f,cacheable:g}},p.fragments={},p.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){p.fn[a]=function(c){var d,e=0,f=[],g=p(c),h=g.length,i=this.length===1&&this[0].parentNode;if((i==null||i&&i.nodeType===11&&i.childNodes.length===1)&&h===1)return g[b](this[0]),this;for(;e<h;e++)d=(e>0?this.clone(!0):this).get(),p(g[e])[b](d),f=f.concat(d);return this.pushStack(f,a,g.selector)}}),p.extend({clone:function(a,b,c){var d,e,f,g;p.support.html5Clone||p.isXMLDoc(a)||!bu.test("<"+a.nodeName+">")?g=a.cloneNode(!0):(bB.innerHTML=a.outerHTML,bB.removeChild(g=bB.firstChild));if((!p.support.noCloneEvent||!p.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!p.isXMLDoc(a)){bE(a,g),d=bF(a),e=bF(g);for(f=0;d[f];++f)e[f]&&bE(d[f],e[f])}if(b){bD(a,g);if(c){d=bF(a),e=bF(g);for(f=0;d[f];++f)bD(d[f],e[f])}}return d=e=null,g},clean:function(a,b,c,d){var f,g,h,i,j,k,l,m,n,o,q,r,s=0,t=[];if(!b||typeof b.createDocumentFragment=="undefined")b=e;for(g=b===e&&bA;(h=a[s])!=null;s++){typeof h=="number"&&(h+="");if(!h)continue;if(typeof h=="string")if(!br.test(h))h=b.createTextNode(h);else{g=g||bk(b),l=l||g.appendChild(b.createElement("div")),h=h.replace(bo,"<$1></$2>"),i=(bp.exec(h)||["",""])[1].toLowerCase(),j=bz[i]||bz._default,k=j[0],l.innerHTML=j[1]+h+j[2];while(k--)l=l.lastChild;if(!p.support.tbody){m=bq.test(h),n=i==="table"&&!m?l.firstChild&&l.firstChild.childNodes:j[1]==="<table>"&&!m?l.childNodes:[];for(f=n.length-1;f>=0;--f)p.nodeName(n[f],"tbody")&&!n[f].childNodes.length&&n[f].parentNode.removeChild(n[f])}!p.support.leadingWhitespace&&bn.test(h)&&l.insertBefore(b.createTextNode(bn.exec(h)[0]),l.firstChild),h=l.childNodes,l=g.lastChild}h.nodeType?t.push(h):t=p.merge(t,h)}l&&(g.removeChild(l),h=l=g=null);if(!p.support.appendChecked)for(s=0;(h=t[s])!=null;s++)p.nodeName(h,"input")?bG(h):typeof h.getElementsByTagName!="undefined"&&p.grep(h.getElementsByTagName("input"),bG);if(c){q=function(a){if(!a.type||bx.test(a.type))return d?d.push(a.parentNode?a.parentNode.removeChild(a):a):c.appendChild(a)};for(s=0;(h=t[s])!=null;s++)if(!p.nodeName(h,"script")||!q(h))c.appendChild(h),typeof h.getElementsByTagName!="undefined"&&(r=p.grep(p.merge([],h.getElementsByTagName("script")),q),t.splice.apply(t,[s+1,0].concat(r)),s+=r.length)}return t},cleanData:function(a,b){var c,d,e,f,g=0,h=p.expando,i=p.cache,j=p.support.deleteExpando,k=p.event.special;for(;(e=a[g])!=null;g++)if(b||p.acceptData(e)){d=e[h],c=d&&i[d];if(c){if(c.events)for(f in c.events)k[f]?p.event.remove(e,f):p.removeEvent(e,f,c.handle);i[d]&&(delete i[d],j?delete e[h]:e.removeAttribute?e.removeAttribute(h):e[h]=null,p.deletedIds.push(d))}}}}),function(){var a,b;p.uaMatch=function(a){a=a.toLowerCase();var b=/(chrome)[ \/]([\w.]+)/.exec(a)||/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||a.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},a=p.uaMatch(g.userAgent),b={},a.browser&&(b[a.browser]=!0,b.version=a.version),b.webkit&&(b.safari=!0),p.browser=b,p.sub=function(){function a(b,c){return new a.fn.init(b,c)}p.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function c(c,d){return d&&d instanceof p&&!(d instanceof a)&&(d=a(d)),p.fn.init.call(this,c,d,b)},a.fn.init.prototype=a.fn;var b=a(e);return a}}();var bH,bI,bJ,bK=/alpha\([^)]*\)/i,bL=/opacity=([^)]*)/,bM=/^(top|right|bottom|left)$/,bN=/^margin/,bO=new RegExp("^("+q+")(.*)$","i"),bP=new RegExp("^("+q+")(?!px)[a-z%]+$","i"),bQ=new RegExp("^([-+])=("+q+")","i"),bR={},bS={position:"absolute",visibility:"hidden",display:"block"},bT={letterSpacing:0,fontWeight:400,lineHeight:1},bU=["Top","Right","Bottom","Left"],bV=["Webkit","O","Moz","ms"],bW=p.fn.toggle;p.fn.extend({css:function(a,c){return p.access(this,function(a,c,d){return d!==b?p.style(a,c,d):p.css(a,c)},a,c,arguments.length>1)},show:function(){return bZ(this,!0)},hide:function(){return bZ(this)},toggle:function(a,b){var c=typeof a=="boolean";return p.isFunction(a)&&p.isFunction(b)?bW.apply(this,arguments):this.each(function(){(c?a:bY(this))?p(this).show():p(this).hide()})}}),p.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bH(a,"opacity");return c===""?"1":c}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":p.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!a||a.nodeType===3||a.nodeType===8||!a.style)return;var f,g,h,i=p.camelCase(c),j=a.style;c=p.cssProps[i]||(p.cssProps[i]=bX(j,i)),h=p.cssHooks[c]||p.cssHooks[i];if(d===b)return h&&"get"in h&&(f=h.get(a,!1,e))!==b?f:j[c];g=typeof d,g==="string"&&(f=bQ.exec(d))&&(d=(f[1]+1)*f[2]+parseFloat(p.css(a,c)),g="number");if(d==null||g==="number"&&isNaN(d))return;g==="number"&&!p.cssNumber[i]&&(d+="px");if(!h||!("set"in h)||(d=h.set(a,d,e))!==b)try{j[c]=d}catch(k){}},css:function(a,c,d,e){var f,g,h,i=p.camelCase(c);return c=p.cssProps[i]||(p.cssProps[i]=bX(a.style,i)),h=p.cssHooks[c]||p.cssHooks[i],h&&"get"in h&&(f=h.get(a,!0,e)),f===b&&(f=bH(a,c)),f==="normal"&&c in bT&&(f=bT[c]),d||e!==b?(g=parseFloat(f),d||p.isNumeric(g)?g||0:f):f},swap:function(a,b,c){var d,e,f={};for(e in b)f[e]=a.style[e],a.style[e]=b[e];d=c.call(a);for(e in b)a.style[e]=f[e];return d}}),a.getComputedStyle?bH=function(a,b){var c,d,e,f,g=getComputedStyle(a,null),h=a.style;return g&&(c=g[b],c===""&&!p.contains(a.ownerDocument.documentElement,a)&&(c=p.style(a,b)),bP.test(c)&&bN.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=c,c=g.width,h.width=d,h.minWidth=e,h.maxWidth=f)),c}:e.documentElement.currentStyle&&(bH=function(a,b){var c,d,e=a.currentStyle&&a.currentStyle[b],f=a.style;return e==null&&f&&f[b]&&(e=f[b]),bP.test(e)&&!bM.test(b)&&(c=f.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":e,e=f.pixelLeft+"px",f.left=c,d&&(a.runtimeStyle.left=d)),e===""?"auto":e}),p.each(["height","width"],function(a,b){p.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0||bH(a,"display")!=="none"?ca(a,b,d):p.swap(a,bS,function(){return ca(a,b,d)})},set:function(a,c,d){return b$(a,c,d?b_(a,b,d,p.support.boxSizing&&p.css(a,"boxSizing")==="border-box"):0)}}}),p.support.opacity||(p.cssHooks.opacity={get:function(a,b){return bL.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=p.isNumeric(b)?"alpha(opacity="+b*100+")":"",f=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&p.trim(f.replace(bK,""))===""&&c.removeAttribute){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bK.test(f)?f.replace(bK,e):f+" "+e}}),p(function(){p.support.reliableMarginRight||(p.cssHooks.marginRight={get:function(a,b){return p.swap(a,{display:"inline-block"},function(){if(b)return bH(a,"marginRight")})}}),!p.support.pixelPosition&&p.fn.position&&p.each(["top","left"],function(a,b){p.cssHooks[b]={get:function(a,c){if(c){var d=bH(a,b);return bP.test(d)?p(a).position()[b]+"px":d}}}})}),p.expr&&p.expr.filters&&(p.expr.filters.hidden=function(a){return a.offsetWidth===0&&a.offsetHeight===0||!p.support.reliableHiddenOffsets&&(a.style&&a.style.display||bH(a,"display"))==="none"},p.expr.filters.visible=function(a){return!p.expr.filters.hidden(a)}),p.each({margin:"",padding:"",border:"Width"},function(a,b){p.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bU[d]+b]=e[d]||e[d-2]||e[0];return f}},bN.test(a)||(p.cssHooks[a+b].set=b$)});var cc=/%20/g,cd=/\[\]$/,ce=/\r?\n/g,cf=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,cg=/^(?:select|textarea)/i;p.fn.extend({serialize:function(){return p.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?p.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||cg.test(this.nodeName)||cf.test(this.type))}).map(function(a,b){var c=p(this).val();return c==null?null:p.isArray(c)?p.map(c,function(a,c){return{name:b.name,value:a.replace(ce,"\r\n")}}):{name:b.name,value:c.replace(ce,"\r\n")}}).get()}}),p.param=function(a,c){var d,e=[],f=function(a,b){b=p.isFunction(b)?b():b==null?"":b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=p.ajaxSettings&&p.ajaxSettings.traditional);if(p.isArray(a)||a.jquery&&!p.isPlainObject(a))p.each(a,function(){f(this.name,this.value)});else for(d in a)ch(d,a[d],c,f);return e.join("&").replace(cc,"+")};var ci,cj,ck=/#.*$/,cl=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,cm=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,cn=/^(?:GET|HEAD)$/,co=/^\/\//,cp=/\?/,cq=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,cr=/([?&])_=[^&]*/,cs=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,ct=p.fn.load,cu={},cv={},cw=["*/"]+["*"];try{ci=f.href}catch(cx){ci=e.createElement("a"),ci.href="",ci=ci.href}cj=cs.exec(ci.toLowerCase())||[],p.fn.load=function(a,c,d){if(typeof a!="string"&&ct)return ct.apply(this,arguments);if(!this.length)return this;var e,f,g,h=this,i=a.indexOf(" ");return i>=0&&(e=a.slice(i,a.length),a=a.slice(0,i)),p.isFunction(c)?(d=c,c=b):typeof c=="object"&&(f="POST"),p.ajax({url:a,type:f,dataType:"html",data:c,complete:function(a,b){d&&h.each(d,g||[a.responseText,b,a])}}).done(function(a){g=arguments,h.html(e?p("<div>").append(a.replace(cq,"")).find(e):a)}),this},p.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){p.fn[b]=function(a){return this.on(b,a)}}),p.each(["get","post"],function(a,c){p[c]=function(a,d,e,f){return p.isFunction(d)&&(f=f||e,e=d,d=b),p.ajax({type:c,url:a,data:d,success:e,dataType:f})}}),p.extend({getScript:function(a,c){return p.get(a,b,c,"script")},getJSON:function(a,b,c){return p.get(a,b,c,"json")},ajaxSetup:function(a,b){return b?cA(a,p.ajaxSettings):(b=a,a=p.ajaxSettings),cA(a,b),a},ajaxSettings:{url:ci,isLocal:cm.test(cj[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":cw},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":p.parseJSON,"text xml":p.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:cy(cu),ajaxTransport:cy(cv),ajax:function(a,c){function y(a,c,f,i){var k,s,t,u,w,y=c;if(v===2)return;v=2,h&&clearTimeout(h),g=b,e=i||"",x.readyState=a>0?4:0,f&&(u=cB(l,x,f));if(a>=200&&a<300||a===304)l.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(p.lastModified[d]=w),w=x.getResponseHeader("Etag"),w&&(p.etag[d]=w)),a===304?(y="notmodified",k=!0):(k=cC(l,u),y=k.state,s=k.data,t=k.error,k=!t);else{t=y;if(!y||a)y="error",a<0&&(a=0)}x.status=a,x.statusText=""+(c||y),k?o.resolveWith(m,[s,y,x]):o.rejectWith(m,[x,y,t]),x.statusCode(r),r=b,j&&n.trigger("ajax"+(k?"Success":"Error"),[x,l,k?s:t]),q.fireWith(m,[x,y]),j&&(n.trigger("ajaxComplete",[x,l]),--p.active||p.event.trigger("ajaxStop"))}typeof a=="object"&&(c=a,a=b),c=c||{};var d,e,f,g,h,i,j,k,l=p.ajaxSetup({},c),m=l.context||l,n=m!==l&&(m.nodeType||m instanceof p)?p(m):p.event,o=p.Deferred(),q=p.Callbacks("once memory"),r=l.statusCode||{},t={},u={},v=0,w="canceled",x={readyState:0,setRequestHeader:function(a,b){if(!v){var c=a.toLowerCase();a=u[c]=u[c]||a,t[a]=b}return this},getAllResponseHeaders:function(){return v===2?e:null},getResponseHeader:function(a){var c;if(v===2){if(!f){f={};while(c=cl.exec(e))f[c[1].toLowerCase()]=c[2]}c=f[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){return v||(l.mimeType=a),this},abort:function(a){return a=a||w,g&&g.abort(a),y(0,a),this}};o.promise(x),x.success=x.done,x.error=x.fail,x.complete=q.add,x.statusCode=function(a){if(a){var b;if(v<2)for(b in a)r[b]=[r[b],a[b]];else b=a[x.status],x.always(b)}return this},l.url=((a||l.url)+"").replace(ck,"").replace(co,cj[1]+"//"),l.dataTypes=p.trim(l.dataType||"*").toLowerCase().split(s),l.crossDomain==null&&(i=cs.exec(l.url.toLowerCase()),l.crossDomain=!(!i||i[1]==cj[1]&&i[2]==cj[2]&&(i[3]||(i[1]==="http:"?80:443))==(cj[3]||(cj[1]==="http:"?80:443)))),l.data&&l.processData&&typeof l.data!="string"&&(l.data=p.param(l.data,l.traditional)),cz(cu,l,c,x);if(v===2)return x;j=l.global,l.type=l.type.toUpperCase(),l.hasContent=!cn.test(l.type),j&&p.active++===0&&p.event.trigger("ajaxStart");if(!l.hasContent){l.data&&(l.url+=(cp.test(l.url)?"&":"?")+l.data,delete l.data),d=l.url;if(l.cache===!1){var z=p.now(),A=l.url.replace(cr,"$1_="+z);l.url=A+(A===l.url?(cp.test(l.url)?"&":"?")+"_="+z:"")}}(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",l.contentType),l.ifModified&&(d=d||l.url,p.lastModified[d]&&x.setRequestHeader("If-Modified-Since",p.lastModified[d]),p.etag[d]&&x.setRequestHeader("If-None-Match",p.etag[d])),x.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+(l.dataTypes[0]!=="*"?", "+cw+"; q=0.01":""):l.accepts["*"]);for(k in l.headers)x.setRequestHeader(k,l.headers[k]);if(!l.beforeSend||l.beforeSend.call(m,x,l)!==!1&&v!==2){w="abort";for(k in{success:1,error:1,complete:1})x[k](l[k]);g=cz(cv,l,c,x);if(!g)y(-1,"No Transport");else{x.readyState=1,j&&n.trigger("ajaxSend",[x,l]),l.async&&l.timeout>0&&(h=setTimeout(function(){x.abort("timeout")},l.timeout));try{v=1,g.send(t,y)}catch(B){if(v<2)y(-1,B);else throw B}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var cD=[],cE=/\?/,cF=/(=)\?(?=&|$)|\?\?/,cG=p.now();p.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=cD.pop()||p.expando+"_"+cG++;return this[a]=!0,a}}),p.ajaxPrefilter("json jsonp",function(c,d,e){var f,g,h,i=c.data,j=c.url,k=c.jsonp!==!1,l=k&&cF.test(j),m=k&&!l&&typeof i=="string"&&!(c.contentType||"").indexOf("application/x-www-form-urlencoded")&&cF.test(i);if(c.dataTypes[0]==="jsonp"||l||m)return f=c.jsonpCallback=p.isFunction(c.jsonpCallback)?c.jsonpCallback():c.jsonpCallback,g=a[f],l?c.url=j.replace(cF,"$1"+f):m?c.data=i.replace(cF,"$1"+f):k&&(c.url+=(cE.test(j)?"&":"?")+c.jsonp+"="+f),c.converters["script json"]=function(){return h||p.error(f+" was not called"),h[0]},c.dataTypes[0]="json",a[f]=function(){h=arguments},e.always(function(){a[f]=g,c[f]&&(c.jsonpCallback=d.jsonpCallback,cD.push(f)),h&&p.isFunction(g)&&g(h[0]),h=g=b}),"script"}),p.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){return p.globalEval(a),a}}}),p.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),p.ajaxTransport("script",function(a){if(a.crossDomain){var c,d=e.head||e.getElementsByTagName("head")[0]||e.documentElement;return{send:function(f,g){c=e.createElement("script"),c.async="async",a.scriptCharset&&(c.charset=a.scriptCharset),c.src=a.url,c.onload=c.onreadystatechange=function(a,e){if(e||!c.readyState||/loaded|complete/.test(c.readyState))c.onload=c.onreadystatechange=null,d&&c.parentNode&&d.removeChild(c),c=b,e||g(200,"success")},d.insertBefore(c,d.firstChild)},abort:function(){c&&c.onload(0,1)}}}});var cH,cI=a.ActiveXObject?function(){for(var a in cH)cH[a](0,1)}:!1,cJ=0;p.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&cK()||cL()}:cK,function(a){p.extend(p.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(p.ajaxSettings.xhr()),p.support.ajax&&p.ajaxTransport(function(c){if(!c.crossDomain||p.support.cors){var d;return{send:function(e,f){var g,h,i=c.xhr();c.username?i.open(c.type,c.url,c.async,c.username,c.password):i.open(c.type,c.url,c.async);if(c.xhrFields)for(h in c.xhrFields)i[h]=c.xhrFields[h];c.mimeType&&i.overrideMimeType&&i.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(h in e)i.setRequestHeader(h,e[h])}catch(j){}i.send(c.hasContent&&c.data||null),d=function(a,e){var h,j,k,l,m;try{if(d&&(e||i.readyState===4)){d=b,g&&(i.onreadystatechange=p.noop,cI&&delete cH[g]);if(e)i.readyState!==4&&i.abort();else{h=i.status,k=i.getAllResponseHeaders(),l={},m=i.responseXML,m&&m.documentElement&&(l.xml=m);try{l.text=i.responseText}catch(a){}try{j=i.statusText}catch(n){j=""}!h&&c.isLocal&&!c.crossDomain?h=l.text?200:404:h===1223&&(h=204)}}}catch(o){e||f(-1,o)}l&&f(h,j,l,k)},c.async?i.readyState===4?setTimeout(d,0):(g=++cJ,cI&&(cH||(cH={},p(a).unload(cI)),cH[g]=d),i.onreadystatechange=d):d()},abort:function(){d&&d(0,1)}}}});var cM,cN,cO=/^(?:toggle|show|hide)$/,cP=new RegExp("^(?:([-+])=|)("+q+")([a-z%]*)$","i"),cQ=/queueHooks$/,cR=[cX],cS={"*":[function(a,b){var c,d,e,f=this.createTween(a,b),g=cP.exec(b),h=f.cur(),i=+h||0,j=1;if(g){c=+g[2],d=g[3]||(p.cssNumber[a]?"":"px");if(d!=="px"&&i){i=p.css(f.elem,a,!0)||c||1;do e=j=j||".5",i=i/j,p.style(f.elem,a,i+d),j=f.cur()/h;while(j!==1&&j!==e)}f.unit=d,f.start=i,f.end=g[1]?i+(g[1]+1)*c:c}return f}]};p.Animation=p.extend(cV,{tweener:function(a,b){p.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");var c,d=0,e=a.length;for(;d<e;d++)c=a[d],cS[c]=cS[c]||[],cS[c].unshift(b)},prefilter:function(a,b){b?cR.unshift(a):cR.push(a)}}),p.Tween=cY,cY.prototype={constructor:cY,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(p.cssNumber[c]?"":"px")},cur:function(){var a=cY.propHooks[this.prop];return a&&a.get?a.get(this):cY.propHooks._default.get(this)},run:function(a){var b,c=cY.propHooks[this.prop];return this.pos=b=p.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration),this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):cY.propHooks._default.set(this),this}},cY.prototype.init.prototype=cY.prototype,cY.propHooks={_default:{get:function(a){var b;return a.elem[a.prop]==null||!!a.elem.style&&a.elem.style[a.prop]!=null?(b=p.css(a.elem,a.prop,!1,""),!b||b==="auto"?0:b):a.elem[a.prop]},set:function(a){p.fx.step[a.prop]?p.fx.step[a.prop](a):a.elem.style&&(a.elem.style[p.cssProps[a.prop]]!=null||p.cssHooks[a.prop])?p.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},cY.propHooks.scrollTop=cY.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},p.each(["toggle","show","hide"],function(a,b){var c=p.fn[b];p.fn[b]=function(d,e,f){return d==null||typeof d=="boolean"||!a&&p.isFunction(d)&&p.isFunction(e)?c.apply(this,arguments):this.animate(cZ(b,!0),d,e,f)}}),p.fn.extend({fadeTo:function(a,b,c,d){return this.filter(bY).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=p.isEmptyObject(a),f=p.speed(b,c,d),g=function(){var b=cV(this,p.extend({},a),f);e&&b.stop(!0)};return e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,c,d){var e=function(a){var b=a.stop;delete a.stop,b(d)};return typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,c=a!=null&&a+"queueHooks",f=p.timers,g=p._data(this);if(c)g[c]&&g[c].stop&&e(g[c]);else for(c in g)g[c]&&g[c].stop&&cQ.test(c)&&e(g[c]);for(c=f.length;c--;)f[c].elem===this&&(a==null||f[c].queue===a)&&(f[c].anim.stop(d),b=!1,f.splice(c,1));(b||!d)&&p.dequeue(this,a)})}}),p.each({slideDown:cZ("show"),slideUp:cZ("hide"),slideToggle:cZ("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){p.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),p.speed=function(a,b,c){var d=a&&typeof a=="object"?p.extend({},a):{complete:c||!c&&b||p.isFunction(a)&&a,duration:a,easing:c&&b||b&&!p.isFunction(b)&&b};d.duration=p.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in p.fx.speeds?p.fx.speeds[d.duration]:p.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";return d.old=d.complete,d.complete=function(){p.isFunction(d.old)&&d.old.call(this),d.queue&&p.dequeue(this,d.queue)},d},p.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},p.timers=[],p.fx=cY.prototype.init,p.fx.tick=function(){var a,b=p.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||p.fx.stop()},p.fx.timer=function(a){a()&&p.timers.push(a)&&!cN&&(cN=setInterval(p.fx.tick,p.fx.interval))},p.fx.interval=13,p.fx.stop=function(){clearInterval(cN),cN=null},p.fx.speeds={slow:600,fast:200,_default:400},p.fx.step={},p.expr&&p.expr.filters&&(p.expr.filters.animated=function(a){return p.grep(p.timers,function(b){return a===b.elem}).length});var c$=/^(?:body|html)$/i;p.fn.offset=function(a){if(arguments.length)return a===b?this:this.each(function(b){p.offset.setOffset(this,a,b)});var c,d,e,f,g,h,i,j,k,l,m=this[0],n=m&&m.ownerDocument;if(!n)return;return(e=n.body)===m?p.offset.bodyOffset(m):(d=n.documentElement,p.contains(d,m)?(c=m.getBoundingClientRect(),f=c_(n),g=d.clientTop||e.clientTop||0,h=d.clientLeft||e.clientLeft||0,i=f.pageYOffset||d.scrollTop,j=f.pageXOffset||d.scrollLeft,k=c.top+i-g,l=c.left+j-h,{top:k,left:l}):{top:0,left:0})},p.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;return p.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(p.css(a,"marginTop"))||0,c+=parseFloat(p.css(a,"marginLeft"))||0),{top:b,left:c}},setOffset:function(a,b,c){var d=p.css(a,"position");d==="static"&&(a.style.position="relative");var e=p(a),f=e.offset(),g=p.css(a,"top"),h=p.css(a,"left"),i=(d==="absolute"||d==="fixed")&&p.inArray("auto",[g,h])>-1,j={},k={},l,m;i?(k=e.position(),l=k.top,m=k.left):(l=parseFloat(g)||0,m=parseFloat(h)||0),p.isFunction(b)&&(b=b.call(a,c,f)),b.top!=null&&(j.top=b.top-f.top+l),b.left!=null&&(j.left=b.left-f.left+m),"using"in b?b.using.call(a,j):e.css(j)}},p.fn.extend({position:function(){if(!this[0])return;var a=this[0],b=this.offsetParent(),c=this.offset(),d=c$.test(b[0].nodeName)?{top:0,left:0}:b.offset();return c.top-=parseFloat(p.css(a,"marginTop"))||0,c.left-=parseFloat(p.css(a,"marginLeft"))||0,d.top+=parseFloat(p.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(p.css(b[0],"borderLeftWidth"))||0,{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||e.body;while(a&&!c$.test(a.nodeName)&&p.css(a,"position")==="static")a=a.offsetParent;return a||e.body})}}),p.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);p.fn[a]=function(e){return p.access(this,function(a,e,f){var g=c_(a);if(f===b)return g?c in g?g[c]:g.document.documentElement[e]:a[e];g?g.scrollTo(d?p(g).scrollLeft():f,d?f:p(g).scrollTop()):a[e]=f},a,e,arguments.length,null)}}),p.each({Height:"height",Width:"width"},function(a,c){p.each({padding:"inner"+a,content:c,"":"outer"+a},function(d,e){p.fn[e]=function(e,f){var g=arguments.length&&(d||typeof e!="boolean"),h=d||(e===!0||f===!0?"margin":"border");return p.access(this,function(c,d,e){var f;return p.isWindow(c)?c.document.documentElement["client"+a]:c.nodeType===9?(f=c.documentElement,Math.max(c.body["scroll"+a],f["scroll"+a],c.body["offset"+a],f["offset"+a],f["client"+a])):e===b?p.css(c,d,e,h):p.style(c,d,e,h)},c,g?e:b,g)}})}),a.jQuery=a.$=p,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return p})})(window);`)
+
+func third_partySwaggerUiLibJquery180MinJsBytes() ([]byte, error) {
+	return _third_partySwaggerUiLibJquery180MinJs, nil
+}
+
+func third_partySwaggerUiLibJquery180MinJs() (*asset, error) {
+	bytes, err := third_partySwaggerUiLibJquery180MinJsBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/lib/jquery-1.8.0.min.js", size: 92556, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiLibJqueryBaBbqMinJs = []byte(`/*
+ * jQuery BBQ: Back Button & Query Library - v1.2.1 - 2/17/2010
+ * http://benalman.com/projects/jquery-bbq-plugin/
+ * 
+ * Copyright (c) 2010 "Cowboy" Ben Alman
+ * Dual licensed under the MIT and GPL licenses.
+ * http://benalman.com/about/license/
+ */
+(function($,p){var i,m=Array.prototype.slice,r=decodeURIComponent,a=$.param,c,l,v,b=$.bbq=$.bbq||{},q,u,j,e=$.event.special,d="hashchange",A="querystring",D="fragment",y="elemUrlAttr",g="location",k="href",t="src",x=/^.*\?|#.*$/g,w=/^.*\#/,h,C={};function E(F){return typeof F==="string"}function B(G){var F=m.call(arguments,1);return function(){return G.apply(this,F.concat(m.call(arguments)))}}function n(F){return F.replace(/^[^#]*#?(.*)$/,"$1")}function o(F){return F.replace(/(?:^[^?#]*\?([^#]*).*$)?.*/,"$1")}function f(H,M,F,I,G){var O,L,K,N,J;if(I!==i){K=F.match(H?/^([^#]*)\#?(.*)$/:/^([^#?]*)\??([^#]*)(#?.*)/);J=K[3]||"";if(G===2&&E(I)){L=I.replace(H?w:x,"")}else{N=l(K[2]);I=E(I)?l[H?D:A](I):I;L=G===2?I:G===1?$.extend({},I,N):$.extend({},N,I);L=a(L);if(H){L=L.replace(h,r)}}O=K[1]+(H?"#":L||!K[1]?"?":"")+L+J}else{O=M(F!==i?F:p[g][k])}return O}a[A]=B(f,0,o);a[D]=c=B(f,1,n);c.noEscape=function(G){G=G||"";var F=$.map(G.split(""),encodeURIComponent);h=new RegExp(F.join("|"),"g")};c.noEscape(",/");$.deparam=l=function(I,F){var H={},G={"true":!0,"false":!1,"null":null};$.each(I.replace(/\+/g," ").split("&"),function(L,Q){var K=Q.split("="),P=r(K[0]),J,O=H,M=0,R=P.split("]["),N=R.length-1;if(/\[/.test(R[0])&&/\]$/.test(R[N])){R[N]=R[N].replace(/\]$/,"");R=R.shift().split("[").concat(R);N=R.length-1}else{N=0}if(K.length===2){J=r(K[1]);if(F){J=J&&!isNaN(J)?+J:J==="undefined"?i:G[J]!==i?G[J]:J}if(N){for(;M<=N;M++){P=R[M]===""?O.length:R[M];O=O[P]=M<N?O[P]||(R[M+1]&&isNaN(R[M+1])?{}:[]):J}}else{if($.isArray(H[P])){H[P].push(J)}else{if(H[P]!==i){H[P]=[H[P],J]}else{H[P]=J}}}}else{if(P){H[P]=F?i:""}}});return H};function z(H,F,G){if(F===i||typeof F==="boolean"){G=F;F=a[H?D:A]()}else{F=E(F)?F.replace(H?w:x,""):F}return l(F,G)}l[A]=B(z,0);l[D]=v=B(z,1);$[y]||($[y]=function(F){return $.extend(C,F)})({a:k,base:k,iframe:t,img:t,input:t,form:"action",link:k,script:t});j=$[y];function s(I,G,H,F){if(!E(H)&&typeof H!=="object"){F=H;H=G;G=i}return this.each(function(){var L=$(this),J=G||j()[(this.nodeName||"").toLowerCase()]||"",K=J&&L.attr(J)||"";L.attr(J,a[I](K,H,F))})}$.fn[A]=B(s,A);$.fn[D]=B(s,D);b.pushState=q=function(I,F){if(E(I)&&/^#/.test(I)&&F===i){F=2}var H=I!==i,G=c(p[g][k],H?I:{},H?F:2);p[g][k]=G+(/#/.test(G)?"":"#")};b.getState=u=function(F,G){return F===i||typeof F==="boolean"?v(F):v(G)[F]};b.removeState=function(F){var G={};if(F!==i){G=u();$.each($.isArray(F)?F:arguments,function(I,H){delete G[H]})}q(G,2)};e[d]=$.extend(e[d],{add:function(F){var H;function G(J){var I=J[D]=c();J.getState=function(K,L){return K===i||typeof K==="boolean"?l(I,K):l(I,L)[K]};H.apply(this,arguments)}if($.isFunction(F)){H=F;return G}else{H=F.handler;F.handler=G}}})})(jQuery,this);
+/*
+ * jQuery hashchange event - v1.2 - 2/11/2010
+ * http://benalman.com/projects/jquery-hashchange-plugin/
+ * 
+ * Copyright (c) 2010 "Cowboy" Ben Alman
+ * Dual licensed under the MIT and GPL licenses.
+ * http://benalman.com/about/license/
+ */
+(function($,i,b){var j,k=$.event.special,c="location",d="hashchange",l="href",f=$.browser,g=document.documentMode,h=f.msie&&(g===b||g<8),e="on"+d in i&&!h;function a(m){m=m||i[c][l];return m.replace(/^[^#]*#?(.*)$/,"$1")}$[d+"Delay"]=100;k[d]=$.extend(k[d],{setup:function(){if(e){return false}$(j.start)},teardown:function(){if(e){return false}$(j.stop)}});j=(function(){var m={},r,n,o,q;function p(){o=q=function(s){return s};if(h){n=$('<iframe src="javascript:0"/>').hide().insertAfter("body")[0].contentWindow;q=function(){return a(n.document[c][l])};o=function(u,s){if(u!==s){var t=n.document;t.open().close();t[c].hash="#"+u}};o(a())}}m.start=function(){if(r){return}var t=a();o||p();(function s(){var v=a(),u=q(t);if(v!==t){o(t=v,u);$(i).trigger(d)}else{if(u!==t){i[c][l]=i[c][l].replace(/#.*/,"")+"#"+u}}r=setTimeout(s,$[d+"Delay"])})()};m.stop=function(){if(!n){r&&clearTimeout(r);r=0}};return m})()})(jQuery,this);`)
+
+func third_partySwaggerUiLibJqueryBaBbqMinJsBytes() ([]byte, error) {
+	return _third_partySwaggerUiLibJqueryBaBbqMinJs, nil
+}
+
+func third_partySwaggerUiLibJqueryBaBbqMinJs() (*asset, error) {
+	bytes, err := third_partySwaggerUiLibJqueryBaBbqMinJsBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/lib/jquery.ba-bbq.min.js", size: 4119, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiLibJquerySlidetoMinJs = []byte(`(function(b){b.fn.slideto=function(a){a=b.extend({slide_duration:"slow",highlight_duration:3E3,highlight:true,highlight_color:"#FFFF99"},a);return this.each(function(){obj=b(this);b("body").animate({scrollTop:obj.offset().top},a.slide_duration,function(){a.highlight&&b.ui.version&&obj.effect("highlight",{color:a.highlight_color},a.highlight_duration)})})}})(jQuery);
+`)
+
+func third_partySwaggerUiLibJquerySlidetoMinJsBytes() ([]byte, error) {
+	return _third_partySwaggerUiLibJquerySlidetoMinJs, nil
+}
+
+func third_partySwaggerUiLibJquerySlidetoMinJs() (*asset, error) {
+	bytes, err := third_partySwaggerUiLibJquerySlidetoMinJsBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/lib/jquery.slideto.min.js", size: 369, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiLibJqueryWiggleMinJs = []byte(`/*
+jQuery Wiggle
+Author: WonderGroup, Jordan Thomas
+URL: http://labs.wondergroup.com/demos/mini-ui/index.html
+License: MIT (http://en.wikipedia.org/wiki/MIT_License)
+*/
+jQuery.fn.wiggle=function(o){var d={speed:50,wiggles:3,travel:5,callback:null};var o=jQuery.extend(d,o);return this.each(function(){var cache=this;var wrap=jQuery(this).wrap('<div class="wiggle-wrap"></div>').css("position","relative");var calls=0;for(i=1;i<=o.wiggles;i++){jQuery(this).animate({left:"-="+o.travel},o.speed).animate({left:"+="+o.travel*2},o.speed*2).animate({left:"-="+o.travel},o.speed,function(){calls++;if(jQuery(cache).parent().hasClass('wiggle-wrap')){jQuery(cache).parent().replaceWith(cache);}
+if(calls==o.wiggles&&jQuery.isFunction(o.callback)){o.callback();}});}});};`)
+
+func third_partySwaggerUiLibJqueryWiggleMinJsBytes() ([]byte, error) {
+	return _third_partySwaggerUiLibJqueryWiggleMinJs, nil
+}
+
+func third_partySwaggerUiLibJqueryWiggleMinJs() (*asset, error) {
+	bytes, err := third_partySwaggerUiLibJqueryWiggleMinJsBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/lib/jquery.wiggle.min.js", size: 762, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiLibMarkedJs = []byte(`/**
+ * marked - a markdown parser
+ * Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed)
+ * https://github.com/chjj/marked
+ */
+
+;(function() {
+
+/**
+ * Block-Level Grammar
+ */
+
+var block = {
+  newline: /^\n+/,
+  code: /^( {4}[^\n]+\n*)+/,
+  fences: noop,
+  hr: /^( *[-*_]){3,} *(?:\n+|$)/,
+  heading: /^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,
+  nptable: noop,
+  lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,
+  blockquote: /^( *>[^\n]+(\n(?!def)[^\n]+)*\n*)+/,
+  list: /^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
+  html: /^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,
+  def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,
+  table: noop,
+  paragraph: /^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,
+  text: /^[^\n]+/
+};
+
+block.bullet = /(?:[*+-]|\d+\.)/;
+block.item = /^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;
+block.item = replace(block.item, 'gm')
+  (/bull/g, block.bullet)
+  ();
+
+block.list = replace(block.list)
+  (/bull/g, block.bullet)
+  ('hr', '\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))')
+  ('def', '\\n+(?=' + block.def.source + ')')
+  ();
+
+block.blockquote = replace(block.blockquote)
+  ('def', block.def)
+  ();
+
+block._tag = '(?!(?:'
+  + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code'
+  + '|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo'
+  + '|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b';
+
+block.html = replace(block.html)
+  ('comment', /<!--[\s\S]*?-->/)
+  ('closed', /<(tag)[\s\S]+?<\/\1>/)
+  ('closing', /<tag(?:"[^"]*"|'[^']*'|[^'">])*?>/)
+  (/tag/g, block._tag)
+  ();
+
+block.paragraph = replace(block.paragraph)
+  ('hr', block.hr)
+  ('heading', block.heading)
+  ('lheading', block.lheading)
+  ('blockquote', block.blockquote)
+  ('tag', '<' + block._tag)
+  ('def', block.def)
+  ();
+
+/**
+ * Normal Block Grammar
+ */
+
+block.normal = merge({}, block);
+
+/**
+ * GFM Block Grammar
+ */
+
+block.gfm = merge({}, block.normal, {
+  fences: /^ *(` + "`" + `{3,}|~{3,}) *(\S+)? *\n([\s\S]+?)\s*\1 *(?:\n+|$)/,
+  paragraph: /^/
+});
+
+block.gfm.paragraph = replace(block.paragraph)
+  ('(?!', '(?!'
+    + block.gfm.fences.source.replace('\\1', '\\2') + '|'
+    + block.list.source.replace('\\1', '\\3') + '|')
+  ();
+
+/**
+ * GFM + Tables Block Grammar
+ */
+
+block.tables = merge({}, block.gfm, {
+  nptable: /^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,
+  table: /^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/
+});
+
+/**
+ * Block Lexer
+ */
+
+function Lexer(options) {
+  this.tokens = [];
+  this.tokens.links = {};
+  this.options = options || marked.defaults;
+  this.rules = block.normal;
+
+  if (this.options.gfm) {
+    if (this.options.tables) {
+      this.rules = block.tables;
+    } else {
+      this.rules = block.gfm;
+    }
+  }
+}
+
+/**
+ * Expose Block Rules
+ */
+
+Lexer.rules = block;
+
+/**
+ * Static Lex Method
+ */
+
+Lexer.lex = function(src, options) {
+  var lexer = new Lexer(options);
+  return lexer.lex(src);
+};
+
+/**
+ * Preprocessing
+ */
+
+Lexer.prototype.lex = function(src) {
+  src = src
+    .replace(/\r\n|\r/g, '\n')
+    .replace(/\t/g, '    ')
+    .replace(/\u00a0/g, ' ')
+    .replace(/\u2424/g, '\n');
+
+  return this.token(src, true);
+};
+
+/**
+ * Lexing
+ */
+
+Lexer.prototype.token = function(src, top, bq) {
+  var src = src.replace(/^ +$/gm, '')
+    , next
+    , loose
+    , cap
+    , bull
+    , b
+    , item
+    , space
+    , i
+    , l;
+
+  while (src) {
+    // newline
+    if (cap = this.rules.newline.exec(src)) {
+      src = src.substring(cap[0].length);
+      if (cap[0].length > 1) {
+        this.tokens.push({
+          type: 'space'
+        });
+      }
+    }
+
+    // code
+    if (cap = this.rules.code.exec(src)) {
+      src = src.substring(cap[0].length);
+      cap = cap[0].replace(/^ {4}/gm, '');
+      this.tokens.push({
+        type: 'code',
+        text: !this.options.pedantic
+          ? cap.replace(/\n+$/, '')
+          : cap
+      });
+      continue;
+    }
+
+    // fences (gfm)
+    if (cap = this.rules.fences.exec(src)) {
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: 'code',
+        lang: cap[2],
+        text: cap[3]
+      });
+      continue;
+    }
+
+    // heading
+    if (cap = this.rules.heading.exec(src)) {
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: 'heading',
+        depth: cap[1].length,
+        text: cap[2]
+      });
+      continue;
+    }
+
+    // table no leading pipe (gfm)
+    if (top && (cap = this.rules.nptable.exec(src))) {
+      src = src.substring(cap[0].length);
+
+      item = {
+        type: 'table',
+        header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),
+        align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
+        cells: cap[3].replace(/\n$/, '').split('\n')
+      };
+
+      for (i = 0; i < item.align.length; i++) {
+        if (/^ *-+: *$/.test(item.align[i])) {
+          item.align[i] = 'right';
+        } else if (/^ *:-+: *$/.test(item.align[i])) {
+          item.align[i] = 'center';
+        } else if (/^ *:-+ *$/.test(item.align[i])) {
+          item.align[i] = 'left';
+        } else {
+          item.align[i] = null;
+        }
+      }
+
+      for (i = 0; i < item.cells.length; i++) {
+        item.cells[i] = item.cells[i].split(/ *\| */);
+      }
+
+      this.tokens.push(item);
+
+      continue;
+    }
+
+    // lheading
+    if (cap = this.rules.lheading.exec(src)) {
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: 'heading',
+        depth: cap[2] === '=' ? 1 : 2,
+        text: cap[1]
+      });
+      continue;
+    }
+
+    // hr
+    if (cap = this.rules.hr.exec(src)) {
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: 'hr'
+      });
+      continue;
+    }
+
+    // blockquote
+    if (cap = this.rules.blockquote.exec(src)) {
+      src = src.substring(cap[0].length);
+
+      this.tokens.push({
+        type: 'blockquote_start'
+      });
+
+      cap = cap[0].replace(/^ *> ?/gm, '');
+
+      // Pass ` + "`" + `top` + "`" + ` to keep the current
+      // "toplevel" state. This is exactly
+      // how markdown.pl works.
+      this.token(cap, top, true);
+
+      this.tokens.push({
+        type: 'blockquote_end'
+      });
+
+      continue;
+    }
+
+    // list
+    if (cap = this.rules.list.exec(src)) {
+      src = src.substring(cap[0].length);
+      bull = cap[2];
+
+      this.tokens.push({
+        type: 'list_start',
+        ordered: bull.length > 1
+      });
+
+      // Get each top-level item.
+      cap = cap[0].match(this.rules.item);
+
+      next = false;
+      l = cap.length;
+      i = 0;
+
+      for (; i < l; i++) {
+        item = cap[i];
+
+        // Remove the list item's bullet
+        // so it is seen as the next token.
+        space = item.length;
+        item = item.replace(/^ *([*+-]|\d+\.) +/, '');
+
+        // Outdent whatever the
+        // list item contains. Hacky.
+        if (~item.indexOf('\n ')) {
+          space -= item.length;
+          item = !this.options.pedantic
+            ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
+            : item.replace(/^ {1,4}/gm, '');
+        }
+
+        // Determine whether the next list item belongs here.
+        // Backpedal if it does not belong in this list.
+        if (this.options.smartLists && i !== l - 1) {
+          b = block.bullet.exec(cap[i + 1])[0];
+          if (bull !== b && !(bull.length > 1 && b.length > 1)) {
+            src = cap.slice(i + 1).join('\n') + src;
+            i = l - 1;
+          }
+        }
+
+        // Determine whether item is loose or not.
+        // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
+        // for discount behavior.
+        loose = next || /\n\n(?!\s*$)/.test(item);
+        if (i !== l - 1) {
+          next = item.charAt(item.length - 1) === '\n';
+          if (!loose) loose = next;
+        }
+
+        this.tokens.push({
+          type: loose
+            ? 'loose_item_start'
+            : 'list_item_start'
+        });
+
+        // Recurse.
+        this.token(item, false, bq);
+
+        this.tokens.push({
+          type: 'list_item_end'
+        });
+      }
+
+      this.tokens.push({
+        type: 'list_end'
+      });
+
+      continue;
+    }
+
+    // html
+    if (cap = this.rules.html.exec(src)) {
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: this.options.sanitize
+          ? 'paragraph'
+          : 'html',
+        pre: cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style',
+        text: cap[0]
+      });
+      continue;
+    }
+
+    // def
+    if ((!bq && top) && (cap = this.rules.def.exec(src))) {
+      src = src.substring(cap[0].length);
+      this.tokens.links[cap[1].toLowerCase()] = {
+        href: cap[2],
+        title: cap[3]
+      };
+      continue;
+    }
+
+    // table (gfm)
+    if (top && (cap = this.rules.table.exec(src))) {
+      src = src.substring(cap[0].length);
+
+      item = {
+        type: 'table',
+        header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),
+        align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
+        cells: cap[3].replace(/(?: *\| *)?\n$/, '').split('\n')
+      };
+
+      for (i = 0; i < item.align.length; i++) {
+        if (/^ *-+: *$/.test(item.align[i])) {
+          item.align[i] = 'right';
+        } else if (/^ *:-+: *$/.test(item.align[i])) {
+          item.align[i] = 'center';
+        } else if (/^ *:-+ *$/.test(item.align[i])) {
+          item.align[i] = 'left';
+        } else {
+          item.align[i] = null;
+        }
+      }
+
+      for (i = 0; i < item.cells.length; i++) {
+        item.cells[i] = item.cells[i]
+          .replace(/^ *\| *| *\| *$/g, '')
+          .split(/ *\| */);
+      }
+
+      this.tokens.push(item);
+
+      continue;
+    }
+
+    // top-level paragraph
+    if (top && (cap = this.rules.paragraph.exec(src))) {
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: 'paragraph',
+        text: cap[1].charAt(cap[1].length - 1) === '\n'
+          ? cap[1].slice(0, -1)
+          : cap[1]
+      });
+      continue;
+    }
+
+    // text
+    if (cap = this.rules.text.exec(src)) {
+      // Top-level should never reach here.
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: 'text',
+        text: cap[0]
+      });
+      continue;
+    }
+
+    if (src) {
+      throw new
+        Error('Infinite loop on byte: ' + src.charCodeAt(0));
+    }
+  }
+
+  return this.tokens;
+};
+
+/**
+ * Inline-Level Grammar
+ */
+
+var inline = {
+  escape: /^\\([\\` + "`" + `*{}\[\]()#+\-.!_>])/,
+  autolink: /^<([^ >]+(@|:\/)[^ >]+)>/,
+  url: noop,
+  tag: /^<!--[\s\S]*?-->|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,
+  link: /^!?\[(inside)\]\(href\)/,
+  reflink: /^!?\[(inside)\]\s*\[([^\]]*)\]/,
+  nolink: /^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,
+  strong: /^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,
+  em: /^\b_((?:__|[\s\S])+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,
+  code: /^(` + "`" + `+)\s*([\s\S]*?[^` + "`" + `])\s*\1(?!` + "`" + `)/,
+  br: /^ {2,}\n(?!\s*$)/,
+  del: noop,
+  text: /^[\s\S]+?(?=[\\<!\[_*` + "`" + `]| {2,}\n|$)/
+};
+
+inline._inside = /(?:\[[^\]]*\]|[^\[\]]|\](?=[^\[]*\]))*/;
+inline._href = /\s*<?([\s\S]*?)>?(?:\s+['"]([\s\S]*?)['"])?\s*/;
+
+inline.link = replace(inline.link)
+  ('inside', inline._inside)
+  ('href', inline._href)
+  ();
+
+inline.reflink = replace(inline.reflink)
+  ('inside', inline._inside)
+  ();
+
+/**
+ * Normal Inline Grammar
+ */
+
+inline.normal = merge({}, inline);
+
+/**
+ * Pedantic Inline Grammar
+ */
+
+inline.pedantic = merge({}, inline.normal, {
+  strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
+  em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/
+});
+
+/**
+ * GFM Inline Grammar
+ */
+
+inline.gfm = merge({}, inline.normal, {
+  escape: replace(inline.escape)('])', '~|])')(),
+  url: /^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,
+  del: /^~~(?=\S)([\s\S]*?\S)~~/,
+  text: replace(inline.text)
+    (']|', '~]|')
+    ('|', '|https?://|')
+    ()
+});
+
+/**
+ * GFM + Line Breaks Inline Grammar
+ */
+
+inline.breaks = merge({}, inline.gfm, {
+  br: replace(inline.br)('{2,}', '*')(),
+  text: replace(inline.gfm.text)('{2,}', '*')()
+});
+
+/**
+ * Inline Lexer & Compiler
+ */
+
+function InlineLexer(links, options) {
+  this.options = options || marked.defaults;
+  this.links = links;
+  this.rules = inline.normal;
+  this.renderer = this.options.renderer || new Renderer;
+  this.renderer.options = this.options;
+
+  if (!this.links) {
+    throw new
+      Error('Tokens array requires a ` + "`" + `links` + "`" + ` property.');
+  }
+
+  if (this.options.gfm) {
+    if (this.options.breaks) {
+      this.rules = inline.breaks;
+    } else {
+      this.rules = inline.gfm;
+    }
+  } else if (this.options.pedantic) {
+    this.rules = inline.pedantic;
+  }
+}
+
+/**
+ * Expose Inline Rules
+ */
+
+InlineLexer.rules = inline;
+
+/**
+ * Static Lexing/Compiling Method
+ */
+
+InlineLexer.output = function(src, links, options) {
+  var inline = new InlineLexer(links, options);
+  return inline.output(src);
+};
+
+/**
+ * Lexing/Compiling
+ */
+
+InlineLexer.prototype.output = function(src) {
+  var out = ''
+    , link
+    , text
+    , href
+    , cap;
+
+  while (src) {
+    // escape
+    if (cap = this.rules.escape.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += cap[1];
+      continue;
+    }
+
+    // autolink
+    if (cap = this.rules.autolink.exec(src)) {
+      src = src.substring(cap[0].length);
+      if (cap[2] === '@') {
+        text = cap[1].charAt(6) === ':'
+          ? this.mangle(cap[1].substring(7))
+          : this.mangle(cap[1]);
+        href = this.mangle('mailto:') + text;
+      } else {
+        text = escape(cap[1]);
+        href = text;
+      }
+      out += this.renderer.link(href, null, text);
+      continue;
+    }
+
+    // url (gfm)
+    if (!this.inLink && (cap = this.rules.url.exec(src))) {
+      src = src.substring(cap[0].length);
+      text = escape(cap[1]);
+      href = text;
+      out += this.renderer.link(href, null, text);
+      continue;
+    }
+
+    // tag
+    if (cap = this.rules.tag.exec(src)) {
+      if (!this.inLink && /^<a /i.test(cap[0])) {
+        this.inLink = true;
+      } else if (this.inLink && /^<\/a>/i.test(cap[0])) {
+        this.inLink = false;
+      }
+      src = src.substring(cap[0].length);
+      out += this.options.sanitize
+        ? escape(cap[0])
+        : cap[0];
+      continue;
+    }
+
+    // link
+    if (cap = this.rules.link.exec(src)) {
+      src = src.substring(cap[0].length);
+      this.inLink = true;
+      out += this.outputLink(cap, {
+        href: cap[2],
+        title: cap[3]
+      });
+      this.inLink = false;
+      continue;
+    }
+
+    // reflink, nolink
+    if ((cap = this.rules.reflink.exec(src))
+        || (cap = this.rules.nolink.exec(src))) {
+      src = src.substring(cap[0].length);
+      link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
+      link = this.links[link.toLowerCase()];
+      if (!link || !link.href) {
+        out += cap[0].charAt(0);
+        src = cap[0].substring(1) + src;
+        continue;
+      }
+      this.inLink = true;
+      out += this.outputLink(cap, link);
+      this.inLink = false;
+      continue;
+    }
+
+    // strong
+    if (cap = this.rules.strong.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += this.renderer.strong(this.output(cap[2] || cap[1]));
+      continue;
+    }
+
+    // em
+    if (cap = this.rules.em.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += this.renderer.em(this.output(cap[2] || cap[1]));
+      continue;
+    }
+
+    // code
+    if (cap = this.rules.code.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += this.renderer.codespan(escape(cap[2], true));
+      continue;
+    }
+
+    // br
+    if (cap = this.rules.br.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += this.renderer.br();
+      continue;
+    }
+
+    // del (gfm)
+    if (cap = this.rules.del.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += this.renderer.del(this.output(cap[1]));
+      continue;
+    }
+
+    // text
+    if (cap = this.rules.text.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += escape(this.smartypants(cap[0]));
+      continue;
+    }
+
+    if (src) {
+      throw new
+        Error('Infinite loop on byte: ' + src.charCodeAt(0));
+    }
+  }
+
+  return out;
+};
+
+/**
+ * Compile Link
+ */
+
+InlineLexer.prototype.outputLink = function(cap, link) {
+  var href = escape(link.href)
+    , title = link.title ? escape(link.title) : null;
+
+  return cap[0].charAt(0) !== '!'
+    ? this.renderer.link(href, title, this.output(cap[1]))
+    : this.renderer.image(href, title, escape(cap[1]));
+};
+
+/**
+ * Smartypants Transformations
+ */
+
+InlineLexer.prototype.smartypants = function(text) {
+  if (!this.options.smartypants) return text;
+  return text
+    // em-dashes
+    .replace(/--/g, '\u2014')
+    // opening singles
+    .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
+    // closing singles & apostrophes
+    .replace(/'/g, '\u2019')
+    // opening doubles
+    .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
+    // closing doubles
+    .replace(/"/g, '\u201d')
+    // ellipses
+    .replace(/\.{3}/g, '\u2026');
+};
+
+/**
+ * Mangle Links
+ */
+
+InlineLexer.prototype.mangle = function(text) {
+  var out = ''
+    , l = text.length
+    , i = 0
+    , ch;
+
+  for (; i < l; i++) {
+    ch = text.charCodeAt(i);
+    if (Math.random() > 0.5) {
+      ch = 'x' + ch.toString(16);
+    }
+    out += '&#' + ch + ';';
+  }
+
+  return out;
+};
+
+/**
+ * Renderer
+ */
+
+function Renderer(options) {
+  this.options = options || {};
+}
+
+Renderer.prototype.code = function(code, lang, escaped) {
+  if (this.options.highlight) {
+    var out = this.options.highlight(code, lang);
+    if (out != null && out !== code) {
+      escaped = true;
+      code = out;
+    }
+  }
+
+  if (!lang) {
+    return '<pre><code>'
+      + (escaped ? code : escape(code, true))
+      + '\n</code></pre>';
+  }
+
+  return '<pre><code class="'
+    + this.options.langPrefix
+    + escape(lang, true)
+    + '">'
+    + (escaped ? code : escape(code, true))
+    + '\n</code></pre>\n';
+};
+
+Renderer.prototype.blockquote = function(quote) {
+  return '<blockquote>\n' + quote + '</blockquote>\n';
+};
+
+Renderer.prototype.html = function(html) {
+  return html;
+};
+
+Renderer.prototype.heading = function(text, level, raw) {
+  return '<h'
+    + level
+    + ' id="'
+    + this.options.headerPrefix
+    + raw.toLowerCase().replace(/[^\w]+/g, '-')
+    + '">'
+    + text
+    + '</h'
+    + level
+    + '>\n';
+};
+
+Renderer.prototype.hr = function() {
+  return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
+};
+
+Renderer.prototype.list = function(body, ordered) {
+  var type = ordered ? 'ol' : 'ul';
+  return '<' + type + '>\n' + body + '</' + type + '>\n';
+};
+
+Renderer.prototype.listitem = function(text) {
+  return '<li>' + text + '</li>\n';
+};
+
+Renderer.prototype.paragraph = function(text) {
+  return '<p>' + text + '</p>\n';
+};
+
+Renderer.prototype.table = function(header, body) {
+  return '<table>\n'
+    + '<thead>\n'
+    + header
+    + '</thead>\n'
+    + '<tbody>\n'
+    + body
+    + '</tbody>\n'
+    + '</table>\n';
+};
+
+Renderer.prototype.tablerow = function(content) {
+  return '<tr>\n' + content + '</tr>\n';
+};
+
+Renderer.prototype.tablecell = function(content, flags) {
+  var type = flags.header ? 'th' : 'td';
+  var tag = flags.align
+    ? '<' + type + ' style="text-align:' + flags.align + '">'
+    : '<' + type + '>';
+  return tag + content + '</' + type + '>\n';
+};
+
+// span level renderer
+Renderer.prototype.strong = function(text) {
+  return '<strong>' + text + '</strong>';
+};
+
+Renderer.prototype.em = function(text) {
+  return '<em>' + text + '</em>';
+};
+
+Renderer.prototype.codespan = function(text) {
+  return '<code>' + text + '</code>';
+};
+
+Renderer.prototype.br = function() {
+  return this.options.xhtml ? '<br/>' : '<br>';
+};
+
+Renderer.prototype.del = function(text) {
+  return '<del>' + text + '</del>';
+};
+
+Renderer.prototype.link = function(href, title, text) {
+  if (this.options.sanitize) {
+    try {
+      var prot = decodeURIComponent(unescape(href))
+        .replace(/[^\w:]/g, '')
+        .toLowerCase();
+    } catch (e) {
+      return '';
+    }
+    if (prot.indexOf('javascript:') === 0) {
+      return '';
+    }
+  }
+  var out = '<a href="' + href + '"';
+  if (title) {
+    out += ' title="' + title + '"';
+  }
+  out += '>' + text + '</a>';
+  return out;
+};
+
+Renderer.prototype.image = function(href, title, text) {
+  var out = '<img src="' + href + '" alt="' + text + '"';
+  if (title) {
+    out += ' title="' + title + '"';
+  }
+  out += this.options.xhtml ? '/>' : '>';
+  return out;
+};
+
+/**
+ * Parsing & Compiling
+ */
+
+function Parser(options) {
+  this.tokens = [];
+  this.token = null;
+  this.options = options || marked.defaults;
+  this.options.renderer = this.options.renderer || new Renderer;
+  this.renderer = this.options.renderer;
+  this.renderer.options = this.options;
+}
+
+/**
+ * Static Parse Method
+ */
+
+Parser.parse = function(src, options, renderer) {
+  var parser = new Parser(options, renderer);
+  return parser.parse(src);
+};
+
+/**
+ * Parse Loop
+ */
+
+Parser.prototype.parse = function(src) {
+  this.inline = new InlineLexer(src.links, this.options, this.renderer);
+  this.tokens = src.reverse();
+
+  var out = '';
+  while (this.next()) {
+    out += this.tok();
+  }
+
+  return out;
+};
+
+/**
+ * Next Token
+ */
+
+Parser.prototype.next = function() {
+  return this.token = this.tokens.pop();
+};
+
+/**
+ * Preview Next Token
+ */
+
+Parser.prototype.peek = function() {
+  return this.tokens[this.tokens.length - 1] || 0;
+};
+
+/**
+ * Parse Text Tokens
+ */
+
+Parser.prototype.parseText = function() {
+  var body = this.token.text;
+
+  while (this.peek().type === 'text') {
+    body += '\n' + this.next().text;
+  }
+
+  return this.inline.output(body);
+};
+
+/**
+ * Parse Current Token
+ */
+
+Parser.prototype.tok = function() {
+  switch (this.token.type) {
+    case 'space': {
+      return '';
+    }
+    case 'hr': {
+      return this.renderer.hr();
+    }
+    case 'heading': {
+      return this.renderer.heading(
+        this.inline.output(this.token.text),
+        this.token.depth,
+        this.token.text);
+    }
+    case 'code': {
+      return this.renderer.code(this.token.text,
+        this.token.lang,
+        this.token.escaped);
+    }
+    case 'table': {
+      var header = ''
+        , body = ''
+        , i
+        , row
+        , cell
+        , flags
+        , j;
+
+      // header
+      cell = '';
+      for (i = 0; i < this.token.header.length; i++) {
+        flags = { header: true, align: this.token.align[i] };
+        cell += this.renderer.tablecell(
+          this.inline.output(this.token.header[i]),
+          { header: true, align: this.token.align[i] }
+        );
+      }
+      header += this.renderer.tablerow(cell);
+
+      for (i = 0; i < this.token.cells.length; i++) {
+        row = this.token.cells[i];
+
+        cell = '';
+        for (j = 0; j < row.length; j++) {
+          cell += this.renderer.tablecell(
+            this.inline.output(row[j]),
+            { header: false, align: this.token.align[j] }
+          );
+        }
+
+        body += this.renderer.tablerow(cell);
+      }
+      return this.renderer.table(header, body);
+    }
+    case 'blockquote_start': {
+      var body = '';
+
+      while (this.next().type !== 'blockquote_end') {
+        body += this.tok();
+      }
+
+      return this.renderer.blockquote(body);
+    }
+    case 'list_start': {
+      var body = ''
+        , ordered = this.token.ordered;
+
+      while (this.next().type !== 'list_end') {
+        body += this.tok();
+      }
+
+      return this.renderer.list(body, ordered);
+    }
+    case 'list_item_start': {
+      var body = '';
+
+      while (this.next().type !== 'list_item_end') {
+        body += this.token.type === 'text'
+          ? this.parseText()
+          : this.tok();
+      }
+
+      return this.renderer.listitem(body);
+    }
+    case 'loose_item_start': {
+      var body = '';
+
+      while (this.next().type !== 'list_item_end') {
+        body += this.tok();
+      }
+
+      return this.renderer.listitem(body);
+    }
+    case 'html': {
+      var html = !this.token.pre && !this.options.pedantic
+        ? this.inline.output(this.token.text)
+        : this.token.text;
+      return this.renderer.html(html);
+    }
+    case 'paragraph': {
+      return this.renderer.paragraph(this.inline.output(this.token.text));
+    }
+    case 'text': {
+      return this.renderer.paragraph(this.parseText());
+    }
+  }
+};
+
+/**
+ * Helpers
+ */
+
+function escape(html, encode) {
+  return html
+    .replace(!encode ? /&(?!#?\w+;)/g : /&/g, '&amp;')
+    .replace(/</g, '&lt;')
+    .replace(/>/g, '&gt;')
+    .replace(/"/g, '&quot;')
+    .replace(/'/g, '&#39;');
+}
+
+function unescape(html) {
+  return html.replace(/&([#\w]+);/g, function(_, n) {
+    n = n.toLowerCase();
+    if (n === 'colon') return ':';
+    if (n.charAt(0) === '#') {
+      return n.charAt(1) === 'x'
+        ? String.fromCharCode(parseInt(n.substring(2), 16))
+        : String.fromCharCode(+n.substring(1));
+    }
+    return '';
+  });
+}
+
+function replace(regex, opt) {
+  regex = regex.source;
+  opt = opt || '';
+  return function self(name, val) {
+    if (!name) return new RegExp(regex, opt);
+    val = val.source || val;
+    val = val.replace(/(^|[^\[])\^/g, '$1');
+    regex = regex.replace(name, val);
+    return self;
+  };
+}
+
+function noop() {}
+noop.exec = noop;
+
+function merge(obj) {
+  var i = 1
+    , target
+    , key;
+
+  for (; i < arguments.length; i++) {
+    target = arguments[i];
+    for (key in target) {
+      if (Object.prototype.hasOwnProperty.call(target, key)) {
+        obj[key] = target[key];
+      }
+    }
+  }
+
+  return obj;
+}
+
+
+/**
+ * Marked
+ */
+
+function marked(src, opt, callback) {
+  if (callback || typeof opt === 'function') {
+    if (!callback) {
+      callback = opt;
+      opt = null;
+    }
+
+    opt = merge({}, marked.defaults, opt || {});
+
+    var highlight = opt.highlight
+      , tokens
+      , pending
+      , i = 0;
+
+    try {
+      tokens = Lexer.lex(src, opt)
+    } catch (e) {
+      return callback(e);
+    }
+
+    pending = tokens.length;
+
+    var done = function(err) {
+      if (err) {
+        opt.highlight = highlight;
+        return callback(err);
+      }
+
+      var out;
+
+      try {
+        out = Parser.parse(tokens, opt);
+      } catch (e) {
+        err = e;
+      }
+
+      opt.highlight = highlight;
+
+      return err
+        ? callback(err)
+        : callback(null, out);
+    };
+
+    if (!highlight || highlight.length < 3) {
+      return done();
+    }
+
+    delete opt.highlight;
+
+    if (!pending) return done();
+
+    for (; i < tokens.length; i++) {
+      (function(token) {
+        if (token.type !== 'code') {
+          return --pending || done();
+        }
+        return highlight(token.text, token.lang, function(err, code) {
+          if (err) return done(err);
+          if (code == null || code === token.text) {
+            return --pending || done();
+          }
+          token.text = code;
+          token.escaped = true;
+          --pending || done();
+        });
+      })(tokens[i]);
+    }
+
+    return;
+  }
+  try {
+    if (opt) opt = merge({}, marked.defaults, opt);
+    return Parser.parse(Lexer.lex(src, opt), opt);
+  } catch (e) {
+    e.message += '\nPlease report this to https://github.com/chjj/marked.';
+    if ((opt || marked.defaults).silent) {
+      return '<p>An error occured:</p><pre>'
+        + escape(e.message + '', true)
+        + '</pre>';
+    }
+    throw e;
+  }
+}
+
+/**
+ * Options
+ */
+
+marked.options =
+marked.setOptions = function(opt) {
+  merge(marked.defaults, opt);
+  return marked;
+};
+
+marked.defaults = {
+  gfm: true,
+  tables: true,
+  breaks: false,
+  pedantic: false,
+  sanitize: false,
+  smartLists: false,
+  silent: false,
+  highlight: null,
+  langPrefix: 'lang-',
+  smartypants: false,
+  headerPrefix: '',
+  renderer: new Renderer,
+  xhtml: false
+};
+
+/**
+ * Expose
+ */
+
+marked.Parser = Parser;
+marked.parser = Parser.parse;
+
+marked.Renderer = Renderer;
+
+marked.Lexer = Lexer;
+marked.lexer = Lexer.lex;
+
+marked.InlineLexer = InlineLexer;
+marked.inlineLexer = InlineLexer.output;
+
+marked.parse = marked;
+
+if (typeof module !== 'undefined' && typeof exports === 'object') {
+  module.exports = marked;
+} else if (typeof define === 'function' && define.amd) {
+  define(function() { return marked; });
+} else {
+  this.marked = marked;
+}
+
+}).call(function() {
+  return this || (typeof window !== 'undefined' ? window : global);
+}());`)
+
+func third_partySwaggerUiLibMarkedJsBytes() ([]byte, error) {
+	return _third_partySwaggerUiLibMarkedJs, nil
+}
+
+func third_partySwaggerUiLibMarkedJs() (*asset, error) {
+	bytes, err := third_partySwaggerUiLibMarkedJsBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/lib/marked.js", size: 28156, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiLibShredContentJs = []byte(`
+// The purpose of the ` + "`" + `Content` + "`" + ` object is to abstract away the data conversions
+// to and from raw content entities as strings. For example, you want to be able
+// to pass in a Javascript object and have it be automatically converted into a
+// JSON string if the ` + "`" + `content-type` + "`" + ` is set to a JSON-based media type.
+// Conversely, you want to be able to transparently get back a Javascript object
+// in the response if the ` + "`" + `content-type` + "`" + ` is a JSON-based media-type.
+
+// One limitation of the current implementation is that it [assumes the ` + "`" + `charset` + "`" + ` is UTF-8](https://github.com/spire-io/shred/issues/5).
+
+// The ` + "`" + `Content` + "`" + ` constructor takes an options object, which *must* have either a
+// ` + "`" + `body` + "`" + ` or ` + "`" + `data` + "`" + ` property and *may* have a ` + "`" + `type` + "`" + ` property indicating the
+// media type. If there is no ` + "`" + `type` + "`" + ` attribute, a default will be inferred.
+var Content = function(options) {
+  this.body = options.body;
+  this.data = options.data;
+  this.type = options.type;
+};
+
+Content.prototype = {
+  // Treat ` + "`" + `toString()` + "`" + ` as asking for the ` + "`" + `content.body` + "`" + `. That is, the raw content entity.
+  //
+  //     toString: function() { return this.body; }
+  //
+  // Commented out, but I've forgotten why. :/
+};
+
+
+// ` + "`" + `Content` + "`" + ` objects have the following attributes:
+Object.defineProperties(Content.prototype,{
+  
+// - **type**. Typically accessed as ` + "`" + `content.type` + "`" + `, reflects the ` + "`" + `content-type` + "`" + `
+//   header associated with the request or response. If not passed as an options
+//   to the constructor or set explicitly, it will infer the type the ` + "`" + `data` + "`" + `
+//   attribute, if possible, and, failing that, will default to ` + "`" + `text/plain` + "`" + `.
+  type: {
+    get: function() {
+      if (this._type) {
+        return this._type;
+      } else {
+        if (this._data) {
+          switch(typeof this._data) {
+            case "string": return "text/plain";
+            case "object": return "application/json";
+          }
+        }
+      }
+      return "text/plain";
+    },
+    set: function(value) {
+      this._type = value;
+      return this;
+    },
+    enumerable: true
+  },
+
+// - **data**. Typically accessed as ` + "`" + `content.data` + "`" + `, reflects the content entity
+//   converted into Javascript data. This can be a string, if the ` + "`" + `type` + "`" + ` is, say,
+//   ` + "`" + `text/plain` + "`" + `, but can also be a Javascript object. The conversion applied is
+//   based on the ` + "`" + `processor` + "`" + ` attribute. The ` + "`" + `data` + "`" + ` attribute can also be set
+//   directly, in which case the conversion will be done the other way, to infer
+//   the ` + "`" + `body` + "`" + ` attribute.
+  data: {
+    get: function() {
+      if (this._body) {
+        return this.processor.parser(this._body);
+      } else {
+        return this._data;
+      }
+    },
+    set: function(data) {
+      if (this._body&&data) Errors.setDataWithBody(this);
+      this._data = data;
+      return this;
+    },
+    enumerable: true
+  },
+
+// - **body**. Typically accessed as ` + "`" + `content.body` + "`" + `, reflects the content entity
+//   as a UTF-8 string. It is the mirror of the ` + "`" + `data` + "`" + ` attribute. If you set the
+//   ` + "`" + `data` + "`" + ` attribute, the ` + "`" + `body` + "`" + ` attribute will be inferred and vice-versa. If
+//   you attempt to set both, an exception is raised.
+  body: {
+    get: function() {
+      if (this._data) {
+        return this.processor.stringify(this._data);
+      } else {
+        return this._body.toString();
+      }
+    },
+    set: function(body) {
+      if (this._data&&body) Errors.setBodyWithData(this);
+      this._body = body;
+      return this;
+    },
+    enumerable: true
+  },
+
+// - **processor**. The functions that will be used to convert to/from ` + "`" + `data` + "`" + ` and
+//   ` + "`" + `body` + "`" + ` attributes. You can add processors. The two that are built-in are for
+//   ` + "`" + `text/plain` + "`" + `, which is basically an identity transformation and
+//   ` + "`" + `application/json` + "`" + ` and other JSON-based media types (including custom media
+//   types with ` + "`" + `+json` + "`" + `). You can add your own processors. See below.
+  processor: {
+    get: function() {
+      var processor = Content.processors[this.type];
+      if (processor) {
+        return processor;
+      } else {
+        // Return the first processor that matches any part of the
+        // content type. ex: application/vnd.foobar.baz+json will match json.
+        var main = this.type.split(";")[0];
+        var parts = main.split(/\+|\//);
+        for (var i=0, l=parts.length; i < l; i++) {
+          processor = Content.processors[parts[i]]
+        }
+        return processor || {parser:identity,stringify:toString};
+      }
+    },
+    enumerable: true
+  },
+
+// - **length**. Typically accessed as ` + "`" + `content.length` + "`" + `, returns the length in
+//   bytes of the raw content entity.
+  length: {
+    get: function() {
+      if (typeof Buffer !== 'undefined') {
+        return Buffer.byteLength(this.body);
+      }
+      return this.body.length;
+    }
+  }
+});
+
+Content.processors = {};
+
+// The ` + "`" + `registerProcessor` + "`" + ` function allows you to add your own processors to
+// convert content entities. Each processor consists of a Javascript object with
+// two properties:
+// - **parser**. The function used to parse a raw content entity and convert it
+//   into a Javascript data type.
+// - **stringify**. The function used to convert a Javascript data type into a
+//   raw content entity.
+Content.registerProcessor = function(types,processor) {
+  
+// You can pass an array of types that will trigger this processor, or just one.
+// We determine the array via duck-typing here.
+  if (types.forEach) {
+    types.forEach(function(type) {
+      Content.processors[type] = processor;
+    });
+  } else {
+    // If you didn't pass an array, we just use what you pass in.
+    Content.processors[types] = processor;
+  }
+};
+
+// Register the identity processor, which is used for text-based media types.
+var identity = function(x) { return x; }
+  , toString = function(x) { return x.toString(); }
+Content.registerProcessor(
+  ["text/html","text/plain","text"],
+  { parser: identity, stringify: toString });
+
+// Register the JSON processor, which is used for JSON-based media types.
+Content.registerProcessor(
+  ["application/json; charset=utf-8","application/json","json"],
+  {
+    parser: function(string) {
+      return JSON.parse(string);
+    },
+    stringify: function(data) {
+      return JSON.stringify(data); }});
+
+var qs = require('querystring');
+// Register the post processor, which is used for JSON-based media types.
+Content.registerProcessor(
+  ["application/x-www-form-urlencoded"],
+  { parser : qs.parse, stringify : qs.stringify });
+
+// Error functions are defined separately here in an attempt to make the code
+// easier to read.
+var Errors = {
+  setDataWithBody: function(object) {
+    throw new Error("Attempt to set data attribute of a content object " +
+        "when the body attributes was already set.");
+  },
+  setBodyWithData: function(object) {
+    throw new Error("Attempt to set body attribute of a content object " +
+        "when the data attributes was already set.");
+  }
+}
+module.exports = Content;`)
+
+func third_partySwaggerUiLibShredContentJsBytes() ([]byte, error) {
+	return _third_partySwaggerUiLibShredContentJs, nil
+}
+
+func third_partySwaggerUiLibShredContentJs() (*asset, error) {
+	bytes, err := third_partySwaggerUiLibShredContentJsBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/lib/shred/content.js", size: 6862, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiLibShredBundleJs = []byte(`var require = function (file, cwd) {
+    var resolved = require.resolve(file, cwd || '/');
+    var mod = require.modules[resolved];
+    if (!mod) throw new Error(
+        'Failed to resolve module ' + file + ', tried ' + resolved
+    );
+    var res = mod._cached ? mod._cached : mod();
+    return res;
+}
+
+require.paths = [];
+require.modules = {};
+require.extensions = [".js",".coffee"];
+
+require._core = {
+    'assert': true,
+    'events': true,
+    'fs': true,
+    'path': true,
+    'vm': true
+};
+
+require.resolve = (function () {
+    return function (x, cwd) {
+        if (!cwd) cwd = '/';
+        
+        if (require._core[x]) return x;
+        var path = require.modules.path();
+        var y = cwd || '.';
+        
+        if (x.match(/^(?:\.\.?\/|\/)/)) {
+            var m = loadAsFileSync(path.resolve(y, x))
+                || loadAsDirectorySync(path.resolve(y, x));
+            if (m) return m;
+        }
+        
+        var n = loadNodeModulesSync(x, y);
+        if (n) return n;
+        
+        throw new Error("Cannot find module '" + x + "'");
+        
+        function loadAsFileSync (x) {
+            if (require.modules[x]) {
+                return x;
+            }
+            
+            for (var i = 0; i < require.extensions.length; i++) {
+                var ext = require.extensions[i];
+                if (require.modules[x + ext]) return x + ext;
+            }
+        }
+        
+        function loadAsDirectorySync (x) {
+            x = x.replace(/\/+$/, '');
+            var pkgfile = x + '/package.json';
+            if (require.modules[pkgfile]) {
+                var pkg = require.modules[pkgfile]();
+                var b = pkg.browserify;
+                if (typeof b === 'object' && b.main) {
+                    var m = loadAsFileSync(path.resolve(x, b.main));
+                    if (m) return m;
+                }
+                else if (typeof b === 'string') {
+                    var m = loadAsFileSync(path.resolve(x, b));
+                    if (m) return m;
+                }
+                else if (pkg.main) {
+                    var m = loadAsFileSync(path.resolve(x, pkg.main));
+                    if (m) return m;
+                }
+            }
+            
+            return loadAsFileSync(x + '/index');
+        }
+        
+        function loadNodeModulesSync (x, start) {
+            var dirs = nodeModulesPathsSync(start);
+            for (var i = 0; i < dirs.length; i++) {
+                var dir = dirs[i];
+                var m = loadAsFileSync(dir + '/' + x);
+                if (m) return m;
+                var n = loadAsDirectorySync(dir + '/' + x);
+                if (n) return n;
+            }
+            
+            var m = loadAsFileSync(x);
+            if (m) return m;
+        }
+        
+        function nodeModulesPathsSync (start) {
+            var parts;
+            if (start === '/') parts = [ '' ];
+            else parts = path.normalize(start).split('/');
+            
+            var dirs = [];
+            for (var i = parts.length - 1; i >= 0; i--) {
+                if (parts[i] === 'node_modules') continue;
+                var dir = parts.slice(0, i + 1).join('/') + '/node_modules';
+                dirs.push(dir);
+            }
+            
+            return dirs;
+        }
+    };
+})();
+
+require.alias = function (from, to) {
+    var path = require.modules.path();
+    var res = null;
+    try {
+        res = require.resolve(from + '/package.json', '/');
+    }
+    catch (err) {
+        res = require.resolve(from, '/');
+    }
+    var basedir = path.dirname(res);
+    
+    var keys = (Object.keys || function (obj) {
+        var res = [];
+        for (var key in obj) res.push(key)
+        return res;
+    })(require.modules);
+    
+    for (var i = 0; i < keys.length; i++) {
+        var key = keys[i];
+        if (key.slice(0, basedir.length + 1) === basedir + '/') {
+            var f = key.slice(basedir.length);
+            require.modules[to + f] = require.modules[basedir + f];
+        }
+        else if (key === basedir) {
+            require.modules[to] = require.modules[basedir];
+        }
+    }
+};
+
+require.define = function (filename, fn) {
+    var dirname = require._core[filename]
+        ? ''
+        : require.modules.path().dirname(filename)
+    ;
+    
+    var require_ = function (file) {
+        return require(file, dirname)
+    };
+    require_.resolve = function (name) {
+        return require.resolve(name, dirname);
+    };
+    require_.modules = require.modules;
+    require_.define = require.define;
+    var module_ = { exports : {} };
+    
+    require.modules[filename] = function () {
+        require.modules[filename]._cached = module_.exports;
+        fn.call(
+            module_.exports,
+            require_,
+            module_,
+            module_.exports,
+            dirname,
+            filename
+        );
+        require.modules[filename]._cached = module_.exports;
+        return module_.exports;
+    };
+};
+
+if (typeof process === 'undefined') process = {};
+
+if (!process.nextTick) process.nextTick = (function () {
+    var queue = [];
+    var canPost = typeof window !== 'undefined'
+        && window.postMessage && window.addEventListener
+    ;
+    
+    if (canPost) {
+        window.addEventListener('message', function (ev) {
+            if (ev.source === window && ev.data === 'browserify-tick') {
+                ev.stopPropagation();
+                if (queue.length > 0) {
+                    var fn = queue.shift();
+                    fn();
+                }
+            }
+        }, true);
+    }
+    
+    return function (fn) {
+        if (canPost) {
+            queue.push(fn);
+            window.postMessage('browserify-tick', '*');
+        }
+        else setTimeout(fn, 0);
+    };
+})();
+
+if (!process.title) process.title = 'browser';
+
+if (!process.binding) process.binding = function (name) {
+    if (name === 'evals') return require('vm')
+    else throw new Error('No such module')
+};
+
+if (!process.cwd) process.cwd = function () { return '.' };
+
+require.define("path", function (require, module, exports, __dirname, __filename) {
+    function filter (xs, fn) {
+    var res = [];
+    for (var i = 0; i < xs.length; i++) {
+        if (fn(xs[i], i, xs)) res.push(xs[i]);
+    }
+    return res;
+}
+
+// resolves . and .. elements in a path array with directory names there
+// must be no slashes, empty elements, or device names (c:\) in the array
+// (so also no leading and trailing slashes - it does not distinguish
+// relative and absolute paths)
+function normalizeArray(parts, allowAboveRoot) {
+  // if the path tries to go above the root, ` + "`" + `up` + "`" + ` ends up > 0
+  var up = 0;
+  for (var i = parts.length; i >= 0; i--) {
+    var last = parts[i];
+    if (last == '.') {
+      parts.splice(i, 1);
+    } else if (last === '..') {
+      parts.splice(i, 1);
+      up++;
+    } else if (up) {
+      parts.splice(i, 1);
+      up--;
+    }
+  }
+
+  // if the path is allowed to go above the root, restore leading ..s
+  if (allowAboveRoot) {
+    for (; up--; up) {
+      parts.unshift('..');
+    }
+  }
+
+  return parts;
+}
+
+// Regex to split a filename into [*, dir, basename, ext]
+// posix version
+var splitPathRe = /^(.+\/(?!$)|\/)?((?:.+?)?(\.[^.]*)?)$/;
+
+// path.resolve([from ...], to)
+// posix version
+exports.resolve = function() {
+var resolvedPath = '',
+    resolvedAbsolute = false;
+
+for (var i = arguments.length; i >= -1 && !resolvedAbsolute; i--) {
+  var path = (i >= 0)
+      ? arguments[i]
+      : process.cwd();
+
+  // Skip empty and invalid entries
+  if (typeof path !== 'string' || !path) {
+    continue;
+  }
+
+  resolvedPath = path + '/' + resolvedPath;
+  resolvedAbsolute = path.charAt(0) === '/';
+}
+
+// At this point the path should be resolved to a full absolute path, but
+// handle relative paths to be safe (might happen when process.cwd() fails)
+
+// Normalize the path
+resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {
+    return !!p;
+  }), !resolvedAbsolute).join('/');
+
+  return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
+};
+
+// path.normalize(path)
+// posix version
+exports.normalize = function(path) {
+var isAbsolute = path.charAt(0) === '/',
+    trailingSlash = path.slice(-1) === '/';
+
+// Normalize the path
+path = normalizeArray(filter(path.split('/'), function(p) {
+    return !!p;
+  }), !isAbsolute).join('/');
+
+  if (!path && !isAbsolute) {
+    path = '.';
+  }
+  if (path && trailingSlash) {
+    path += '/';
+  }
+  
+  return (isAbsolute ? '/' : '') + path;
+};
+
+
+// posix version
+exports.join = function() {
+  var paths = Array.prototype.slice.call(arguments, 0);
+  return exports.normalize(filter(paths, function(p, index) {
+    return p && typeof p === 'string';
+  }).join('/'));
+};
+
+
+exports.dirname = function(path) {
+  var dir = splitPathRe.exec(path)[1] || '';
+  var isWindows = false;
+  if (!dir) {
+    // No dirname
+    return '.';
+  } else if (dir.length === 1 ||
+      (isWindows && dir.length <= 3 && dir.charAt(1) === ':')) {
+    // It is just a slash or a drive letter with a slash
+    return dir;
+  } else {
+    // It is a full dirname, strip trailing slash
+    return dir.substring(0, dir.length - 1);
+  }
+};
+
+
+exports.basename = function(path, ext) {
+  var f = splitPathRe.exec(path)[2] || '';
+  // TODO: make this comparison case-insensitive on windows?
+  if (ext && f.substr(-1 * ext.length) === ext) {
+    f = f.substr(0, f.length - ext.length);
+  }
+  return f;
+};
+
+
+exports.extname = function(path) {
+  return splitPathRe.exec(path)[3] || '';
+};
+
+});
+
+require.define("/shred.js", function (require, module, exports, __dirname, __filename) {
+    // Shred is an HTTP client library intended to simplify the use of Node's
+// built-in HTTP library. In particular, we wanted to make it easier to interact
+// with HTTP-based APIs.
+// 
+// See the [examples](./examples.html) for more details.
+
+// Ax is a nice logging library we wrote. You can use any logger, providing it
+// has ` + "`" + `info` + "`" + `, ` + "`" + `warn` + "`" + `, ` + "`" + `debug` + "`" + `, and ` + "`" + `error` + "`" + ` methods that take a string.
+var Ax = require("ax")
+  , CookieJarLib = require( "cookiejar" )
+  , CookieJar = CookieJarLib.CookieJar
+;
+
+// Shred takes some options, including a logger and request defaults.
+
+var Shred = function(options) {
+  options = (options||{});
+  this.agent = options.agent;
+  this.defaults = options.defaults||{};
+  this.log = options.logger||(new Ax({ level: "info" }));
+  this._sharedCookieJar = new CookieJar();
+  this.logCurl = options.logCurl || false;
+};
+
+// Most of the real work is done in the request and reponse classes.
+ 
+Shred.Request = require("./shred/request");
+Shred.Response = require("./shred/response");
+
+// The ` + "`" + `request` + "`" + ` method kicks off a new request, instantiating a new ` + "`" + `Request` + "`" + `
+// object and passing along whatever default options we were given.
+
+Shred.prototype = {
+  request: function(options) {
+    options.logger = this.log;
+    options.logCurl = options.logCurl || this.logCurl;
+    options.cookieJar = ( 'cookieJar' in options ) ? options.cookieJar : this._sharedCookieJar; // let them set cookieJar = null
+    options.agent = options.agent || this.agent;
+    // fill in default options
+    for (var key in this.defaults) {
+      if (this.defaults.hasOwnProperty(key) && !options[key]) {
+        options[key] = this.defaults[key]
+      }
+    }
+    return new Shred.Request(options);
+  }
+};
+
+// Define a bunch of convenience methods so that you don't have to include
+// a ` + "`" + `method` + "`" + ` property in your request options.
+
+"get put post delete".split(" ").forEach(function(method) {
+  Shred.prototype[method] = function(options) {
+    options.method = method;
+    return this.request(options);
+  };
+});
+
+
+module.exports = Shred;
+
+});
+
+require.define("/node_modules/ax/package.json", function (require, module, exports, __dirname, __filename) {
+    module.exports = {"main":"./lib/ax.js"}
+});
+
+require.define("/node_modules/ax/lib/ax.js", function (require, module, exports, __dirname, __filename) {
+    var inspect = require("util").inspect
+  , fs = require("fs")
+;
+
+
+// this is a quick-and-dirty logger. there are other nicer loggers out there
+// but the ones i found were also somewhat involved. this one has a Ruby
+// logger type interface
+//
+// we can easily replace this, provide the info, debug, etc. methods are the
+// same. or, we can change Haiku to use a more standard node.js interface
+
+var format = function(level,message) {
+  var debug = (level=="debug"||level=="error");
+  if (!message) { return message.toString(); }
+  if (typeof(message) == "object") {
+    if (message instanceof Error && debug) {
+      return message.stack;
+    } else {
+      return inspect(message);
+    }
+  } else {
+    return message.toString();
+  }
+};
+
+var noOp = function(message) { return this; }
+var makeLogger = function(level,fn) {
+  return function(message) { 
+    this.stream.write(this.format(level, message)+"\n");
+    return this;
+  }
+};
+
+var Logger = function(options) {
+  var logger = this;
+  var options = options||{};
+
+  // Default options
+  options.level = options.level || "info";
+  options.timestamp = options.timestamp || true;
+  options.prefix = options.prefix || "";
+  logger.options = options;
+
+  // Allows a prefix to be added to the message.
+  //
+  //    var logger = new Ax({ module: 'Haiku' })
+  //    logger.warn('this is going to be awesome!');
+  //    //=> Haiku: this is going to be awesome!
+  //
+  if (logger.options.module){
+    logger.options.prefix = logger.options.module;
+  }
+
+  // Write to stderr or a file
+  if (logger.options.file){
+    logger.stream = fs.createWriteStream(logger.options.file, {"flags": "a"});
+  } else {
+      if(process.title === "node")
+    logger.stream = process.stderr;
+      else if(process.title === "browser")
+    logger.stream = function () {
+      // Work around weird console context issue: http://code.google.com/p/chromium/issues/detail?id=48662
+      return console[logger.options.level].apply(console, arguments);
+    };
+  }
+
+  switch(logger.options.level){
+    case 'debug':
+      ['debug', 'info', 'warn'].forEach(function (level) {
+        logger[level] = Logger.writer(level);
+      });
+    case 'info':
+      ['info', 'warn'].forEach(function (level) {
+        logger[level] = Logger.writer(level);
+      });
+    case 'warn':
+      logger.warn = Logger.writer('warn');
+  }
+}
+
+// Used to define logger methods
+Logger.writer = function(level){
+  return function(message){
+    var logger = this;
+
+    if(process.title === "node")
+  logger.stream.write(logger.format(level, message) + '\n');
+    else if(process.title === "browser")
+  logger.stream(logger.format(level, message) + '\n');
+
+  };
+}
+
+
+Logger.prototype = {
+  info: function(){},
+  debug: function(){},
+  warn: function(){},
+  error: Logger.writer('error'),
+  format: function(level, message){
+    if (! message) return '';
+
+    var logger = this
+      , prefix = logger.options.prefix
+      , timestamp = logger.options.timestamp ? " " + (new Date().toISOString()) : ""
+    ;
+
+    return (prefix + timestamp + ": " + message);
+  }
+};
+
+module.exports = Logger;
+
+});
+
+require.define("util", function (require, module, exports, __dirname, __filename) {
+    // todo
+
+});
+
+require.define("fs", function (require, module, exports, __dirname, __filename) {
+    // nothing to see here... no file methods for the browser
+
+});
+
+require.define("/node_modules/cookiejar/package.json", function (require, module, exports, __dirname, __filename) {
+    module.exports = {"main":"cookiejar.js"}
+});
+
+require.define("/node_modules/cookiejar/cookiejar.js", function (require, module, exports, __dirname, __filename) {
+    exports.CookieAccessInfo=CookieAccessInfo=function CookieAccessInfo(domain,path,secure,script) {
+    if(this instanceof CookieAccessInfo) {
+      this.domain=domain||undefined;
+      this.path=path||"/";
+      this.secure=!!secure;
+      this.script=!!script;
+      return this;
+    }
+    else {
+        return new CookieAccessInfo(domain,path,secure,script)    
+    }
+}
+
+exports.Cookie=Cookie=function Cookie(cookiestr) {
+  if(cookiestr instanceof Cookie) {
+    return cookiestr;
+  }
+    else {
+        if(this instanceof Cookie) {
+          this.name = null;
+          this.value = null;
+          this.expiration_date = Infinity;
+          this.path = "/";
+          this.domain = null;
+          this.secure = false; //how to define?
+          this.noscript = false; //httponly
+          if(cookiestr) {
+            this.parse(cookiestr)
+          }
+          return this;
+        }
+        return new Cookie(cookiestr)
+    }
+}
+
+Cookie.prototype.toString = function toString() {
+  var str=[this.name+"="+this.value];
+  if(this.expiration_date !== Infinity) {
+    str.push("expires="+(new Date(this.expiration_date)).toGMTString());
+  }
+  if(this.domain) {
+    str.push("domain="+this.domain);
+  }
+  if(this.path) {
+    str.push("path="+this.path);
+  }
+  if(this.secure) {
+    str.push("secure");
+  }
+  if(this.noscript) {
+    str.push("httponly");
+  }
+  return str.join("; ");
+}
+
+Cookie.prototype.toValueString = function toValueString() {
+  return this.name+"="+this.value;
+}
+
+var cookie_str_splitter=/[:](?=\s*[a-zA-Z0-9_\-]+\s*[=])/g
+Cookie.prototype.parse = function parse(str) {
+  if(this instanceof Cookie) {
+      var parts=str.split(";")
+      , pair=parts[0].match(/([^=]+)=((?:.|\n)*)/)
+      , key=pair[1]
+      , value=pair[2];
+      this.name = key;
+      this.value = value;
+    
+      for(var i=1;i<parts.length;i++) {
+        pair=parts[i].match(/([^=]+)(?:=((?:.|\n)*))?/)
+        , key=pair[1].trim().toLowerCase()
+        , value=pair[2];
+        switch(key) {
+          case "httponly":
+            this.noscript = true;
+          break;
+          case "expires":
+            this.expiration_date = value
+              ? Number(Date.parse(value))
+              : Infinity;
+          break;
+          case "path":
+            this.path = value
+              ? value.trim()
+              : "";
+          break;
+          case "domain":
+            this.domain = value
+              ? value.trim()
+              : "";
+          break;
+          case "secure":
+            this.secure = true;
+          break
+        }
+      }
+    
+      return this;
+  }
+    return new Cookie().parse(str)
+}
+
+Cookie.prototype.matches = function matches(access_info) {
+  if(this.noscript && access_info.script
+  || this.secure && !access_info.secure
+  || !this.collidesWith(access_info)) {
+    return false
+  }
+  return true;
+}
+
+Cookie.prototype.collidesWith = function collidesWith(access_info) {
+  if((this.path && !access_info.path) || (this.domain && !access_info.domain)) {
+    return false
+  }
+  if(this.path && access_info.path.indexOf(this.path) !== 0) {
+    return false;
+  }
+  if (this.domain===access_info.domain) {
+    return true;
+  }
+  else if(this.domain && this.domain.charAt(0)===".")
+  {
+    var wildcard=access_info.domain.indexOf(this.domain.slice(1))
+    if(wildcard===-1 || wildcard!==access_info.domain.length-this.domain.length+1) {
+      return false;
+    }
+  }
+  else if(this.domain){
+    return false
+  }
+  return true;
+}
+
+exports.CookieJar=CookieJar=function CookieJar() {
+  if(this instanceof CookieJar) {
+      var cookies = {} //name: [Cookie]
+    
+      this.setCookie = function setCookie(cookie) {
+        cookie = Cookie(cookie);
+        //Delete the cookie if the set is past the current time
+        var remove = cookie.expiration_date <= Date.now();
+        if(cookie.name in cookies) {
+          var cookies_list = cookies[cookie.name];
+          for(var i=0;i<cookies_list.length;i++) {
+            var collidable_cookie = cookies_list[i];
+            if(collidable_cookie.collidesWith(cookie)) {
+              if(remove) {
+                cookies_list.splice(i,1);
+                if(cookies_list.length===0) {
+                  delete cookies[cookie.name]
+                }
+                return false;
+              }
+              else {
+                return cookies_list[i]=cookie;
+              }
+            }
+          }
+          if(remove) {
+            return false;
+          }
+          cookies_list.push(cookie);
+          return cookie;
+        }
+        else if(remove){
+          return false;
+        }
+        else {
+          return cookies[cookie.name]=[cookie];
+        }
+      }
+      //returns a cookie
+      this.getCookie = function getCookie(cookie_name,access_info) {
+        var cookies_list = cookies[cookie_name];
+        for(var i=0;i<cookies_list.length;i++) {
+          var cookie = cookies_list[i];
+          if(cookie.expiration_date <= Date.now()) {
+            if(cookies_list.length===0) {
+              delete cookies[cookie.name]
+            }
+            continue;
+          }
+          if(cookie.matches(access_info)) {
+            return cookie;
+          }
+        }
+      }
+      //returns a list of cookies
+      this.getCookies = function getCookies(access_info) {
+        var matches=[];
+        for(var cookie_name in cookies) {
+          var cookie=this.getCookie(cookie_name,access_info);
+          if (cookie) {
+            matches.push(cookie);
+          }
+        }
+        matches.toString=function toString(){return matches.join(":");}
+            matches.toValueString=function() {return matches.map(function(c){return c.toValueString();}).join(';');}
+        return matches;
+      }
+    
+      return this;
+  }
+    return new CookieJar()
+}
+
+
+//returns list of cookies that were set correctly
+CookieJar.prototype.setCookies = function setCookies(cookies) {
+  cookies=Array.isArray(cookies)
+    ?cookies
+    :cookies.split(cookie_str_splitter);
+  var successful=[]
+  for(var i=0;i<cookies.length;i++) {
+    var cookie = Cookie(cookies[i]);
+    if(this.setCookie(cookie)) {
+      successful.push(cookie);
+    }
+  }
+  return successful;
+}
+
+});
+
+require.define("/shred/request.js", function (require, module, exports, __dirname, __filename) {
+    // The request object encapsulates a request, creating a Node.js HTTP request and
+// then handling the response.
+
+var HTTP = require("http")
+  , HTTPS = require("https")
+  , parseUri = require("./parseUri")
+  , Emitter = require('events').EventEmitter
+  , sprintf = require("sprintf").sprintf
+  , Response = require("./response")
+  , HeaderMixins = require("./mixins/headers")
+  , Content = require("./content")
+;
+
+var STATUS_CODES = HTTP.STATUS_CODES || {
+    100 : 'Continue',
+    101 : 'Switching Protocols',
+    102 : 'Processing', // RFC 2518, obsoleted by RFC 4918
+    200 : 'OK',
+    201 : 'Created',
+    202 : 'Accepted',
+    203 : 'Non-Authoritative Information',
+    204 : 'No Content',
+    205 : 'Reset Content',
+    206 : 'Partial Content',
+    207 : 'Multi-Status', // RFC 4918
+    300 : 'Multiple Choices',
+    301 : 'Moved Permanently',
+    302 : 'Moved Temporarily',
+    303 : 'See Other',
+    304 : 'Not Modified',
+    305 : 'Use Proxy',
+    307 : 'Temporary Redirect',
+    400 : 'Bad Request',
+    401 : 'Unauthorized',
+    402 : 'Payment Required',
+    403 : 'Forbidden',
+    404 : 'Not Found',
+    405 : 'Method Not Allowed',
+    406 : 'Not Acceptable',
+    407 : 'Proxy Authentication Required',
+    408 : 'Request Time-out',
+    409 : 'Conflict',
+    410 : 'Gone',
+    411 : 'Length Required',
+    412 : 'Precondition Failed',
+    413 : 'Request Entity Too Large',
+    414 : 'Request-URI Too Large',
+    415 : 'Unsupported Media Type',
+    416 : 'Requested Range Not Satisfiable',
+    417 : 'Expectation Failed',
+    418 : 'I\'m a teapot', // RFC 2324
+    422 : 'Unprocessable Entity', // RFC 4918
+    423 : 'Locked', // RFC 4918
+    424 : 'Failed Dependency', // RFC 4918
+    425 : 'Unordered Collection', // RFC 4918
+    426 : 'Upgrade Required', // RFC 2817
+    500 : 'Internal Server Error',
+    501 : 'Not Implemented',
+    502 : 'Bad Gateway',
+    503 : 'Service Unavailable',
+    504 : 'Gateway Time-out',
+    505 : 'HTTP Version not supported',
+    506 : 'Variant Also Negotiates', // RFC 2295
+    507 : 'Insufficient Storage', // RFC 4918
+    509 : 'Bandwidth Limit Exceeded',
+    510 : 'Not Extended' // RFC 2774
+};
+
+// The Shred object itself constructs the ` + "`" + `Request` + "`" + ` object. You should rarely
+// need to do this directly.
+
+var Request = function(options) {
+  this.log = options.logger;
+  this.cookieJar = options.cookieJar;
+  this.encoding = options.encoding;
+  this.logCurl = options.logCurl;
+  processOptions(this,options||{});
+  createRequest(this);
+};
+
+// A ` + "`" + `Request` + "`" + ` has a number of properties, many of which help with details like
+// URL parsing or defaulting the port for the request.
+
+Object.defineProperties(Request.prototype, {
+
+// - **url**. You can set the ` + "`" + `url` + "`" + ` property with a valid URL string and all the
+//   URL-related properties (host, port, etc.) will be automatically set on the
+//   request object.
+
+  url: {
+    get: function() {
+      if (!this.scheme) { return null; }
+      return sprintf("%s://%s:%s%s",
+          this.scheme, this.host, this.port,
+          (this.proxy ? "/" : this.path) +
+          (this.query ? ("?" + this.query) : ""));
+    },
+    set: function(_url) {
+      _url = parseUri(_url);
+      this.scheme = _url.protocol;
+      this.host = _url.host;
+      this.port = _url.port;
+      this.path = _url.path;
+      this.query = _url.query;
+      return this;
+    },
+    enumerable: true
+  },
+
+// - **headers**. Returns a hash representing the request headers. You can't set
+//   this directly, only get it. You can add or modify headers by using the
+//   ` + "`" + `setHeader` + "`" + ` or ` + "`" + `setHeaders` + "`" + ` method. This ensures that the headers are
+//   normalized - that is, you don't accidentally send ` + "`" + `Content-Type` + "`" + ` and
+//   ` + "`" + `content-type` + "`" + ` headers. Keep in mind that if you modify the returned hash,
+//   it will *not* modify the request headers.
+
+  headers: {
+    get: function() {
+      return this.getHeaders();
+    },
+    enumerable: true
+  },
+
+// - **port**. Unless you set the ` + "`" + `port` + "`" + ` explicitly or include it in the URL, it
+//   will default based on the scheme.
+
+  port: {
+    get: function() {
+      if (!this._port) {
+        switch(this.scheme) {
+          case "https": return this._port = 443;
+          case "http":
+          default: return this._port = 80;
+        }
+      }
+      return this._port;
+    },
+    set: function(value) { this._port = value; return this; },
+    enumerable: true
+  },
+
+// - **method**. The request method - ` + "`" + `get` + "`" + `, ` + "`" + `put` + "`" + `, ` + "`" + `post` + "`" + `, etc. that will be
+//   used to make the request. Defaults to ` + "`" + `get` + "`" + `.
+
+  method: {
+    get: function() {
+      return this._method = (this._method||"GET");
+    },
+    set: function(value) {
+      this._method = value; return this;
+    },
+    enumerable: true
+  },
+
+// - **query**. Can be set either with a query string or a hash (object). Get
+//   will always return a properly escaped query string or null if there is no
+//   query component for the request.
+
+  query: {
+    get: function() {return this._query;},
+    set: function(value) {
+      var stringify = function (hash) {
+        var query = "";
+        for (var key in hash) {
+          query += encodeURIComponent(key) + '=' + encodeURIComponent(hash[key]) + '&';
+        }
+        // Remove the last '&'
+        query = query.slice(0, -1);
+        return query;
+      }
+
+      if (value) {
+        if (typeof value === 'object') {
+          value = stringify(value);
+        }
+        this._query = value;
+      } else {
+        this._query = "";
+      }
+      return this;
+    },
+    enumerable: true
+  },
+
+// - **parameters**. This will return the query parameters in the form of a hash
+//   (object).
+
+  parameters: {
+    get: function() { return QueryString.parse(this._query||""); },
+    enumerable: true
+  },
+
+// - **content**. (Aliased as ` + "`" + `body` + "`" + `.) Set this to add a content entity to the
+//   request. Attempts to use the ` + "`" + `content-type` + "`" + ` header to determine what to do
+//   with the content value. Get this to get back a [` + "`" + `Content` + "`" + `
+//   object](./content.html).
+
+  body: {
+    get: function() { return this._body; },
+    set: function(value) {
+      this._body = new Content({
+        data: value,
+        type: this.getHeader("Content-Type")
+      });
+      this.setHeader("Content-Type",this.content.type);
+      this.setHeader("Content-Length",this.content.length);
+      return this;
+    },
+    enumerable: true
+  },
+
+// - **timeout**. Used to determine how long to wait for a response. Does not
+//   distinguish between connect timeouts versus request timeouts. Set either in
+//   milliseconds or with an object with temporal attributes (hours, minutes,
+//   seconds) and convert it into milliseconds. Get will always return
+//   milliseconds.
+
+  timeout: {
+    get: function() { return this._timeout; }, // in milliseconds
+    set: function(timeout) {
+      var request = this
+        , milliseconds = 0;
+      ;
+      if (!timeout) return this;
+      if (typeof timeout==="number") { milliseconds = timeout; }
+      else {
+        milliseconds = (timeout.milliseconds||0) +
+          (1000 * ((timeout.seconds||0) +
+              (60 * ((timeout.minutes||0) +
+                (60 * (timeout.hours||0))))));
+      }
+      this._timeout = milliseconds;
+      return this;
+    },
+    enumerable: true
+  }
+});
+
+// Alias ` + "`" + `body` + "`" + ` property to ` + "`" + `content` + "`" + `. Since the [content object](./content.html)
+// has a ` + "`" + `body` + "`" + ` attribute, it's preferable to use ` + "`" + `content` + "`" + ` since you can then
+// access the raw content data using ` + "`" + `content.body` + "`" + `.
+
+Object.defineProperty(Request.prototype,"content",
+    Object.getOwnPropertyDescriptor(Request.prototype, "body"));
+
+// The ` + "`" + `Request` + "`" + ` object can be pretty overwhelming to view using the built-in
+// Node.js inspect method. We want to make it a bit more manageable. This
+// probably goes [too far in the other
+// direction](https://github.com/spire-io/shred/issues/2).
+
+Request.prototype.inspect = function () {
+  var request = this;
+  var headers = this.format_headers();
+  var summary = ["<Shred Request> ", request.method.toUpperCase(),
+      request.url].join(" ")
+  return [ summary, "- Headers:", headers].join("\n");
+};
+
+Request.prototype.format_headers = function () {
+  var array = []
+  var headers = this._headers
+  for (var key in headers) {
+    if (headers.hasOwnProperty(key)) {
+      var value = headers[key]
+      array.push("\t" + key + ": " + value);
+    }
+  }
+  return array.join("\n");
+};
+
+// Allow chainable 'on's:  shred.get({ ... }).on( ... ).  You can pass in a
+// single function, a pair (event, function), or a hash:
+// { event: function, event: function }
+Request.prototype.on = function (eventOrHash, listener) {
+  var emitter = this.emitter;
+  // Pass in a single argument as a function then make it the default response handler
+  if (arguments.length === 1 && typeof(eventOrHash) === 'function') {
+    emitter.on('response', eventOrHash);
+  } else if (arguments.length === 1 && typeof(eventOrHash) === 'object') {
+    for (var key in eventOrHash) {
+      if (eventOrHash.hasOwnProperty(key)) {
+        emitter.on(key, eventOrHash[key]);
+      }
+    }
+  } else {
+    emitter.on(eventOrHash, listener);
+  }
+  return this;
+};
+
+// Add in the header methods. Again, these ensure we don't get the same header
+// multiple times with different case conventions.
+HeaderMixins.gettersAndSetters(Request);
+
+// ` + "`" + `processOptions` + "`" + ` is called from the constructor to handle all the work
+// associated with making sure we do our best to ensure we have a valid request.
+
+var processOptions = function(request,options) {
+
+  request.log.debug("Processing request options ..");
+
+  // We'll use ` + "`" + `request.emitter` + "`" + ` to manage the ` + "`" + `on` + "`" + ` event handlers.
+  request.emitter = (new Emitter);
+
+  request.agent = options.agent;
+
+  // Set up the handlers ...
+  if (options.on) {
+    for (var key in options.on) {
+      if (options.on.hasOwnProperty(key)) {
+        request.emitter.on(key, options.on[key]);
+      }
+    }
+  }
+
+  // Make sure we were give a URL or a host
+  if (!options.url && !options.host) {
+    request.emitter.emit("request_error",
+        new Error("No url or url options (host, port, etc.)"));
+    return;
+  }
+
+  // Allow for the [use of a proxy](http://www.jmarshall.com/easy/http/#proxies).
+
+  if (options.url) {
+    if (options.proxy) {
+      request.url = options.proxy;
+      request.path = options.url;
+    } else {
+      request.url = options.url;
+    }
+  }
+
+  // Set the remaining options.
+  request.query = options.query||options.parameters||request.query ;
+  request.method = options.method;
+  request.setHeader("user-agent",options.agent||"Shred");
+  request.setHeaders(options.headers);
+
+  if (request.cookieJar) {
+    var cookies = request.cookieJar.getCookies( CookieAccessInfo( request.host, request.path ) );
+    if (cookies.length) {
+      var cookieString = request.getHeader('cookie')||'';
+      for (var cookieIndex = 0; cookieIndex < cookies.length; ++cookieIndex) {
+          if ( cookieString.length && cookieString[ cookieString.length - 1 ] != ';' )
+          {
+              cookieString += ';';
+          }
+          cookieString += cookies[ cookieIndex ].name + '=' + cookies[ cookieIndex ].value + ';';
+      }
+      request.setHeader("cookie", cookieString);
+    }
+  }
+  
+  // The content entity can be set either using the ` + "`" + `body` + "`" + ` or ` + "`" + `content` + "`" + ` attributes.
+  if (options.body||options.content) {
+    request.content = options.body||options.content;
+  }
+  request.timeout = options.timeout;
+
+};
+
+// ` + "`" + `createRequest` + "`" + ` is also called by the constructor, after ` + "`" + `processOptions` + "`" + `.
+// This actually makes the request and processes the response, so ` + "`" + `createRequest` + "`" + `
+// is a bit of a misnomer.
+
+var createRequest = function(request) {
+  var timeout ;
+
+  request.log.debug("Creating request ..");
+  request.log.debug(request);
+
+  var reqParams = {
+    host: request.host,
+    port: request.port,
+    method: request.method,
+    path: request.path + (request.query ? '?'+request.query : ""),
+    headers: request.getHeaders(),
+    // Node's HTTP/S modules will ignore this, but we are using the
+    // browserify-http module in the browser for both HTTP and HTTPS, and this
+    // is how you differentiate the two.
+    scheme: request.scheme,
+    // Use a provided agent.  'Undefined' is the default, which uses a global
+    // agent.
+    agent: request.agent
+  };
+
+  if (request.logCurl) {
+    logCurl(request);
+  }
+
+  var http = request.scheme == "http" ? HTTP : HTTPS;
+
+  // Set up the real request using the selected library. The request won't be
+  // sent until we call ` + "`" + `.end()` + "`" + `.
+  request._raw = http.request(reqParams, function(response) {
+    request.log.debug("Received response ..");
+
+    // We haven't timed out and we have a response, so make sure we clear the
+    // timeout so it doesn't fire while we're processing the response.
+    clearTimeout(timeout);
+
+    // Construct a Shred ` + "`" + `Response` + "`" + ` object from the response. This will stream
+    // the response, thus the need for the callback. We can access the response
+    // entity safely once we're in the callback.
+    response = new Response(response, request, function(response) {
+
+      // Set up some event magic. The precedence is given first to
+      // status-specific handlers, then to responses for a given event, and then
+      // finally to the more general ` + "`" + `response` + "`" + ` handler. In the last case, we
+      // need to first make sure we're not dealing with a a redirect.
+      var emit = function(event) {
+        var emitter = request.emitter;
+        var textStatus = STATUS_CODES[response.status] ? STATUS_CODES[response.status].toLowerCase() : null;
+        if (emitter.listeners(response.status).length > 0 || emitter.listeners(textStatus).length > 0) {
+          emitter.emit(response.status, response);
+          emitter.emit(textStatus, response);
+        } else {
+          if (emitter.listeners(event).length>0) {
+            emitter.emit(event, response);
+          } else if (!response.isRedirect) {
+            emitter.emit("response", response);
+            //console.warn("Request has no event listener for status code " + response.status);
+          }
+        }
+      };
+
+      // Next, check for a redirect. We simply repeat the request with the URL
+      // given in the ` + "`" + `Location` + "`" + ` header. We fire a ` + "`" + `redirect` + "`" + ` event.
+      if (response.isRedirect) {
+        request.log.debug("Redirecting to "
+            + response.getHeader("Location"));
+        request.url = response.getHeader("Location");
+        emit("redirect");
+        createRequest(request);
+
+      // Okay, it's not a redirect. Is it an error of some kind?
+      } else if (response.isError) {
+        emit("error");
+      } else {
+      // It looks like we're good shape. Trigger the ` + "`" + `success` + "`" + ` event.
+        emit("success");
+      }
+    });
+  });
+
+  // We're still setting up the request. Next, we're going to handle error cases
+  // where we have no response. We don't emit an error event because that event
+  // takes a response. We don't response handlers to have to check for a null
+  // value. However, we [should introduce a different event
+  // type](https://github.com/spire-io/shred/issues/3) for this type of error.
+  request._raw.on("error", function(error) {
+    request.emitter.emit("request_error", error);
+  });
+
+  request._raw.on("socket", function(socket) {
+    request.emitter.emit("socket", socket);
+  });
+
+  // TCP timeouts should also trigger the "response_error" event.
+  request._raw.on('socket', function () {
+    request._raw.socket.on('timeout', function () {
+      // This should trigger the "error" event on the raw request, which will
+      // trigger the "response_error" on the shred request.
+      request._raw.abort();
+    });
+  });
+
+
+  // We're almost there. Next, we need to write the request entity to the
+  // underlying request object.
+  if (request.content) {
+    request.log.debug("Streaming body: '" +
+        request.content.data.slice(0,59) + "' ... ");
+    request._raw.write(request.content.data);
+  }
+
+  // Finally, we need to set up the timeout. We do this last so that we don't
+  // start the clock ticking until the last possible moment.
+  if (request.timeout) {
+    timeout = setTimeout(function() {
+      request.log.debug("Timeout fired, aborting request ...");
+      request._raw.abort();
+      request.emitter.emit("timeout", request);
+    },request.timeout);
+  }
+
+  // The ` + "`" + `.end()` + "`" + ` method will cause the request to fire. Technically, it might
+  // have already sent the headers and body.
+  request.log.debug("Sending request ...");
+  request._raw.end();
+};
+
+// Logs the curl command for the request.
+var logCurl = function (req) {
+  var headers = req.getHeaders();
+  var headerString = "";
+
+  for (var key in headers) {
+    headerString += '-H "' + key + ": " + headers[key] + '" ';
+  }
+
+  var bodyString = ""
+
+  if (req.content) {
+    bodyString += "-d '" + req.content.body + "' ";
+  }
+
+  var query = req.query ? '?' + req.query : "";
+
+  console.log("curl " +
+    "-X " + req.method.toUpperCase() + " " +
+    req.scheme + "://" + req.host + ":" + req.port + req.path + query + " " +
+    headerString +
+    bodyString
+  );
+};
+
+
+module.exports = Request;
+
+});
+
+require.define("http", function (require, module, exports, __dirname, __filename) {
+    // todo
+
+});
+
+require.define("https", function (require, module, exports, __dirname, __filename) {
+    // todo
+
+});
+
+require.define("/shred/parseUri.js", function (require, module, exports, __dirname, __filename) {
+    // parseUri 1.2.2
+// (c) Steven Levithan <stevenlevithan.com>
+// MIT License
+
+function parseUri (str) {
+  var o   = parseUri.options,
+    m   = o.parser[o.strictMode ? "strict" : "loose"].exec(str),
+    uri = {},
+    i   = 14;
+
+  while (i--) uri[o.key[i]] = m[i] || "";
+
+  uri[o.q.name] = {};
+  uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {
+    if ($1) uri[o.q.name][$1] = $2;
+  });
+
+  return uri;
+};
+
+parseUri.options = {
+  strictMode: false,
+  key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],
+  q:   {
+    name:   "queryKey",
+    parser: /(?:^|&)([^&=]*)=?([^&]*)/g
+  },
+  parser: {
+    strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
+    loose:  /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
+  }
+};
+
+module.exports = parseUri;
+
+});
+
+require.define("events", function (require, module, exports, __dirname, __filename) {
+    if (!process.EventEmitter) process.EventEmitter = function () {};
+
+var EventEmitter = exports.EventEmitter = process.EventEmitter;
+var isArray = typeof Array.isArray === 'function'
+    ? Array.isArray
+    : function (xs) {
+        return Object.toString.call(xs) === '[object Array]'
+    }
+;
+
+// By default EventEmitters will print a warning if more than
+// 10 listeners are added to it. This is a useful default which
+// helps finding memory leaks.
+//
+// Obviously not all Emitters should be limited to 10. This function allows
+// that to be increased. Set to zero for unlimited.
+var defaultMaxListeners = 10;
+EventEmitter.prototype.setMaxListeners = function(n) {
+  if (!this._events) this._events = {};
+  this._events.maxListeners = n;
+};
+
+
+EventEmitter.prototype.emit = function(type) {
+  // If there is no 'error' event listener then throw.
+  if (type === 'error') {
+    if (!this._events || !this._events.error ||
+        (isArray(this._events.error) && !this._events.error.length))
+    {
+      if (arguments[1] instanceof Error) {
+        throw arguments[1]; // Unhandled 'error' event
+      } else {
+        throw new Error("Uncaught, unspecified 'error' event.");
+      }
+      return false;
+    }
+  }
+
+  if (!this._events) return false;
+  var handler = this._events[type];
+  if (!handler) return false;
+
+  if (typeof handler == 'function') {
+    switch (arguments.length) {
+      // fast cases
+      case 1:
+        handler.call(this);
+        break;
+      case 2:
+        handler.call(this, arguments[1]);
+        break;
+      case 3:
+        handler.call(this, arguments[1], arguments[2]);
+        break;
+      // slower
+      default:
+        var args = Array.prototype.slice.call(arguments, 1);
+        handler.apply(this, args);
+    }
+    return true;
+
+  } else if (isArray(handler)) {
+    var args = Array.prototype.slice.call(arguments, 1);
+
+    var listeners = handler.slice();
+    for (var i = 0, l = listeners.length; i < l; i++) {
+      listeners[i].apply(this, args);
+    }
+    return true;
+
+  } else {
+    return false;
+  }
+};
+
+// EventEmitter is defined in src/node_events.cc
+// EventEmitter.prototype.emit() is also defined there.
+EventEmitter.prototype.addListener = function(type, listener) {
+  if ('function' !== typeof listener) {
+    throw new Error('addListener only takes instances of Function');
+  }
+
+  if (!this._events) this._events = {};
+
+  // To avoid recursion in the case that type == "newListeners"! Before
+  // adding it to the listeners, first emit "newListeners".
+  this.emit('newListener', type, listener);
+
+  if (!this._events[type]) {
+    // Optimize the case of one listener. Don't need the extra array object.
+    this._events[type] = listener;
+  } else if (isArray(this._events[type])) {
+
+    // Check for listener leak
+    if (!this._events[type].warned) {
+      var m;
+      if (this._events.maxListeners !== undefined) {
+        m = this._events.maxListeners;
+      } else {
+        m = defaultMaxListeners;
+      }
+
+      if (m && m > 0 && this._events[type].length > m) {
+        this._events[type].warned = true;
+        console.error('(node) warning: possible EventEmitter memory ' +
+                      'leak detected. %d listeners added. ' +
+                      'Use emitter.setMaxListeners() to increase limit.',
+                      this._events[type].length);
+        console.trace();
+      }
+    }
+
+    // If we've already got an array, just append.
+    this._events[type].push(listener);
+  } else {
+    // Adding the second element, need to change to array.
+    this._events[type] = [this._events[type], listener];
+  }
+
+  return this;
+};
+
+EventEmitter.prototype.on = EventEmitter.prototype.addListener;
+
+EventEmitter.prototype.once = function(type, listener) {
+  var self = this;
+  self.on(type, function g() {
+    self.removeListener(type, g);
+    listener.apply(this, arguments);
+  });
+
+  return this;
+};
+
+EventEmitter.prototype.removeListener = function(type, listener) {
+  if ('function' !== typeof listener) {
+    throw new Error('removeListener only takes instances of Function');
+  }
+
+  // does not use listeners(), so no side effect of creating _events[type]
+  if (!this._events || !this._events[type]) return this;
+
+  var list = this._events[type];
+
+  if (isArray(list)) {
+    var i = list.indexOf(listener);
+    if (i < 0) return this;
+    list.splice(i, 1);
+    if (list.length == 0)
+      delete this._events[type];
+  } else if (this._events[type] === listener) {
+    delete this._events[type];
+  }
+
+  return this;
+};
+
+EventEmitter.prototype.removeAllListeners = function(type) {
+  // does not use listeners(), so no side effect of creating _events[type]
+  if (type && this._events && this._events[type]) this._events[type] = null;
+  return this;
+};
+
+EventEmitter.prototype.listeners = function(type) {
+  if (!this._events) this._events = {};
+  if (!this._events[type]) this._events[type] = [];
+  if (!isArray(this._events[type])) {
+    this._events[type] = [this._events[type]];
+  }
+  return this._events[type];
+};
+
+});
+
+require.define("/node_modules/sprintf/package.json", function (require, module, exports, __dirname, __filename) {
+    module.exports = {"main":"./lib/sprintf"}
+});
+
+require.define("/node_modules/sprintf/lib/sprintf.js", function (require, module, exports, __dirname, __filename) {
+    /**
+sprintf() for JavaScript 0.7-beta1
+http://www.diveintojavascript.com/projects/javascript-sprintf
+
+Copyright (c) Alexandru Marasteanu <alexaholic [at) gmail (dot] com>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of sprintf() for JavaScript nor the
+      names of its contributors may be used to endorse or promote products
+      derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL Alexandru Marasteanu 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.
+
+
+Changelog:
+2010.11.07 - 0.7-beta1-node
+  - converted it to a node.js compatible module
+
+2010.09.06 - 0.7-beta1
+  - features: vsprintf, support for named placeholders
+  - enhancements: format cache, reduced global namespace pollution
+
+2010.05.22 - 0.6:
+ - reverted to 0.4 and fixed the bug regarding the sign of the number 0
+ Note:
+ Thanks to Raphael Pigulla <raph (at] n3rd [dot) org> (http://www.n3rd.org/)
+ who warned me about a bug in 0.5, I discovered that the last update was
+ a regress. I appologize for that.
+
+2010.05.09 - 0.5:
+ - bug fix: 0 is now preceeded with a + sign
+ - bug fix: the sign was not at the right position on padded results (Kamal Abdali)
+ - switched from GPL to BSD license
+
+2007.10.21 - 0.4:
+ - unit test and patch (David Baird)
+
+2007.09.17 - 0.3:
+ - bug fix: no longer throws exception on empty paramenters (Hans Pufal)
+
+2007.09.11 - 0.2:
+ - feature: added argument swapping
+
+2007.04.03 - 0.1:
+ - initial release
+**/
+
+var sprintf = (function() {
+  function get_type(variable) {
+    return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase();
+  }
+  function str_repeat(input, multiplier) {
+    for (var output = []; multiplier > 0; output[--multiplier] = input) {/* do nothing */}
+    return output.join('');
+  }
+
+  var str_format = function() {
+    if (!str_format.cache.hasOwnProperty(arguments[0])) {
+      str_format.cache[arguments[0]] = str_format.parse(arguments[0]);
+    }
+    return str_format.format.call(null, str_format.cache[arguments[0]], arguments);
+  };
+
+  str_format.format = function(parse_tree, argv) {
+    var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length;
+    for (i = 0; i < tree_length; i++) {
+      node_type = get_type(parse_tree[i]);
+      if (node_type === 'string') {
+        output.push(parse_tree[i]);
+      }
+      else if (node_type === 'array') {
+        match = parse_tree[i]; // convenience purposes only
+        if (match[2]) { // keyword argument
+          arg = argv[cursor];
+          for (k = 0; k < match[2].length; k++) {
+            if (!arg.hasOwnProperty(match[2][k])) {
+              throw(sprintf('[sprintf] property "%s" does not exist', match[2][k]));
+            }
+            arg = arg[match[2][k]];
+          }
+        }
+        else if (match[1]) { // positional argument (explicit)
+          arg = argv[match[1]];
+        }
+        else { // positional argument (implicit)
+          arg = argv[cursor++];
+        }
+
+        if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) {
+          throw(sprintf('[sprintf] expecting number but found %s', get_type(arg)));
+        }
+        switch (match[8]) {
+          case 'b': arg = arg.toString(2); break;
+          case 'c': arg = String.fromCharCode(arg); break;
+          case 'd': arg = parseInt(arg, 10); break;
+          case 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break;
+          case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break;
+          case 'o': arg = arg.toString(8); break;
+          case 's': arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg); break;
+          case 'u': arg = Math.abs(arg); break;
+          case 'x': arg = arg.toString(16); break;
+          case 'X': arg = arg.toString(16).toUpperCase(); break;
+        }
+        arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+'+ arg : arg);
+        pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' ';
+        pad_length = match[6] - String(arg).length;
+        pad = match[6] ? str_repeat(pad_character, pad_length) : '';
+        output.push(match[5] ? arg + pad : pad + arg);
+      }
+    }
+    return output.join('');
+  };
+
+  str_format.cache = {};
+
+  str_format.parse = function(fmt) {
+    var _fmt = fmt, match = [], parse_tree = [], arg_names = 0;
+    while (_fmt) {
+      if ((match = /^[^\x25]+/.exec(_fmt)) !== null) {
+        parse_tree.push(match[0]);
+      }
+      else if ((match = /^\x25{2}/.exec(_fmt)) !== null) {
+        parse_tree.push('%');
+      }
+      else if ((match = /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(_fmt)) !== null) {
+        if (match[2]) {
+          arg_names |= 1;
+          var field_list = [], replacement_field = match[2], field_match = [];
+          if ((field_match = /^([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
+            field_list.push(field_match[1]);
+            while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {
+              if ((field_match = /^\.([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
+                field_list.push(field_match[1]);
+              }
+              else if ((field_match = /^\[(\d+)\]/.exec(replacement_field)) !== null) {
+                field_list.push(field_match[1]);
+              }
+              else {
+                throw('[sprintf] huh?');
+              }
+            }
+          }
+          else {
+            throw('[sprintf] huh?');
+          }
+          match[2] = field_list;
+        }
+        else {
+          arg_names |= 2;
+        }
+        if (arg_names === 3) {
+          throw('[sprintf] mixing positional and named placeholders is not (yet) supported');
+        }
+        parse_tree.push(match);
+      }
+      else {
+        throw('[sprintf] huh?');
+      }
+      _fmt = _fmt.substring(match[0].length);
+    }
+    return parse_tree;
+  };
+
+  return str_format;
+})();
+
+var vsprintf = function(fmt, argv) {
+  argv.unshift(fmt);
+  return sprintf.apply(null, argv);
+};
+
+exports.sprintf = sprintf;
+exports.vsprintf = vsprintf;
+});
+
+require.define("/shred/response.js", function (require, module, exports, __dirname, __filename) {
+    // The ` + "`" + `Response object` + "`" + ` encapsulates a Node.js HTTP response.
+
+var Content = require("./content")
+  , HeaderMixins = require("./mixins/headers")
+  , CookieJarLib = require( "cookiejar" )
+  , Cookie = CookieJarLib.Cookie
+;
+
+// Browser doesn't have zlib.
+var zlib = null;
+try {
+  zlib = require('zlib');
+} catch (e) {
+  // console.warn("no zlib library");
+}
+
+// Iconv doesn't work in browser
+var Iconv = null;
+try {
+  Iconv = require('iconv-lite');
+} catch (e) {
+  // console.warn("no iconv library");
+}
+
+// Construct a ` + "`" + `Response` + "`" + ` object. You should never have to do this directly. The
+// ` + "`" + `Request` + "`" + ` object handles this, getting the raw response object and passing it
+// in here, along with the request. The callback allows us to stream the response
+// and then use the callback to let the request know when it's ready.
+var Response = function(raw, request, callback) { 
+  var response = this;
+  this._raw = raw;
+
+  // The ` + "`" + `._setHeaders` + "`" + ` method is "private"; you can't otherwise set headers on
+  // the response.
+  this._setHeaders.call(this,raw.headers);
+  
+  // store any cookies
+  if (request.cookieJar && this.getHeader('set-cookie')) {
+    var cookieStrings = this.getHeader('set-cookie');
+    var cookieObjs = []
+      , cookie;
+
+    for (var i = 0; i < cookieStrings.length; i++) {
+      var cookieString = cookieStrings[i];
+      if (!cookieString) {
+        continue;
+      }
+
+      if (!cookieString.match(/domain\=/i)) {
+        cookieString += '; domain=' + request.host;
+      }
+
+      if (!cookieString.match(/path\=/i)) {
+        cookieString += '; path=' + request.path;
+      }
+
+      try {
+        cookie = new Cookie(cookieString);
+        if (cookie) {
+          cookieObjs.push(cookie);
+        }
+      } catch (e) {
+        console.warn("Tried to set bad cookie: " + cookieString);
+      }
+    }
+
+    request.cookieJar.setCookies(cookieObjs);
+  }
+
+  this.request = request;
+  this.client = request.client;
+  this.log = this.request.log;
+
+  // Stream the response content entity and fire the callback when we're done.
+  // Store the incoming data in a array of Buffers which we concatinate into one
+  // buffer at the end.  We need to use buffers instead of strings here in order
+  // to preserve binary data.
+  var chunkBuffers = [];
+  var dataLength = 0;
+  raw.on("data", function(chunk) {
+    chunkBuffers.push(chunk);
+    dataLength += chunk.length;
+  });
+  raw.on("end", function() {
+    var body;
+    if (typeof Buffer === 'undefined') {
+      // Just concatinate into a string
+      body = chunkBuffers.join('');
+    } else {
+      // Initialize new buffer and add the chunks one-at-a-time.
+      body = new Buffer(dataLength);
+      for (var i = 0, pos = 0; i < chunkBuffers.length; i++) {
+        chunkBuffers[i].copy(body, pos);
+        pos += chunkBuffers[i].length;
+      }
+    }
+
+    var setBodyAndFinish = function (body) {
+      response._body = new Content({ 
+        body: body,
+        type: response.getHeader("Content-Type")
+      });
+      callback(response);
+    }
+
+    if (zlib && response.getHeader("Content-Encoding") === 'gzip'){
+      zlib.gunzip(body, function (err, gunzippedBody) {
+        if (Iconv && response.request.encoding){
+          body = Iconv.fromEncoding(gunzippedBody,response.request.encoding);
+        } else {
+          body = gunzippedBody.toString();
+        }
+        setBodyAndFinish(body);
+      })
+    }
+    else{
+       if (response.request.encoding){
+            body = Iconv.fromEncoding(body,response.request.encoding);
+        }        
+      setBodyAndFinish(body);
+    }
+  });
+};
+
+// The ` + "`" + `Response` + "`" + ` object can be pretty overwhelming to view using the built-in
+// Node.js inspect method. We want to make it a bit more manageable. This
+// probably goes [too far in the other
+// direction](https://github.com/spire-io/shred/issues/2).
+
+Response.prototype = {
+  inspect: function() {
+    var response = this;
+    var headers = this.format_headers();
+    var summary = ["<Shred Response> ", response.status].join(" ")
+    return [ summary, "- Headers:", headers].join("\n");
+  },
+  format_headers: function () {
+    var array = []
+    var headers = this._headers
+    for (var key in headers) {
+      if (headers.hasOwnProperty(key)) {
+        var value = headers[key]
+        array.push("\t" + key + ": " + value);
+      }
+    }
+    return array.join("\n");
+  }
+};
+
+// ` + "`" + `Response` + "`" + ` object properties, all of which are read-only:
+Object.defineProperties(Response.prototype, {
+  
+// - **status**. The HTTP status code for the response. 
+  status: {
+    get: function() { return this._raw.statusCode; },
+    enumerable: true
+  },
+
+// - **content**. The HTTP content entity, if any. Provided as a [content
+//   object](./content.html), which will attempt to convert the entity based upon
+//   the ` + "`" + `content-type` + "`" + ` header. The converted value is available as
+//   ` + "`" + `content.data` + "`" + `. The original raw content entity is available as
+//   ` + "`" + `content.body` + "`" + `.
+  body: {
+    get: function() { return this._body; }
+  },
+  content: {
+    get: function() { return this.body; },
+    enumerable: true
+  },
+
+// - **isRedirect**. Is the response a redirect? These are responses with 3xx
+//   status and a ` + "`" + `Location` + "`" + ` header.
+  isRedirect: {
+    get: function() {
+      return (this.status>299
+          &&this.status<400
+          &&this.getHeader("Location"));
+    },
+    enumerable: true
+  },
+
+// - **isError**. Is the response an error? These are responses with status of
+//   400 or greater.
+  isError: {
+    get: function() {
+      return (this.status === 0 || this.status > 399)
+    },
+    enumerable: true
+  }
+});
+
+// Add in the [getters for accessing the normalized headers](./headers.js).
+HeaderMixins.getters(Response);
+HeaderMixins.privateSetters(Response);
+
+// Work around Mozilla bug #608735 [https://bugzil.la/608735], which causes
+// getAllResponseHeaders() to return {} if the response is a CORS request.
+// xhr.getHeader still works correctly.
+var getHeader = Response.prototype.getHeader;
+Response.prototype.getHeader = function (name) {
+  return (getHeader.call(this,name) ||
+    (typeof this._raw.getHeader === 'function' && this._raw.getHeader(name)));
+};
+
+module.exports = Response;
+
+});
+
+require.define("/shred/content.js", function (require, module, exports, __dirname, __filename) {
+    
+// The purpose of the ` + "`" + `Content` + "`" + ` object is to abstract away the data conversions
+// to and from raw content entities as strings. For example, you want to be able
+// to pass in a Javascript object and have it be automatically converted into a
+// JSON string if the ` + "`" + `content-type` + "`" + ` is set to a JSON-based media type.
+// Conversely, you want to be able to transparently get back a Javascript object
+// in the response if the ` + "`" + `content-type` + "`" + ` is a JSON-based media-type.
+
+// One limitation of the current implementation is that it [assumes the ` + "`" + `charset` + "`" + ` is UTF-8](https://github.com/spire-io/shred/issues/5).
+
+// The ` + "`" + `Content` + "`" + ` constructor takes an options object, which *must* have either a
+// ` + "`" + `body` + "`" + ` or ` + "`" + `data` + "`" + ` property and *may* have a ` + "`" + `type` + "`" + ` property indicating the
+// media type. If there is no ` + "`" + `type` + "`" + ` attribute, a default will be inferred.
+var Content = function(options) {
+  this.body = options.body;
+  this.data = options.data;
+  this.type = options.type;
+};
+
+Content.prototype = {
+  // Treat ` + "`" + `toString()` + "`" + ` as asking for the ` + "`" + `content.body` + "`" + `. That is, the raw content entity.
+  //
+  //     toString: function() { return this.body; }
+  //
+  // Commented out, but I've forgotten why. :/
+};
+
+
+// ` + "`" + `Content` + "`" + ` objects have the following attributes:
+Object.defineProperties(Content.prototype,{
+  
+// - **type**. Typically accessed as ` + "`" + `content.type` + "`" + `, reflects the ` + "`" + `content-type` + "`" + `
+//   header associated with the request or response. If not passed as an options
+//   to the constructor or set explicitly, it will infer the type the ` + "`" + `data` + "`" + `
+//   attribute, if possible, and, failing that, will default to ` + "`" + `text/plain` + "`" + `.
+  type: {
+    get: function() {
+      if (this._type) {
+        return this._type;
+      } else {
+        if (this._data) {
+          switch(typeof this._data) {
+            case "string": return "text/plain";
+            case "object": return "application/json";
+          }
+        }
+      }
+      return "text/plain";
+    },
+    set: function(value) {
+      this._type = value;
+      return this;
+    },
+    enumerable: true
+  },
+
+// - **data**. Typically accessed as ` + "`" + `content.data` + "`" + `, reflects the content entity
+//   converted into Javascript data. This can be a string, if the ` + "`" + `type` + "`" + ` is, say,
+//   ` + "`" + `text/plain` + "`" + `, but can also be a Javascript object. The conversion applied is
+//   based on the ` + "`" + `processor` + "`" + ` attribute. The ` + "`" + `data` + "`" + ` attribute can also be set
+//   directly, in which case the conversion will be done the other way, to infer
+//   the ` + "`" + `body` + "`" + ` attribute.
+  data: {
+    get: function() {
+      if (this._body) {
+        return this.processor.parser(this._body);
+      } else {
+        return this._data;
+      }
+    },
+    set: function(data) {
+      if (this._body&&data) Errors.setDataWithBody(this);
+      this._data = data;
+      return this;
+    },
+    enumerable: true
+  },
+
+// - **body**. Typically accessed as ` + "`" + `content.body` + "`" + `, reflects the content entity
+//   as a UTF-8 string. It is the mirror of the ` + "`" + `data` + "`" + ` attribute. If you set the
+//   ` + "`" + `data` + "`" + ` attribute, the ` + "`" + `body` + "`" + ` attribute will be inferred and vice-versa. If
+//   you attempt to set both, an exception is raised.
+  body: {
+    get: function() {
+      if (this._data) {
+        return this.processor.stringify(this._data);
+      } else {
+        return this.processor.stringify(this._body);
+      }
+    },
+    set: function(body) {
+      if (this._data&&body) Errors.setBodyWithData(this);
+      this._body = body;
+      return this;
+    },
+    enumerable: true
+  },
+
+// - **processor**. The functions that will be used to convert to/from ` + "`" + `data` + "`" + ` and
+//   ` + "`" + `body` + "`" + ` attributes. You can add processors. The two that are built-in are for
+//   ` + "`" + `text/plain` + "`" + `, which is basically an identity transformation and
+//   ` + "`" + `application/json` + "`" + ` and other JSON-based media types (including custom media
+//   types with ` + "`" + `+json` + "`" + `). You can add your own processors. See below.
+  processor: {
+    get: function() {
+      var processor = Content.processors[this.type];
+      if (processor) {
+        return processor;
+      } else {
+        // Return the first processor that matches any part of the
+        // content type. ex: application/vnd.foobar.baz+json will match json.
+        var main = this.type.split(";")[0];
+        var parts = main.split(/\+|\//);
+        for (var i=0, l=parts.length; i < l; i++) {
+          processor = Content.processors[parts[i]]
+        }
+        return processor || {parser:identity,stringify:toString};
+      }
+    },
+    enumerable: true
+  },
+
+// - **length**. Typically accessed as ` + "`" + `content.length` + "`" + `, returns the length in
+//   bytes of the raw content entity.
+  length: {
+    get: function() {
+      if (typeof Buffer !== 'undefined') {
+        return Buffer.byteLength(this.body);
+      }
+      return this.body.length;
+    }
+  }
+});
+
+Content.processors = {};
+
+// The ` + "`" + `registerProcessor` + "`" + ` function allows you to add your own processors to
+// convert content entities. Each processor consists of a Javascript object with
+// two properties:
+// - **parser**. The function used to parse a raw content entity and convert it
+//   into a Javascript data type.
+// - **stringify**. The function used to convert a Javascript data type into a
+//   raw content entity.
+Content.registerProcessor = function(types,processor) {
+  
+// You can pass an array of types that will trigger this processor, or just one.
+// We determine the array via duck-typing here.
+  if (types.forEach) {
+    types.forEach(function(type) {
+      Content.processors[type] = processor;
+    });
+  } else {
+    // If you didn't pass an array, we just use what you pass in.
+    Content.processors[types] = processor;
+  }
+};
+
+// Register the identity processor, which is used for text-based media types.
+var identity = function(x) { return x; }
+  , toString = function(x) { return x.toString(); }
+Content.registerProcessor(
+  ["text/html","text/plain","text"],
+  { parser: identity, stringify: toString });
+
+// Register the JSON processor, which is used for JSON-based media types.
+Content.registerProcessor(
+  ["application/json; charset=utf-8","application/json","json"],
+  {
+    parser: function(string) {
+      return JSON.parse(string);
+    },
+    stringify: function(data) {
+      return JSON.stringify(data); }});
+
+// Error functions are defined separately here in an attempt to make the code
+// easier to read.
+var Errors = {
+  setDataWithBody: function(object) {
+    throw new Error("Attempt to set data attribute of a content object " +
+        "when the body attributes was already set.");
+  },
+  setBodyWithData: function(object) {
+    throw new Error("Attempt to set body attribute of a content object " +
+        "when the data attributes was already set.");
+  }
+}
+module.exports = Content;
+
+});
+
+require.define("/shred/mixins/headers.js", function (require, module, exports, __dirname, __filename) {
+    // The header mixins allow you to add HTTP header support to any object. This
+// might seem pointless: why not simply use a hash? The main reason is that, per
+// the [HTTP spec](http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2),
+// headers are case-insensitive. So, for example, ` + "`" + `content-type` + "`" + ` is the same as
+// ` + "`" + `CONTENT-TYPE` + "`" + ` which is the same as ` + "`" + `Content-Type` + "`" + `. Since there is no way to
+// overload the index operator in Javascript, using a hash to represent the
+// headers means it's possible to have two conflicting values for a single
+// header.
+// 
+// The solution to this is to provide explicit methods to set or get headers.
+// This also has the benefit of allowing us to introduce additional variations,
+// including snake case, which we automatically convert to what Matthew King has
+// dubbed "corset case" - the hyphen-separated names with initial caps:
+// ` + "`" + `Content-Type` + "`" + `. We use corset-case just in case we're dealing with servers
+// that haven't properly implemented the spec.
+
+// Convert headers to corset-case. **Example:** ` + "`" + `CONTENT-TYPE` + "`" + ` will be converted
+// to ` + "`" + `Content-Type` + "`" + `.
+
+var corsetCase = function(string) {
+  return string;//.toLowerCase()
+      //.replace("_","-")
+      // .replace(/(^|-)(\w)/g, 
+          // function(s) { return s.toUpperCase(); });
+};
+
+// We suspect that ` + "`" + `initializeHeaders` + "`" + ` was once more complicated ...
+var initializeHeaders = function(object) {
+  return {};
+};
+
+// Access the ` + "`" + `_headers` + "`" + ` property using lazy initialization. **Warning:** If you
+// mix this into an object that is using the ` + "`" + `_headers` + "`" + ` property already, you're
+// going to have trouble.
+var $H = function(object) {
+  return object._headers||(object._headers=initializeHeaders(object));
+};
+
+// Hide the implementations as private functions, separate from how we expose them.
+
+// The "real" ` + "`" + `getHeader` + "`" + ` function: get the header after normalizing the name.
+var getHeader = function(object,name) {
+  return $H(object)[corsetCase(name)];
+};
+
+// The "real" ` + "`" + `getHeader` + "`" + ` function: get one or more headers, or all of them
+// if you don't ask for any specifics. 
+var getHeaders = function(object,names) {
+  var keys = (names && names.length>0) ? names : Object.keys($H(object));
+  var hash = keys.reduce(function(hash,key) {
+    hash[key] = getHeader(object,key);
+    return hash;
+  },{});
+  // Freeze the resulting hash so you don't mistakenly think you're modifying
+  // the real headers.
+  Object.freeze(hash);
+  return hash;
+};
+
+// The "real" ` + "`" + `setHeader` + "`" + ` function: set a header, after normalizing the name.
+var setHeader = function(object,name,value) {
+  $H(object)[corsetCase(name)] = value;
+  return object;
+};
+
+// The "real" ` + "`" + `setHeaders` + "`" + ` function: set multiple headers based on a hash.
+var setHeaders = function(object,hash) {
+  for( var key in hash ) { setHeader(object,key,hash[key]); };
+  return this;
+};
+
+// Here's where we actually bind the functionality to an object. These mixins work by
+// exposing mixin functions. Each function mixes in a specific batch of features.
+module.exports = {
+  
+  // Add getters.
+  getters: function(constructor) {
+    constructor.prototype.getHeader = function(name) { return getHeader(this,name); };
+    constructor.prototype.getHeaders = function() { return getHeaders(this,arguments); };
+  },
+  // Add setters but as "private" methods.
+  privateSetters: function(constructor) {
+    constructor.prototype._setHeader = function(key,value) { return setHeader(this,key,value); };
+    constructor.prototype._setHeaders = function(hash) { return setHeaders(this,hash); };
+  },
+  // Add setters.
+  setters: function(constructor) {
+    constructor.prototype.setHeader = function(key,value) { return setHeader(this,key,value); };
+    constructor.prototype.setHeaders = function(hash) { return setHeaders(this,hash); };
+  },
+  // Add both getters and setters.
+  gettersAndSetters: function(constructor) {
+    constructor.prototype.getHeader = function(name) { return getHeader(this,name); };
+    constructor.prototype.getHeaders = function() { return getHeaders(this,arguments); };
+    constructor.prototype.setHeader = function(key,value) { return setHeader(this,key,value); };
+    constructor.prototype.setHeaders = function(hash) { return setHeaders(this,hash); };
+  }
+};
+
+});
+
+require.define("/node_modules/iconv-lite/package.json", function (require, module, exports, __dirname, __filename) {
+    module.exports = {}
+});
+
+require.define("/node_modules/iconv-lite/index.js", function (require, module, exports, __dirname, __filename) {
+    // Module exports
+var iconv = module.exports = {
+    toEncoding: function(str, encoding) {
+        return iconv.getCodec(encoding).toEncoding(str);
+    },
+    fromEncoding: function(buf, encoding) {
+        return iconv.getCodec(encoding).fromEncoding(buf);
+    },
+    
+    defaultCharUnicode: '�',
+    defaultCharSingleByte: '?',
+    
+    // Get correct codec for given encoding.
+    getCodec: function(encoding) {
+        var enc = encoding || "utf8";
+        var codecOptions = undefined;
+        while (1) {
+            if (getType(enc) === "String")
+                enc = enc.replace(/[- ]/g, "").toLowerCase();
+            var codec = iconv.encodings[enc];
+            var type = getType(codec);
+            if (type === "String") {
+                // Link to other encoding.
+                codecOptions = {originalEncoding: enc};
+                enc = codec;
+            }
+            else if (type === "Object" && codec.type != undefined) {
+                // Options for other encoding.
+                codecOptions = codec;
+                enc = codec.type;
+            } 
+            else if (type === "Function")
+                // Codec itself.
+                return codec(codecOptions);
+            else
+                throw new Error("Encoding not recognized: '" + encoding + "' (searched as: '"+enc+"')");
+        }
+    },
+    
+    // Define basic encodings
+    encodings: {
+        internal: function(options) {
+            return {
+                toEncoding: function(str) {
+                    return new Buffer(ensureString(str), options.originalEncoding);
+                },
+                fromEncoding: function(buf) {
+                    return ensureBuffer(buf).toString(options.originalEncoding);
+                }
+            };
+        },
+        utf8: "internal",
+        ucs2: "internal",
+        binary: "internal",
+        ascii: "internal",
+        base64: "internal",
+        
+        // Codepage single-byte encodings.
+        singlebyte: function(options) {
+            // Prepare chars if needed
+            if (!options.chars || (options.chars.length !== 128 && options.chars.length !== 256))
+                throw new Error("Encoding '"+options.type+"' has incorrect 'chars' (must be of len 128 or 256)");
+            
+            if (options.chars.length === 128)
+                options.chars = asciiString + options.chars;
+            
+            if (!options.charsBuf) {
+                options.charsBuf = new Buffer(options.chars, 'ucs2');
+            }
+            
+            if (!options.revCharsBuf) {
+                options.revCharsBuf = new Buffer(65536);
+                var defChar = iconv.defaultCharSingleByte.charCodeAt(0);
+                for (var i = 0; i < options.revCharsBuf.length; i++)
+                    options.revCharsBuf[i] = defChar;
+                for (var i = 0; i < options.chars.length; i++)
+                    options.revCharsBuf[options.chars.charCodeAt(i)] = i;
+            }
+            
+            return {
+                toEncoding: function(str) {
+                    str = ensureString(str);
+                    
+                    var buf = new Buffer(str.length);
+                    var revCharsBuf = options.revCharsBuf;
+                    for (var i = 0; i < str.length; i++)
+                        buf[i] = revCharsBuf[str.charCodeAt(i)];
+                    
+                    return buf;
+                },
+                fromEncoding: function(buf) {
+                    buf = ensureBuffer(buf);
+                    
+                    // Strings are immutable in JS -> we use ucs2 buffer to speed up computations.
+                    var charsBuf = options.charsBuf;
+                    var newBuf = new Buffer(buf.length*2);
+                    var idx1 = 0, idx2 = 0;
+                    for (var i = 0, _len = buf.length; i < _len; i++) {
+                        idx1 = buf[i]*2; idx2 = i*2;
+                        newBuf[idx2] = charsBuf[idx1];
+                        newBuf[idx2+1] = charsBuf[idx1+1];
+                    }
+                    return newBuf.toString('ucs2');
+                }
+            };
+        },
+
+        // Codepage double-byte encodings.
+        table: function(options) {
+            var table = options.table, key, revCharsTable = options.revCharsTable;
+            if (!table) {
+                throw new Error("Encoding '" + options.type +"' has incorect 'table' option");
+            }
+            if(!revCharsTable) {
+                revCharsTable = options.revCharsTable = {};
+                for (key in table) {
+                    revCharsTable[table[key]] = parseInt(key);
+                }
+            }
+            
+            return {
+                toEncoding: function(str) {
+                    str = ensureString(str);
+                    var strLen = str.length;
+                    var bufLen = strLen;
+                    for (var i = 0; i < strLen; i++)
+                        if (str.charCodeAt(i) >> 7)
+                            bufLen++;
+
+                    var newBuf = new Buffer(bufLen), gbkcode, unicode, 
+                        defaultChar = revCharsTable[iconv.defaultCharUnicode.charCodeAt(0)];
+
+                    for (var i = 0, j = 0; i < strLen; i++) {
+                        unicode = str.charCodeAt(i);
+                        if (unicode >> 7) {
+                            gbkcode = revCharsTable[unicode] || defaultChar;
+                            newBuf[j++] = gbkcode >> 8; //high byte;
+                            newBuf[j++] = gbkcode & 0xFF; //low byte
+                        } else {//ascii
+                            newBuf[j++] = unicode;
+                        }
+                    }
+                    return newBuf;
+                },
+                fromEncoding: function(buf) {
+                    buf = ensureBuffer(buf);
+                    var bufLen = buf.length, strLen = 0;
+                    for (var i = 0; i < bufLen; i++) {
+                        strLen++;
+                        if (buf[i] & 0x80) //the high bit is 1, so this byte is gbkcode's high byte.skip next byte
+                            i++;
+                    }
+                    var newBuf = new Buffer(strLen*2), unicode, gbkcode,
+                        defaultChar = iconv.defaultCharUnicode.charCodeAt(0);
+                    
+                    for (var i = 0, j = 0; i < bufLen; i++, j+=2) {
+                        gbkcode = buf[i];
+                        if (gbkcode & 0x80) {
+                            gbkcode = (gbkcode << 8) + buf[++i];
+                            unicode = table[gbkcode] || defaultChar;
+                        } else {
+                            unicode = gbkcode;
+                        }
+                        newBuf[j] = unicode & 0xFF; //low byte
+                        newBuf[j+1] = unicode >> 8; //high byte
+                    }
+                    return newBuf.toString('ucs2');
+                }
+            }
+        }
+    }
+};
+
+// Add aliases to convert functions
+iconv.encode = iconv.toEncoding;
+iconv.decode = iconv.fromEncoding;
+
+// Load other encodings from files in /encodings dir.
+var encodingsDir = __dirname+"/encodings/",
+    fs = require('fs');
+fs.readdirSync(encodingsDir).forEach(function(file) {
+    if(fs.statSync(encodingsDir + file).isDirectory()) return;
+    var encodings = require(encodingsDir + file)
+    for (var key in encodings)
+        iconv.encodings[key] = encodings[key]
+});
+
+// Utilities
+var asciiString = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f'+
+              ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_` + "`" + `abcdefghijklmnopqrstuvwxyz{|}~\x7f';
+
+var ensureBuffer = function(buf) {
+    buf = buf || new Buffer(0);
+    return (buf instanceof Buffer) ? buf : new Buffer(buf.toString(), "utf8");
+}
+
+var ensureString = function(str) {
+    str = str || "";
+    return (str instanceof String) ? str : str.toString((str instanceof Buffer) ? 'utf8' : undefined);
+}
+
+var getType = function(obj) {
+    return Object.prototype.toString.call(obj).slice(8, -1);
+}
+
+
+});
+
+require.define("/node_modules/http-browserify/package.json", function (require, module, exports, __dirname, __filename) {
+    module.exports = {"main":"index.js","browserify":"browser.js"}
+});
+
+require.define("/node_modules/http-browserify/browser.js", function (require, module, exports, __dirname, __filename) {
+    var http = module.exports;
+var EventEmitter = require('events').EventEmitter;
+var Request = require('./lib/request');
+
+http.request = function (params, cb) {
+    if (!params) params = {};
+    if (!params.host) params.host = window.location.host.split(':')[0];
+    if (!params.port) params.port = window.location.port;
+    
+    var req = new Request(new xhrHttp, params);
+    if (cb) req.on('response', cb);
+    return req;
+};
+
+http.get = function (params, cb) {
+    params.method = 'GET';
+    var req = http.request(params, cb);
+    req.end();
+    return req;
+};
+
+var xhrHttp = (function () {
+    if (typeof window === 'undefined') {
+        throw new Error('no window object present');
+    }
+    else if (window.XMLHttpRequest) {
+        return window.XMLHttpRequest;
+    }
+    else if (window.ActiveXObject) {
+        var axs = [
+            'Msxml2.XMLHTTP.6.0',
+            'Msxml2.XMLHTTP.3.0',
+            'Microsoft.XMLHTTP'
+        ];
+        for (var i = 0; i < axs.length; i++) {
+            try {
+                var ax = new(window.ActiveXObject)(axs[i]);
+                return function () {
+                    if (ax) {
+                        var ax_ = ax;
+                        ax = null;
+                        return ax_;
+                    }
+                    else {
+                        return new(window.ActiveXObject)(axs[i]);
+                    }
+                };
+            }
+            catch (e) {}
+        }
+        throw new Error('ajax not supported in this browser')
+    }
+    else {
+        throw new Error('ajax not supported in this browser');
+    }
+})();
+
+http.STATUS_CODES = {
+    100 : 'Continue',
+    101 : 'Switching Protocols',
+    102 : 'Processing', // RFC 2518, obsoleted by RFC 4918
+    200 : 'OK',
+    201 : 'Created',
+    202 : 'Accepted',
+    203 : 'Non-Authoritative Information',
+    204 : 'No Content',
+    205 : 'Reset Content',
+    206 : 'Partial Content',
+    207 : 'Multi-Status', // RFC 4918
+    300 : 'Multiple Choices',
+    301 : 'Moved Permanently',
+    302 : 'Moved Temporarily',
+    303 : 'See Other',
+    304 : 'Not Modified',
+    305 : 'Use Proxy',
+    307 : 'Temporary Redirect',
+    400 : 'Bad Request',
+    401 : 'Unauthorized',
+    402 : 'Payment Required',
+    403 : 'Forbidden',
+    404 : 'Not Found',
+    405 : 'Method Not Allowed',
+    406 : 'Not Acceptable',
+    407 : 'Proxy Authentication Required',
+    408 : 'Request Time-out',
+    409 : 'Conflict',
+    410 : 'Gone',
+    411 : 'Length Required',
+    412 : 'Precondition Failed',
+    413 : 'Request Entity Too Large',
+    414 : 'Request-URI Too Large',
+    415 : 'Unsupported Media Type',
+    416 : 'Requested Range Not Satisfiable',
+    417 : 'Expectation Failed',
+    418 : 'I\'m a teapot', // RFC 2324
+    422 : 'Unprocessable Entity', // RFC 4918
+    423 : 'Locked', // RFC 4918
+    424 : 'Failed Dependency', // RFC 4918
+    425 : 'Unordered Collection', // RFC 4918
+    426 : 'Upgrade Required', // RFC 2817
+    500 : 'Internal Server Error',
+    501 : 'Not Implemented',
+    502 : 'Bad Gateway',
+    503 : 'Service Unavailable',
+    504 : 'Gateway Time-out',
+    505 : 'HTTP Version not supported',
+    506 : 'Variant Also Negotiates', // RFC 2295
+    507 : 'Insufficient Storage', // RFC 4918
+    509 : 'Bandwidth Limit Exceeded',
+    510 : 'Not Extended' // RFC 2774
+};
+
+});
+
+require.define("/node_modules/http-browserify/lib/request.js", function (require, module, exports, __dirname, __filename) {
+    var EventEmitter = require('events').EventEmitter;
+var Response = require('./response');
+var isSafeHeader = require('./isSafeHeader');
+
+var Request = module.exports = function (xhr, params) {
+    var self = this;
+    self.xhr = xhr;
+    self.body = '';
+    
+    var uri = params.host + ':' + params.port + (params.path || '/');
+    
+    xhr.open(
+        params.method || 'GET',
+        (params.scheme || 'http') + '://' + uri,
+        true
+    );
+    
+    if (params.headers) {
+        Object.keys(params.headers).forEach(function (key) {
+            if (!isSafeHeader(key)) return;
+            var value = params.headers[key];
+            if (Array.isArray(value)) {
+                value.forEach(function (v) {
+                    xhr.setRequestHeader(key, v);
+                });
+            }
+            else xhr.setRequestHeader(key, value)
+        });
+    }
+    
+    var res = new Response(xhr);
+    res.on('ready', function () {
+        self.emit('response', res);
+    });
+    
+    xhr.onreadystatechange = function () {
+        res.handle(xhr);
+    };
+};
+
+Request.prototype = new EventEmitter;
+
+Request.prototype.setHeader = function (key, value) {
+    if ((Array.isArray && Array.isArray(value))
+    || value instanceof Array) {
+        for (var i = 0; i < value.length; i++) {
+            this.xhr.setRequestHeader(key, value[i]);
+        }
+    }
+    else {
+        this.xhr.setRequestHeader(key, value);
+    }
+};
+
+Request.prototype.write = function (s) {
+    this.body += s;
+};
+
+Request.prototype.end = function (s) {
+    if (s !== undefined) this.write(s);
+    this.xhr.send(this.body);
+};
+
+});
+
+require.define("/node_modules/http-browserify/lib/response.js", function (require, module, exports, __dirname, __filename) {
+    var EventEmitter = require('events').EventEmitter;
+var isSafeHeader = require('./isSafeHeader');
+
+var Response = module.exports = function (xhr) {
+    this.xhr = xhr;
+    this.offset = 0;
+};
+
+Response.prototype = new EventEmitter;
+
+var capable = {
+    streaming : true,
+    status2 : true
+};
+
+function parseHeaders (xhr) {
+    var lines = xhr.getAllResponseHeaders().split(/\r?\n/);
+    var headers = {};
+    for (var i = 0; i < lines.length; i++) {
+        var line = lines[i];
+        if (line === '') continue;
+        
+        var m = line.match(/^([^:]+):\s*(.*)/);
+        if (m) {
+            var key = m[1].toLowerCase(), value = m[2];
+            
+            if (headers[key] !== undefined) {
+                if ((Array.isArray && Array.isArray(headers[key]))
+                || headers[key] instanceof Array) {
+                    headers[key].push(value);
+                }
+                else {
+                    headers[key] = [ headers[key], value ];
+                }
+            }
+            else {
+                headers[key] = value;
+            }
+        }
+        else {
+            headers[line] = true;
+        }
+    }
+    return headers;
+}
+
+Response.prototype.getHeader = function (key) {
+    var header = this.headers ? this.headers[key.toLowerCase()] : null;
+    if (header) return header;
+
+    // Work around Mozilla bug #608735 [https://bugzil.la/608735], which causes
+    // getAllResponseHeaders() to return {} if the response is a CORS request.
+    // xhr.getHeader still works correctly.
+    if (isSafeHeader(key)) {
+      return this.xhr.getResponseHeader(key);
+    }
+    return null;
+};
+
+Response.prototype.handle = function () {
+    var xhr = this.xhr;
+    if (xhr.readyState === 2 && capable.status2) {
+        try {
+            this.statusCode = xhr.status;
+            this.headers = parseHeaders(xhr);
+        }
+        catch (err) {
+            capable.status2 = false;
+        }
+        
+        if (capable.status2) {
+            this.emit('ready');
+        }
+    }
+    else if (capable.streaming && xhr.readyState === 3) {
+        try {
+            if (!this.statusCode) {
+                this.statusCode = xhr.status;
+                this.headers = parseHeaders(xhr);
+                this.emit('ready');
+            }
+        }
+        catch (err) {}
+        
+        try {
+            this.write();
+        }
+        catch (err) {
+            capable.streaming = false;
+        }
+    }
+    else if (xhr.readyState === 4) {
+        if (!this.statusCode) {
+            this.statusCode = xhr.status;
+            this.emit('ready');
+        }
+        this.write();
+        
+        if (xhr.error) {
+            this.emit('error', xhr.responseText);
+        }
+        else this.emit('end');
+    }
+};
+
+Response.prototype.write = function () {
+    var xhr = this.xhr;
+    if (xhr.responseText.length > this.offset) {
+        this.emit('data', xhr.responseText.slice(this.offset));
+        this.offset = xhr.responseText.length;
+    }
+};
+
+});
+
+require.define("/node_modules/http-browserify/lib/isSafeHeader.js", function (require, module, exports, __dirname, __filename) {
+    // Taken from http://dxr.mozilla.org/mozilla/mozilla-central/content/base/src/nsXMLHttpRequest.cpp.html
+var unsafeHeaders = [
+    "accept-charset",
+    "accept-encoding",
+    "access-control-request-headers",
+    "access-control-request-method",
+    "connection",
+    "content-length",
+    "cookie",
+    "cookie2",
+    "content-transfer-encoding",
+    "date",
+    "expect",
+    "host",
+    "keep-alive",
+    "origin",
+    "referer",
+    "set-cookie",
+    "te",
+    "trailer",
+    "transfer-encoding",
+    "upgrade",
+    "user-agent",
+    "via"
+];
+
+module.exports = function (headerName) {
+    if (!headerName) return false;
+    return (unsafeHeaders.indexOf(headerName.toLowerCase()) === -1)
+};
+
+});
+
+require.alias("http-browserify", "/node_modules/http");
+
+require.alias("http-browserify", "/node_modules/https");`)
+
+func third_partySwaggerUiLibShredBundleJsBytes() ([]byte, error) {
+	return _third_partySwaggerUiLibShredBundleJs, nil
+}
+
+func third_partySwaggerUiLibShredBundleJs() (*asset, error) {
+	bytes, err := third_partySwaggerUiLibShredBundleJsBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/lib/shred.bundle.js", size: 88050, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiLibSwaggerClientJs = []byte(`/**
+ * swagger-client - swagger.js is a javascript client for use with swaggering APIs.
+ * @version v2.1.1-M1
+ * @link http://swagger.io
+ * @license apache 2.0
+ */
+(function(){
+var ArrayModel = function(definition) {
+  this.name = "arrayModel";
+  this.definition = definition || {};
+  this.properties = [];
+  
+  var requiredFields = definition.enum || [];
+  var innerType = definition.items;
+  if(innerType) {
+    if(innerType.type) {
+      this.type = typeFromJsonSchema(innerType.type, innerType.format);
+    }
+    else {
+      this.ref = innerType.$ref;
+    }
+  }
+  return this;
+};
+
+ArrayModel.prototype.createJSONSample = function(modelsToIgnore) {
+  var result;
+  modelsToIgnore = (modelsToIgnore||{});
+  if(this.type) {
+    result = this.type;
+  }
+  else if (this.ref) {
+    var name = simpleRef(this.ref);
+    if(typeof modelsToIgnore[name] === 'undefined') {
+      modelsToIgnore[name] = this;
+      result = models[name].createJSONSample(modelsToIgnore);
+    }
+    else {
+      return name;
+    }
+  }
+  return [ result ];
+};
+
+ArrayModel.prototype.getSampleValue = function(modelsToIgnore) {
+  var result;
+  modelsToIgnore = (modelsToIgnore || {});
+  if(this.type) {
+    result = type;
+  }
+  else if (this.ref) {
+    var name = simpleRef(this.ref);
+    result = models[name].getSampleValue(modelsToIgnore);
+  }
+  return [ result ];
+};
+
+ArrayModel.prototype.getMockSignature = function(modelsToIgnore) {
+  var propertiesStr = [];
+
+  if(this.ref) {
+    return models[simpleRef(this.ref)].getMockSignature();
+  }
+};
+
+
+/**
+ * SwaggerAuthorizations applys the correct authorization to an operation being executed
+ */
+var SwaggerAuthorizations = function() {
+  this.authz = {};
+};
+
+SwaggerAuthorizations.prototype.add = function(name, auth) {
+  this.authz[name] = auth;
+  return auth;
+};
+
+SwaggerAuthorizations.prototype.remove = function(name) {
+  return delete this.authz[name];
+};
+
+SwaggerAuthorizations.prototype.apply = function (obj, authorizations) {
+  var status = null;
+  var key, value, result;
+
+  // if the "authorizations" key is undefined, or has an empty array, add all keys
+  if (typeof authorizations === 'undefined' || Object.keys(authorizations).length == 0) {
+    for (key in this.authz) {
+      value = this.authz[key];
+      result = value.apply(obj, authorizations);
+      if (result === true)
+        status = true;
+    }
+  }
+  else {
+    // 2.0 support
+    if (Array.isArray(authorizations)) {
+
+      for (var i = 0; i < authorizations.length; i++) {
+        var auth = authorizations[i];
+        for (name in auth) {
+          for (key in this.authz) {
+            if (key == name) {
+              value = this.authz[key];
+              result = value.apply(obj, authorizations);
+              if (result === true)
+                status = true;
+            }
+          }
+        }
+      }
+    }
+    else {
+      // 1.2 support
+      for (name in authorizations) {
+        for (key in this.authz) {
+          if (key == name) {
+            value = this.authz[key];
+            result = value.apply(obj, authorizations);
+            if (result === true)
+              status = true;
+          }
+        }
+      }
+    }
+  }
+
+  return status;
+};
+
+/**
+ * ApiKeyAuthorization allows a query param or header to be injected
+ */
+var ApiKeyAuthorization = function(name, value, type) {
+  this.name = name;
+  this.value = value;
+  this.type = type;
+};
+
+ApiKeyAuthorization.prototype.apply = function(obj, authorizations) {
+  if (this.type === "query") {
+    if (obj.url.indexOf('?') > 0)
+      obj.url = obj.url + "&" + this.name + "=" + this.value;
+    else
+      obj.url = obj.url + "?" + this.name + "=" + this.value;
+    return true;
+  } else if (this.type === "header") {
+    obj.headers[this.name] = this.value;
+    return true;
+  }
+};
+
+var CookieAuthorization = function(cookie) {
+  this.cookie = cookie;
+};
+
+CookieAuthorization.prototype.apply = function(obj, authorizations) {
+  obj.cookieJar = obj.cookieJar || CookieJar();
+  obj.cookieJar.setCookie(this.cookie);
+  return true;
+};
+
+/**
+ * Password Authorization is a basic auth implementation
+ */
+var PasswordAuthorization = function(name, username, password) {
+  this.name = name;
+  this.username = username;
+  this.password = password;
+  this._btoa = null;
+  if (typeof window !== 'undefined')
+    this._btoa = btoa;
+  else
+    this._btoa = require("btoa");
+};
+
+PasswordAuthorization.prototype.apply = function(obj, authorizations) {
+  var base64encoder = this._btoa;
+  obj.headers.Authorization = "Basic " + base64encoder(this.username + ":" + this.password);
+  return true;
+};
+var __bind = function(fn, me){
+  return function(){
+    return fn.apply(me, arguments);
+  };
+};
+
+fail = function(message) {
+  log(message);
+};
+
+log = function(){
+  log.history = log.history || [];
+  log.history.push(arguments);
+  if(this.console){
+    console.log( Array.prototype.slice.call(arguments)[0] );
+  }
+};
+
+if (!Array.prototype.indexOf) {
+  Array.prototype.indexOf = function(obj, start) {
+    for (var i = (start || 0), j = this.length; i < j; i++) {
+      if (this[i] === obj) { return i; }
+    }
+    return -1;
+  };
+}
+
+/**
+ * allows override of the default value based on the parameter being
+ * supplied
+ **/
+var applyParameterMacro = function (operation, parameter) {
+  var e = (typeof window !== 'undefined' ? window : exports);
+  if(e.parameterMacro)
+    return e.parameterMacro(operation, parameter);
+  else
+    return parameter.defaultValue;
+};
+
+/**
+ * allows overriding the default value of an model property
+ **/
+var applyModelPropertyMacro = function (model, property) {
+  var e = (typeof window !== 'undefined' ? window : exports);
+  if(e.modelPropertyMacro)
+    return e.modelPropertyMacro(model, property);
+  else
+    return property.defaultValue;
+};
+
+/**
+ * PrimitiveModel
+ **/
+var PrimitiveModel = function(definition) {
+  this.name = "name";
+  this.definition = definition || {};
+  this.properties = [];
+
+  var requiredFields = definition.enum || [];
+  this.type = typeFromJsonSchema(definition.type, definition.format);
+};
+
+PrimitiveModel.prototype.createJSONSample = function(modelsToIgnore) {
+  var result = this.type;
+  return result;
+};
+
+PrimitiveModel.prototype.getSampleValue = function() {
+  var result = this.type;
+  return null;
+};
+
+PrimitiveModel.prototype.getMockSignature = function(modelsToIgnore) {
+  var propertiesStr = [];
+  var i, prop;
+  for (i = 0; i < this.properties.length; i++) {
+    prop = this.properties[i];
+    propertiesStr.push(prop.toString());
+  }
+
+  var strong = '<span class="strong">';
+  var stronger = '<span class="stronger">';
+  var strongClose = '</span>';
+  var classOpen = strong + this.name + ' {' + strongClose;
+  var classClose = strong + '}' + strongClose;
+  var returnVal = classOpen + '<div>' + propertiesStr.join(',</div><div>') + '</div>' + classClose;
+
+  if (!modelsToIgnore)
+    modelsToIgnore = {};
+  modelsToIgnore[this.name] = this;
+  for (i = 0; i < this.properties.length; i++) {
+    prop = this.properties[i];
+    var ref = prop.$ref;
+    var model = models[ref];
+    if (model && typeof modelsToIgnore[ref] === 'undefined') {
+      returnVal = returnVal + ('<br>' + model.getMockSignature(modelsToIgnore));
+    }
+  }
+  return returnVal;
+};
+var SwaggerClient = function(url, options) {
+  this.isBuilt = false;
+  this.url = null;
+  this.debug = false;
+  this.basePath = null;
+  this.modelsArray = [];
+  this.authorizations = null;
+  this.authorizationScheme = null;
+  this.isValid = false;
+  this.info = null;
+  this.useJQuery = false;
+
+  if(typeof url !== 'undefined')
+    return this.initialize(url, options);
+};
+
+SwaggerClient.prototype.initialize = function (url, options) {
+  this.models = models;
+
+  options = (options||{});
+
+  if(typeof url === 'string')
+    this.url = url;
+  else if(typeof url === 'object') {
+    options = url;
+    this.url = options.url;
+  }
+  this.swaggerRequstHeaders = options.swaggerRequstHeaders || 'application/json;charset=utf-8,*/*';
+  this.defaultSuccessCallback = options.defaultSuccessCallback || null;
+  this.defaultErrorCallback = options.defaultErrorCallback || null;
+
+  if (typeof options.success === 'function')
+    this.success = options.success;
+
+  if (options.useJQuery)
+    this.useJQuery = options.useJQuery;
+
+  if (options.authorizations) {
+    this.clientAuthorizations = options.authorizations;
+  } else {
+    var e = (typeof window !== 'undefined' ? window : exports);
+    this.clientAuthorizations = e.authorizations;
+  }
+
+  this.supportedSubmitMethods = options.supportedSubmitMethods || [];
+  this.failure = options.failure || function() {};
+  this.progress = options.progress || function() {};
+  this.spec = options.spec;
+  this.options = options;
+
+  if (typeof options.success === 'function') {
+    this.build();
+  }
+};
+
+SwaggerClient.prototype.build = function(mock) {
+  if (this.isBuilt) return this;
+  var self = this;
+  this.progress('fetching resource list: ' + this.url);
+  var obj = {
+    useJQuery: this.useJQuery,
+    url: this.url,
+    method: "get",
+    headers: {
+      accept: this.swaggerRequstHeaders
+    },
+    on: {
+      error: function(response) {
+        if (self.url.substring(0, 4) !== 'http')
+          return self.fail('Please specify the protocol for ' + self.url);
+        else if (response.status === 0)
+          return self.fail('Can\'t read from server.  It may not have the appropriate access-control-origin settings.');
+        else if (response.status === 404)
+          return self.fail('Can\'t read swagger JSON from ' + self.url);
+        else
+          return self.fail(response.status + ' : ' + response.statusText + ' ' + self.url);
+      },
+      response: function(resp) {
+        var responseObj = resp.obj || JSON.parse(resp.data);
+        self.swaggerVersion = responseObj.swaggerVersion;
+
+        if(responseObj.swagger && parseInt(responseObj.swagger) === 2) {
+          self.swaggerVersion = responseObj.swagger;
+          self.buildFromSpec(responseObj);
+          self.isValid = true;
+        }
+        else {
+          if (self.swaggerVersion === '1.2') {
+            return self.buildFrom1_2Spec(responseObj);
+          } else {
+            return self.buildFrom1_1Spec(responseObj);
+          }
+        }
+      }
+    }
+  };
+  if(this.spec) {
+    setTimeout(function() { self.buildFromSpec(self.spec); }, 10);
+  }
+  else {
+    var e = (typeof window !== 'undefined' ? window : exports);
+    var status = e.authorizations.apply(obj);
+    if(mock)
+      return obj;
+    new SwaggerHttp().execute(obj);
+  }
+
+  return this;
+};
+
+SwaggerClient.prototype.buildFromSpec = function(response) {
+  if(this.isBuilt) return this;
+
+  this.info = response.info || {};
+  this.title = response.title || '';
+  this.host = response.host || '';
+  this.schemes = response.schemes || [];
+  this.basePath = response.basePath || '';
+  this.apis = {};
+  this.apisArray = [];
+  this.consumes = response.consumes;
+  this.produces = response.produces;
+  this.securityDefinitions = response.securityDefinitions;
+
+  // legacy support
+  this.authSchemes = response.securityDefinitions;
+
+  var location;
+
+  if(typeof this.url === 'string') {
+    location = this.parseUri(this.url);
+  }
+
+  if(typeof this.schemes === 'undefined' || this.schemes.length === 0) {
+    this.scheme = location.scheme || 'http';
+  }
+  else {
+    this.scheme = this.schemes[0];
+  }
+
+  if(typeof this.host === 'undefined' || this.host === '') {
+    this.host = location.host;
+    if (location.port) {
+      this.host = this.host + ':' + location.port;
+    }
+  }
+
+  this.definitions = response.definitions;
+  var key;
+  for(key in this.definitions) {
+    var model = new Model(key, this.definitions[key]);
+    if(model) {
+      models[key] = model;
+    }
+  }
+
+  // get paths, create functions for each operationId
+  var path;
+  var operations = [];
+  for(path in response.paths) {
+    if(typeof response.paths[path] === 'object') {
+      var httpMethod;
+      for(httpMethod in response.paths[path]) {
+        if(['delete', 'get', 'head', 'options', 'patch', 'post', 'put'].indexOf(httpMethod) === -1) {
+          continue;
+        }
+        var operation = response.paths[path][httpMethod];
+        var tags = operation.tags;
+        if(typeof tags === 'undefined') {
+          operation.tags = [ 'default' ];
+          tags = operation.tags;
+        }
+        var operationId = this.idFromOp(path, httpMethod, operation);
+        var operationObject = new Operation (
+          this,
+          operation.scheme,
+          operationId,
+          httpMethod,
+          path,
+          operation,
+          this.definitions
+        );
+        // bind this operation's execute command to the api
+        if(tags.length > 0) {
+          var i;
+          for(i = 0; i < tags.length; i++) {
+            var tag = this.tagFromLabel(tags[i]);
+            var operationGroup = this[tag];
+            if(typeof operationGroup === 'undefined') {
+              this[tag] = [];
+              operationGroup = this[tag];
+              operationGroup.operations = {};
+              operationGroup.label = tag;
+              operationGroup.apis = [];
+              this[tag].help = this.help.bind(operationGroup);
+              this.apisArray.push(new OperationGroup(tag, operationObject));
+            }
+            operationGroup[operationId] = operationObject.execute.bind(operationObject);
+            operationGroup[operationId].help = operationObject.help.bind(operationObject);
+            operationGroup.apis.push(operationObject);
+            operationGroup.operations[operationId] = operationObject;
+
+            // legacy UI feature
+            var j;
+            var api;
+            for(j = 0; j < this.apisArray.length; j++) {
+              if(this.apisArray[j].tag === tag) {
+                api = this.apisArray[j];
+              }
+            }
+            if(api) {
+              api.operationsArray.push(operationObject);
+            }
+          }
+        }
+        else {
+          log('no group to bind to');
+        }
+      }
+    }
+  }
+  this.isBuilt = true;
+  if (this.success)
+    this.success();
+  return this;
+};
+
+SwaggerClient.prototype.parseUri = function(uri) {
+  var urlParseRE = /^(((([^:\/#\?]+:)?(?:(\/\/)((?:(([^:@\/#\?]+)(?:\:([^:@\/#\?]+))?)@)?(([^:\/#\?\]\[]+|\[[^\/\]@#?]+\])(?:\:([0-9]+))?))?)?)?((\/?(?:[^\/\?#]+\/+)*)([^\?#]*)))?(\?[^#]+)?)(#.*)?/;
+  var parts = urlParseRE.exec(uri);
+  return {
+    scheme: parts[4].replace(':',''),
+    host: parts[11],
+    port: parts[12],
+    path: parts[15]
+  };
+};
+
+SwaggerClient.prototype.help = function() {
+  var i;
+  log('operations for the "' + this.label + '" tag');
+  for(i = 0; i < this.apis.length; i++) {
+    var api = this.apis[i];
+    log('  * ' + api.nickname + ': ' + api.operation.summary);
+  }
+};
+
+SwaggerClient.prototype.tagFromLabel = function(label) {
+  return label;
+};
+
+SwaggerClient.prototype.idFromOp = function(path, httpMethod, op) {
+  var opId = op.operationId || (path.substring(1) + '_' + httpMethod);
+  return opId.replace(/[\.,-\/#!$%\^&\*;:{}=\-_` + "`" + `~()\+\s]/g,'_');
+};
+
+SwaggerClient.prototype.fail = function(message) {
+  this.failure(message);
+  throw message;
+};
+
+var OperationGroup = function(tag, operation) {
+  this.tag = tag;
+  this.path = tag;
+  this.name = tag;
+  this.operation = operation;
+  this.operationsArray = [];
+
+  this.description = operation.description || "";
+};
+
+var Operation = function(parent, scheme, operationId, httpMethod, path, args, definitions) {
+  var errors = [];
+  parent = parent||{};
+  args = args||{};
+
+  this.operations = {};
+  this.operation = args;
+  this.deprecated = args.deprecated;
+  this.consumes = args.consumes;
+  this.produces = args.produces;
+  this.parent = parent;
+  this.host = parent.host || 'localhost';
+  this.schemes = parent.schemes;
+  this.scheme = scheme || parent.scheme || 'http';
+  this.basePath = parent.basePath || '/';
+  this.nickname = (operationId||errors.push('Operations must have a nickname.'));
+  this.method = (httpMethod||errors.push('Operation ' + operationId + ' is missing method.'));
+  this.path = (path||errors.push('Operation ' + this.nickname + ' is missing path.'));
+  this.parameters = args !== null ? (args.parameters||[]) : {};
+  this.summary = args.summary || '';
+  this.responses = (args.responses||{});
+  this.type = null;
+  this.security = args.security;
+  this.authorizations = args.security;
+  this.description = args.description;
+  this.useJQuery = parent.useJQuery;
+
+  if(definitions) {
+    // add to global models
+    var key;
+    for(key in this.definitions) {
+      var model = new Model(key, definitions[key]);
+      if(model) {
+        models[key] = model;
+      }
+    }
+  }
+
+  var i;
+  for(i = 0; i < this.parameters.length; i++) {
+    var param = this.parameters[i];
+    if(param.type === 'array') {
+      param.isList = true;
+      param.allowMultiple = true;
+    }
+    var innerType = this.getType(param);
+    if(innerType && innerType.toString().toLowerCase() === 'boolean') {
+      param.allowableValues = {};
+      param.isList = true;
+      param['enum'] = ["true", "false"];
+    }
+    if(typeof param['enum'] !== 'undefined') {
+      var id;
+      param.allowableValues = {};
+      param.allowableValues.values = [];
+      param.allowableValues.descriptiveValues = [];
+      for(id = 0; id < param['enum'].length; id++) {
+        var value = param['enum'][id];
+        var isDefault = (value === param.default) ? true : false;
+        param.allowableValues.values.push(value);
+        param.allowableValues.descriptiveValues.push({value : value, isDefault: isDefault});
+      }
+    }
+    if(param.type === 'array') {
+      innerType = [innerType];
+      if(typeof param.allowableValues === 'undefined') {
+        // can't show as a list if no values to select from
+        delete param.isList;
+        delete param.allowMultiple;
+      }
+    }
+    param.signature = this.getModelSignature(innerType, models).toString();
+    param.sampleJSON = this.getModelSampleJSON(innerType, models);
+    param.responseClassSignature = param.signature;
+  }
+
+  var defaultResponseCode, response, model, responses = this.responses;
+
+  if(responses['200']) {
+    response = responses['200'];
+    defaultResponseCode = '200';
+  }
+  else if(responses['201']) {
+    response = responses['201'];
+    defaultResponseCode = '201';
+  }
+  else if(responses['202']) {
+    response = responses['202'];
+    defaultResponseCode = '202';
+  }
+  else if(responses['203']) {
+    response = responses['203'];
+    defaultResponseCode = '203';
+  }
+  else if(responses['204']) {
+    response = responses['204'];
+    defaultResponseCode = '204';
+  }
+  else if(responses['205']) {
+    response = responses['205'];
+    defaultResponseCode = '205';
+  }
+  else if(responses['206']) {
+    response = responses['206'];
+    defaultResponseCode = '206';
+  }
+  else if(responses['default']) {
+    response = responses['default'];
+    defaultResponseCode = 'default';
+  }
+
+  if(response && response.schema) {
+    var resolvedModel = this.resolveModel(response.schema, definitions);
+    delete responses[defaultResponseCode];
+    if(resolvedModel) {
+      this.successResponse = {};
+      this.successResponse[defaultResponseCode] = resolvedModel;
+    }
+    else {
+      this.successResponse = {};
+      this.successResponse[defaultResponseCode] = response.schema.type;
+    }
+    this.type = response;
+  }
+
+  if (errors.length > 0) {
+    if(this.resource && this.resource.api && this.resource.api.fail)
+      this.resource.api.fail(errors);
+  }
+
+  return this;
+};
+
+OperationGroup.prototype.sort = function(sorter) {
+
+};
+
+Operation.prototype.getType = function (param) {
+  var type = param.type;
+  var format = param.format;
+  var isArray = false;
+  var str;
+  if(type === 'integer' && format === 'int32')
+    str = 'integer';
+  else if(type === 'integer' && format === 'int64')
+    str = 'long';
+  else if(type === 'integer')
+    str = 'integer';
+  else if(type === 'string' && format === 'date-time')
+    str = 'date-time';
+  else if(type === 'string' && format === 'date')
+    str = 'date';
+  else if(type === 'number' && format === 'float')
+    str = 'float';
+  else if(type === 'number' && format === 'double')
+    str = 'double';
+  else if(type === 'number')
+    str = 'double';
+  else if(type === 'boolean')
+    str = 'boolean';
+  else if(type === 'string')
+    str = 'string';
+  else if(type === 'array') {
+    isArray = true;
+    if(param.items)
+      str = this.getType(param.items);
+  }
+  if(param.$ref)
+    str = param.$ref;
+
+  var schema = param.schema;
+  if(schema) {
+    var ref = schema.$ref;
+    if(ref) {
+      ref = simpleRef(ref);
+      if(isArray)
+        return [ ref ];
+      else
+        return ref;
+    }
+    else
+      return this.getType(schema);
+  }
+  if(isArray)
+    return [ str ];
+  else
+    return str;
+};
+
+Operation.prototype.resolveModel = function (schema, definitions) {
+  if(typeof schema.$ref !== 'undefined') {
+    var ref = schema.$ref;
+    if(ref.indexOf('#/definitions/') === 0)
+      ref = ref.substring('#/definitions/'.length);
+    if(definitions[ref]) {
+      return new Model(ref, definitions[ref]);
+    }
+  }
+  if(schema.type === 'array')
+    return new ArrayModel(schema);
+  else
+    return null;
+};
+
+Operation.prototype.help = function(dontPrint) {
+  var out = this.nickname + ': ' + this.summary + '\n';
+  for(var i = 0; i < this.parameters.length; i++) {
+    var param = this.parameters[i];
+    var typeInfo = typeFromJsonSchema(param.type, param.format);
+    out += '\n  * ' + param.name + ' (' + typeInfo + '): ' + param.description;
+  }
+  if(typeof dontPrint === 'undefined')
+    log(out);
+  return out;
+};
+
+Operation.prototype.getModelSignature = function(type, definitions) {
+  var isPrimitive, listType;
+
+  if(type instanceof Array) {
+    listType = true;
+    type = type[0];
+  }
+  else if(typeof type === 'undefined')
+    type = 'undefined';
+
+  if(type === 'string')
+    isPrimitive = true;
+  else
+    isPrimitive = (listType && definitions[listType]) || (definitions[type]) ? false : true;
+  if (isPrimitive) {
+    if(listType)
+      return 'Array[' + type + ']';
+    else
+      return type.toString();
+  } else {
+    if (listType)
+      return 'Array[' + definitions[type].getMockSignature() + ']';
+    else
+      return definitions[type].getMockSignature();
+  }
+};
+
+Operation.prototype.supportHeaderParams = function () {
+  return true;
+};
+
+Operation.prototype.supportedSubmitMethods = function () {
+  return this.parent.supportedSubmitMethods;
+};
+
+Operation.prototype.getHeaderParams = function (args) {
+  var headers = this.setContentTypes(args, {});
+  for(var i = 0; i < this.parameters.length; i++) {
+    var param = this.parameters[i];
+    if(typeof args[param.name] !== 'undefined') {
+      if (param.in === 'header') {
+        var value = args[param.name];
+        if(Array.isArray(value))
+          value = this.encodePathCollection(param.collectionFormat, param.name, value);
+        else
+          value = this.encodePathParam(value);
+        headers[param.name] = value;
+      }
+    }
+  }
+  return headers;
+};
+
+Operation.prototype.urlify = function (args) {
+  var formParams = {};
+  var requestUrl = this.path;
+
+  // grab params from the args, build the querystring along the way
+  var querystring = '';
+  for(var i = 0; i < this.parameters.length; i++) {
+    var param = this.parameters[i];
+    if(typeof args[param.name] !== 'undefined') {
+      if(param.in === 'path') {
+        var reg = new RegExp('\{' + param.name + '\}', 'gi');
+        var value = args[param.name];
+        if(Array.isArray(value))
+          value = this.encodePathCollection(param.collectionFormat, param.name, value);
+        else
+          value = this.encodePathParam(value);
+        requestUrl = requestUrl.replace(reg, value);
+      }
+      else if (param.in === 'query' && typeof args[param.name] !== 'undefined') {
+        if(querystring === '')
+          querystring += '?';
+        else
+          querystring += '&';
+        if(typeof param.collectionFormat !== 'undefined') {
+          var qp = args[param.name];
+          if(Array.isArray(qp))
+            querystring += this.encodeQueryCollection(param.collectionFormat, param.name, qp);
+          else
+            querystring += this.encodeQueryParam(param.name) + '=' + this.encodeQueryParam(args[param.name]);
+        }
+        else
+          querystring += this.encodeQueryParam(param.name) + '=' + this.encodeQueryParam(args[param.name]);
+      }
+      else if (param.in === 'formData')
+        formParams[param.name] = args[param.name];
+    }
+  }
+  var url = this.scheme + '://' + this.host;
+
+  if(this.basePath !== '/')
+    url += this.basePath;
+
+  return url + requestUrl + querystring;
+};
+
+Operation.prototype.getMissingParams = function(args) {
+  var missingParams = [];
+  // check required params, track the ones that are missing
+  var i;
+  for(i = 0; i < this.parameters.length; i++) {
+    var param = this.parameters[i];
+    if(param.required === true) {
+      if(typeof args[param.name] === 'undefined')
+        missingParams = param.name;
+    }
+  }
+  return missingParams;
+};
+
+Operation.prototype.getBody = function(headers, args) {
+  var formParams = {};
+  var body;
+
+  for(var i = 0; i < this.parameters.length; i++) {
+    var param = this.parameters[i];
+    if(typeof args[param.name] !== 'undefined') {
+      if (param.in === 'body') {
+        body = args[param.name];
+      } else if(param.in === 'formData') {
+        formParams[param.name] = args[param.name];
+      }
+    }
+  }
+
+  // handle form params
+  if(headers['Content-Type'] === 'application/x-www-form-urlencoded') {
+    var encoded = "";
+    var key;
+    for(key in formParams) {
+      value = formParams[key];
+      if(typeof value !== 'undefined'){
+        if(encoded !== "")
+          encoded += "&";
+        encoded += encodeURIComponent(key) + '=' + encodeURIComponent(value);
+      }
+    }
+    body = encoded;
+  }
+
+  return body;
+};
+
+/**
+ * gets sample response for a single operation
+ **/
+Operation.prototype.getModelSampleJSON = function(type, models) {
+  var isPrimitive, listType, sampleJson;
+
+  listType = (type instanceof Array);
+  isPrimitive = models[type] ? false : true;
+  sampleJson = isPrimitive ? void 0 : models[type].createJSONSample();
+  if (sampleJson) {
+    sampleJson = listType ? [sampleJson] : sampleJson;
+    if(typeof sampleJson == 'string')
+      return sampleJson;
+    else if(typeof sampleJson === 'object') {
+      var t = sampleJson;
+      if(sampleJson instanceof Array && sampleJson.length > 0) {
+        t = sampleJson[0];
+      }
+      if(t.nodeName) {
+        var xmlString = new XMLSerializer().serializeToString(t);
+        return this.formatXml(xmlString);
+      }
+      else
+        return JSON.stringify(sampleJson, null, 2);
+    }
+    else
+      return sampleJson;
+  }
+};
+
+/**
+ * legacy binding
+ **/
+Operation.prototype["do"] = function(args, opts, callback, error, parent) {
+  return this.execute(args, opts, callback, error, parent);
+};
+
+
+/**
+ * executes an operation
+ **/
+Operation.prototype.execute = function(arg1, arg2, arg3, arg4, parent) {
+  var args = arg1 || {};
+  var opts = {}, success, error;
+  if(typeof arg2 === 'object') {
+    opts = arg2;
+    success = arg3;
+    error = arg4;
+  }
+
+  if(typeof arg2 === 'function') {
+    success = arg2;
+    error = arg3;
+  }
+
+  success = (success||log);
+  error = (error||log);
+
+  if(typeof opts.useJQuery === 'boolean') {
+    this.useJQuery = opts.useJQuery;
+  }
+
+  var missingParams = this.getMissingParams(args);
+  if(missingParams.length > 0) {
+    var message = 'missing required params: ' + missingParams;
+    fail(message);
+    return;
+  }
+  var allHeaders = this.getHeaderParams(args);
+  var contentTypeHeaders = this.setContentTypes(args, opts);
+
+  var headers = {};
+  for (var attrname in allHeaders) { headers[attrname] = allHeaders[attrname]; }
+  for (var attrname in contentTypeHeaders) { headers[attrname] = contentTypeHeaders[attrname]; }
+
+  var body = this.getBody(headers, args);
+  var url = this.urlify(args);
+
+  var obj = {
+    url: url,
+    method: this.method.toUpperCase(),
+    body: body,
+    useJQuery: this.useJQuery,
+    headers: headers,
+    on: {
+      response: function(response) {
+        return success(response, parent);
+      },
+      error: function(response) {
+        return error(response, parent);
+      }
+    }
+  };
+  var status = e.authorizations.apply(obj, this.operation.security);
+  if(opts.mock === true)
+    return obj;
+  else
+    new SwaggerHttp().execute(obj);
+};
+
+Operation.prototype.setContentTypes = function(args, opts) {
+  // default type
+  var accepts = 'application/json';
+  var consumes = args.parameterContentType || 'application/json';
+
+  var allDefinedParams = this.parameters;
+  var definedFormParams = [];
+  var definedFileParams = [];
+  var body;
+  var headers = {};
+
+  // get params from the operation and set them in definedFileParams, definedFormParams, headers
+  var i;
+  for(i = 0; i < allDefinedParams.length; i++) {
+    var param = allDefinedParams[i];
+    if(param.in === 'formData') {
+      if(param.type === 'file')
+        definedFileParams.push(param);
+      else
+        definedFormParams.push(param);
+    }
+    else if(param.in === 'header' && opts) {
+      var key = param.name;
+      var headerValue = opts[param.name];
+      if(typeof opts[param.name] !== 'undefined')
+        headers[key] = headerValue;
+    }
+    else if(param.in === 'body' && typeof args[param.name] !== 'undefined') {
+      body = args[param.name];
+    }
+  }
+
+  // if there's a body, need to set the consumes header via requestContentType
+  if (body && (this.method === 'post' || this.method === 'put' || this.method === 'patch' || this.method === 'delete')) {
+    if (opts.requestContentType)
+      consumes = opts.requestContentType;
+  } else {
+    // if any form params, content type must be set
+    if(definedFormParams.length > 0) {
+      if(opts.requestContentType)           // override if set
+        consumes = opts.requestContentType;
+      else if(definedFileParams.length > 0) // if a file, must be multipart/form-data
+        consumes = 'multipart/form-data';
+      else                                  // default to x-www-from-urlencoded
+        consumes = 'application/x-www-form-urlencoded';
+    }
+    else if (this.type == 'DELETE')
+      body = '{}';
+    else if (this.type != 'DELETE')
+      consumes = null;
+  }
+
+  if (consumes && this.consumes) {
+    if (this.consumes.indexOf(consumes) === -1) {
+      log('server doesn\'t consume ' + consumes + ', try ' + JSON.stringify(this.consumes));
+    }
+  }
+
+  if (opts.responseContentType) {
+    accepts = opts.responseContentType;
+  } else {
+    accepts = 'application/json';
+  }
+  if (accepts && this.produces) {
+    if (this.produces.indexOf(accepts) === -1) {
+      log('server can\'t produce ' + accepts);
+    }
+  }
+
+  if ((consumes && body !== '') || (consumes === 'application/x-www-form-urlencoded'))
+    headers['Content-Type'] = consumes;
+  if (accepts)
+    headers.Accept = accepts;
+  return headers;
+};
+
+Operation.prototype.asCurl = function (args) {
+  var results = [];
+  var headers = this.getHeaderParams(args);
+  if (headers) {
+    var key;
+    for (key in headers)
+      results.push("--header \"" + key + ": " + headers[key] + "\"");
+  }
+  return "curl " + (results.join(" ")) + " " + this.urlify(args);
+};
+
+Operation.prototype.encodePathCollection = function(type, name, value) {
+  var encoded = '';
+  var i;
+  var separator = '';
+  if(type === 'ssv')
+    separator = '%20';
+  else if(type === 'tsv')
+    separator = '\\t';
+  else if(type === 'pipes')
+    separator = '|';
+  else
+    separator = ',';
+
+  for(i = 0; i < value.length; i++) {
+    if(i === 0)
+      encoded = this.encodeQueryParam(value[i]);
+    else
+      encoded += separator + this.encodeQueryParam(value[i]);
+  }
+  return encoded;
+};
+
+Operation.prototype.encodeQueryCollection = function(type, name, value) {
+  var encoded = '';
+  var i;
+  if(type === 'default' || type === 'multi') {
+    for(i = 0; i < value.length; i++) {
+      if(i > 0) encoded += '&';
+      encoded += this.encodeQueryParam(name) + '=' + this.encodeQueryParam(value[i]);
+    }
+  }
+  else {
+    var separator = '';
+    if(type === 'csv')
+      separator = ',';
+    else if(type === 'ssv')
+      separator = '%20';
+    else if(type === 'tsv')
+      separator = '\\t';
+    else if(type === 'pipes')
+      separator = '|';
+    else if(type === 'brackets') {
+      for(i = 0; i < value.length; i++) {
+        if(i !== 0)
+          encoded += '&';
+        encoded += this.encodeQueryParam(name) + '[]=' + this.encodeQueryParam(value[i]);
+      }
+    }
+    if(separator !== '') {
+      for(i = 0; i < value.length; i++) {
+        if(i === 0)
+          encoded = this.encodeQueryParam(name) + '=' + this.encodeQueryParam(value[i]);
+        else
+          encoded += separator + this.encodeQueryParam(value[i]);
+      }
+    }
+  }
+  return encoded;
+};
+
+Operation.prototype.encodeQueryParam = function(arg) {
+  return encodeURIComponent(arg);
+};
+
+/**
+ * TODO revisit, might not want to leave '/'
+ **/
+Operation.prototype.encodePathParam = function(pathParam) {
+  var encParts, part, parts, i, len;
+  pathParam = pathParam.toString();
+  if (pathParam.indexOf('/') === -1) {
+    return encodeURIComponent(pathParam);
+  } else {
+    parts = pathParam.split('/');
+    encParts = [];
+    for (i = 0, len = parts.length; i < len; i++) {
+      encParts.push(encodeURIComponent(parts[i]));
+    }
+    return encParts.join('/');
+  }
+};
+
+var Model = function(name, definition) {
+  this.name = name;
+  this.definition = definition || {};
+  this.properties = [];
+  var requiredFields = definition.required || [];
+  if(definition.type === 'array') {
+    var out = new ArrayModel(definition);
+    return out;
+  }
+  var key;
+  var props = definition.properties;
+  if(props) {
+    for(key in props) {
+      var required = false;
+      var property = props[key];
+      if(requiredFields.indexOf(key) >= 0)
+        required = true;
+      this.properties.push(new Property(key, property, required));
+    }
+  }
+};
+
+Model.prototype.createJSONSample = function(modelsToIgnore) {
+  var i, result = {};
+  modelsToIgnore = (modelsToIgnore||{});
+  modelsToIgnore[this.name] = this;
+  for (i = 0; i < this.properties.length; i++) {
+    prop = this.properties[i];
+    var sample = prop.getSampleValue(modelsToIgnore);
+    result[prop.name] = sample;
+  }
+  delete modelsToIgnore[this.name];
+  return result;
+};
+
+Model.prototype.getSampleValue = function(modelsToIgnore) {
+  var i, obj = {};
+  for(i = 0; i < this.properties.length; i++ ) {
+    var property = this.properties[i];
+    obj[property.name] = property.sampleValue(false, modelsToIgnore);
+  }
+  return obj;
+};
+
+Model.prototype.getMockSignature = function(modelsToIgnore) {
+  var i, prop, propertiesStr = [];
+  for (i = 0; i < this.properties.length; i++) {
+    prop = this.properties[i];
+    propertiesStr.push(prop.toString());
+  }
+  var strong = '<span class="strong">';
+  var stronger = '<span class="stronger">';
+  var strongClose = '</span>';
+  var classOpen = strong + this.name + ' {' + strongClose;
+  var classClose = strong + '}' + strongClose;
+  var returnVal = classOpen + '<div>' + propertiesStr.join(',</div><div>') + '</div>' + classClose;
+  if (!modelsToIgnore)
+    modelsToIgnore = {};
+
+  modelsToIgnore[this.name] = this;
+  for (i = 0; i < this.properties.length; i++) {
+    prop = this.properties[i];
+    var ref = prop.$ref;
+    var model = models[ref];
+    if (model && typeof modelsToIgnore[model.name] === 'undefined') {
+      returnVal = returnVal + ('<br>' + model.getMockSignature(modelsToIgnore));
+    }
+  }
+  return returnVal;
+};
+
+var Property = function(name, obj, required) {
+  this.schema = obj;
+  this.required = required;
+  if(obj.$ref)
+    this.$ref = simpleRef(obj.$ref);
+  else if (obj.type === 'array' && obj.items) {
+    if(obj.items.$ref)
+      this.$ref = simpleRef(obj.items.$ref);
+    else
+      obj = obj.items;
+  }
+  this.name = name;
+  this.description = obj.description;
+  this.obj = obj;
+  this.optional = true;
+  this.optional = !required;
+  this.default = obj.default || null;
+  this.example = obj.example || null;
+  this.collectionFormat = obj.collectionFormat || null;
+  this.maximum = obj.maximum || null;
+  this.exclusiveMaximum = obj.exclusiveMaximum || null;
+  this.minimum = obj.minimum || null;
+  this.exclusiveMinimum = obj.exclusiveMinimum || null;
+  this.maxLength = obj.maxLength || null;
+  this.minLength = obj.minLength || null;
+  this.pattern = obj.pattern || null;
+  this.maxItems = obj.maxItems || null;
+  this.minItems = obj.minItems || null;
+  this.uniqueItems = obj.uniqueItems || null;
+  this['enum'] = obj['enum'] || null;
+  this.multipleOf = obj.multipleOf || null;
+};
+
+Property.prototype.getSampleValue = function (modelsToIgnore) {
+  return this.sampleValue(false, modelsToIgnore);
+};
+
+Property.prototype.isArray = function () {
+  var schema = this.schema;
+  if(schema.type === 'array')
+    return true;
+  else
+    return false;
+};
+
+Property.prototype.sampleValue = function(isArray, ignoredModels) {
+  isArray = (isArray || this.isArray());
+  ignoredModels = (ignoredModels || {});
+  var type = getStringSignature(this.obj, true);
+  var output;
+
+  if(this.$ref) {
+    var refModelName = simpleRef(this.$ref);
+    var refModel = models[refModelName];
+    if(refModel && typeof ignoredModels[type] === 'undefined') {
+      ignoredModels[type] = this;
+      output = refModel.getSampleValue(ignoredModels);
+    }
+    else {
+      output = refModelName;
+    }
+  }
+  else if(this.example)
+    output = this.example;
+  else if(this.default)
+    output = this.default;
+  else if(type === 'date-time')
+    output = new Date().toISOString();
+  else if(type === 'date')
+    output = new Date().toISOString().split("T")[0];
+  else if(type === 'string')
+    output = 'string';
+  else if(type === 'integer')
+    output = 0;
+  else if(type === 'long')
+    output = 0;
+  else if(type === 'float')
+    output = 0.0;
+  else if(type === 'double')
+    output = 0.0;
+  else if(type === 'boolean')
+    output = true;
+  else
+    output = {};
+  ignoredModels[type] = output;
+  if(isArray)
+    return [output];
+  else
+    return output;
+};
+
+getStringSignature = function(obj, baseComponent) {
+  var str = '';
+  if(typeof obj.$ref !== 'undefined')
+    str += simpleRef(obj.$ref);
+  else if(typeof obj.type === 'undefined')
+    str += 'object';
+  else if(obj.type === 'array') {
+    if(baseComponent)
+      str += getStringSignature((obj.items || obj.$ref || {}));
+    else {
+      str += 'Array[';
+      str += getStringSignature((obj.items || obj.$ref || {}));
+      str += ']';
+    }
+  }
+  else if(obj.type === 'integer' && obj.format === 'int32')
+    str += 'integer';
+  else if(obj.type === 'integer' && obj.format === 'int64')
+    str += 'long';
+  else if(obj.type === 'integer' && typeof obj.format === 'undefined')
+    str += 'long';
+  else if(obj.type === 'string' && obj.format === 'date-time')
+    str += 'date-time';
+  else if(obj.type === 'string' && obj.format === 'date')
+    str += 'date';
+  else if(obj.type === 'string' && typeof obj.format === 'undefined')
+    str += 'string';
+  else if(obj.type === 'number' && obj.format === 'float')
+    str += 'float';
+  else if(obj.type === 'number' && obj.format === 'double')
+    str += 'double';
+  else if(obj.type === 'number' && typeof obj.format === 'undefined')
+    str += 'double';
+  else if(obj.type === 'boolean')
+    str += 'boolean';
+  else if(obj.$ref)
+    str += simpleRef(obj.$ref);
+  else
+    str += obj.type;
+  return str;
+};
+
+simpleRef = function(name) {
+  if(typeof name === 'undefined')
+    return null;
+  if(name.indexOf("#/definitions/") === 0)
+    return name.substring('#/definitions/'.length);
+  else
+    return name;
+};
+
+Property.prototype.toString = function() {
+  var str = getStringSignature(this.obj);
+  if(str !== '') {
+    str = '<span class="propName ' + this.required + '">' + this.name + '</span> (<span class="propType">' + str + '</span>';
+    if(!this.required)
+      str += ', <span class="propOptKey">optional</span>';
+    str += ')';
+  }
+  else
+    str = this.name + ' (' + JSON.stringify(this.obj) + ')';
+
+  if(typeof this.description !== 'undefined')
+    str += ': ' + this.description;
+
+  if (this['enum']) {
+    str += ' = <span class="propVals">[\'' + this['enum'].join('\' or \'') + '\']</span>';
+  }
+  if (this.descr) {
+    str += ': <span class="propDesc">' + this.descr + '</span>';
+  }
+
+
+  var options = ''; 
+  var isArray = this.schema.type === 'array';
+  var type;
+
+  if(isArray) {
+    if(this.schema.items)
+      type = this.schema.items.type;
+    else
+      type = '';
+  }
+  else {
+    this.schema.type;
+  }
+
+  if (this.default)
+    options += optionHtml('Default', this.default);
+
+  switch (type) {
+    case 'string':
+      if (this.minLength)
+        options += optionHtml('Min. Length', this.minLength);
+      if (this.maxLength)
+        options += optionHtml('Max. Length', this.maxLength);
+      if (this.pattern)
+        options += optionHtml('Reg. Exp.', this.pattern);
+      break;
+    case 'integer':
+    case 'number':
+      if (this.minimum)
+        options += optionHtml('Min. Value', this.minimum);
+      if (this.exclusiveMinimum)
+        options += optionHtml('Exclusive Min.', "true");
+      if (this.maximum)
+        options += optionHtml('Max. Value', this.maximum);
+      if (this.exclusiveMaximum)
+        options += optionHtml('Exclusive Max.', "true");
+      if (this.multipleOf)
+        options += optionHtml('Multiple Of', this.multipleOf);
+      break;
+  }
+
+  if (isArray) {
+    if (this.minItems)
+      options += optionHtml('Min. Items', this.minItems);
+    if (this.maxItems)
+      options += optionHtml('Max. Items', this.maxItems);
+    if (this.uniqueItems)
+      options += optionHtml('Unique Items', "true");
+    if (this.collectionFormat)
+      options += optionHtml('Coll. Format', this.collectionFormat);
+  }
+
+  if (this['enum']) {
+    var enumString;
+
+    if (type === 'number' || type === 'integer')
+      enumString = this['enum'].join(', ');
+    else {
+      enumString = '"' + this['enum'].join('", "') + '"';
+    }
+
+    options += optionHtml('Enum', enumString);
+  }     
+
+  if (options.length > 0)
+    str = '<span class="propWrap">' + str + '<table class="optionsWrapper"><tr><th colspan="2">' + this.name + '</th></tr>' + options + '</table></span>';
+  
+  return str;
+};
+
+optionHtml = function(label, value) {
+  return '<tr><td class="optionName">' + label + ':</td><td>' + value + '</td></tr>';
+}
+
+typeFromJsonSchema = function(type, format) {
+  var str;
+  if(type === 'integer' && format === 'int32')
+    str = 'integer';
+  else if(type === 'integer' && format === 'int64')
+    str = 'long';
+  else if(type === 'integer' && typeof format === 'undefined')
+    str = 'long';
+  else if(type === 'string' && format === 'date-time')
+    str = 'date-time';
+  else if(type === 'string' && format === 'date')
+    str = 'date';
+  else if(type === 'number' && format === 'float')
+    str = 'float';
+  else if(type === 'number' && format === 'double')
+    str = 'double';
+  else if(type === 'number' && typeof format === 'undefined')
+    str = 'double';
+  else if(type === 'boolean')
+    str = 'boolean';
+  else if(type === 'string')
+    str = 'string';
+
+  return str;
+};
+
+var sampleModels = {};
+var cookies = {};
+var models = {};
+
+SwaggerClient.prototype.buildFrom1_2Spec = function (response) {
+  if (response.apiVersion != null) {
+    this.apiVersion = response.apiVersion;
+  }
+  this.apis = {};
+  this.apisArray = [];
+  this.consumes = response.consumes;
+  this.produces = response.produces;
+  this.authSchemes = response.authorizations;
+  this.info = this.convertInfo(response.info);
+
+  var isApi = false, i, res;
+  for (i = 0; i < response.apis.length; i++) {
+    var api = response.apis[i];
+    if (api.operations) {
+      var j;
+      for (j = 0; j < api.operations.length; j++) {
+        operation = api.operations[j];
+        isApi = true;
+      }
+    }
+  }
+  if (response.basePath)
+    this.basePath = response.basePath;
+  else if (this.url.indexOf('?') > 0)
+    this.basePath = this.url.substring(0, this.url.lastIndexOf('?'));
+  else
+    this.basePath = this.url;
+
+  if (isApi) {
+    var newName = response.resourcePath.replace(/\//g, '');
+    this.resourcePath = response.resourcePath;
+    res = new SwaggerResource(response, this);
+    this.apis[newName] = res;
+    this.apisArray.push(res);
+  } else {
+    var k;
+    for (k = 0; k < response.apis.length; k++) {
+      var resource = response.apis[k];
+      res = new SwaggerResource(resource, this);
+      this.apis[res.name] = res;
+      this.apisArray.push(res);
+    }
+  }
+  this.isValid = true;
+  if (typeof this.success === 'function') {
+    this.success();
+  }
+  return this;
+};
+
+SwaggerClient.prototype.buildFrom1_1Spec = function (response) {
+  log('This API is using a deprecated version of Swagger!  Please see http://github.com/wordnik/swagger-core/wiki for more info');
+  if (response.apiVersion != null)
+    this.apiVersion = response.apiVersion;
+  this.apis = {};
+  this.apisArray = [];
+  this.produces = response.produces;
+  this.info = this.convertInfo(response.info);
+  var isApi = false, res;
+  for (var i = 0; i < response.apis.length; i++) {
+    var api = response.apis[i];
+    if (api.operations) {
+      for (var j = 0; j < api.operations.length; j++) {
+        operation = api.operations[j];
+        isApi = true;
+      }
+    }
+  }
+  if (response.basePath) {
+    this.basePath = response.basePath;
+  } else if (this.url.indexOf('?') > 0) {
+    this.basePath = this.url.substring(0, this.url.lastIndexOf('?'));
+  } else {
+    this.basePath = this.url;
+  }
+  if (isApi) {
+    var newName = response.resourcePath.replace(/\//g, '');
+    this.resourcePath = response.resourcePath;
+    res = new SwaggerResource(response, this);
+    this.apis[newName] = res;
+    this.apisArray.push(res);
+  } else {
+    for (k = 0; k < response.apis.length; k++) {
+      resource = response.apis[k];
+      res = new SwaggerResource(resource, this);
+      this.apis[res.name] = res;
+      this.apisArray.push(res);
+    }
+  }
+  this.isValid = true;
+  if (this.success) {
+    this.success();
+  }
+  return this;
+};
+
+SwaggerClient.prototype.convertInfo = function (resp) {
+  if(typeof resp == 'object') {
+    var info = {}
+
+    info.title = resp.title;
+    info.description = resp.description;
+    info.termsOfService = resp.termsOfServiceUrl;
+    info.contact = {};
+    info.contact.name = resp.contact;
+    info.license = {};
+    info.license.name = resp.license;
+    info.license.url = resp.licenseUrl;
+
+    return info;
+  }
+};
+
+SwaggerClient.prototype.selfReflect = function () {
+  var resource, resource_name, ref;
+  if (this.apis === null) {
+    return false;
+  }
+  ref = this.apis;
+  for (resource_name in ref) {
+    resource = ref[resource_name];
+    if (resource.ready === null) {
+      return false;
+    }
+  }
+  this.setConsolidatedModels();
+  this.ready = true;
+  if (typeof this.success === 'function') {
+    return this.success();
+  }
+};
+
+SwaggerClient.prototype.setConsolidatedModels = function () {
+  var model, modelName, resource, resource_name, i, apis, models, results;
+  this.models = {};
+  apis = this.apis;
+  for (resource_name in apis) {
+    resource = apis[resource_name];
+    for (modelName in resource.models) {
+      if (typeof this.models[modelName] === 'undefined') {
+        this.models[modelName] = resource.models[modelName];
+        this.modelsArray.push(resource.models[modelName]);
+      }
+    }
+  }
+  models = this.modelsArray;
+  results = [];
+  for (i = 0; i < models.length; i++) {
+    model = models[i];
+    results.push(model.setReferencedModels(this.models));
+  }
+  return results;
+};
+
+var SwaggerResource = function (resourceObj, api) {
+  var _this = this;
+  this.api = api;
+  this.swaggerRequstHeaders = api.swaggerRequstHeaders;
+  this.path = (typeof this.api.resourcePath === 'string') ? this.api.resourcePath : resourceObj.path;
+  this.description = resourceObj.description;
+  this.authorizations = (resourceObj.authorizations || {});
+
+  var parts = this.path.split('/');
+  this.name = parts[parts.length - 1].replace('.{format}', '');
+  this.basePath = this.api.basePath;
+  this.operations = {};
+  this.operationsArray = [];
+  this.modelsArray = [];
+  this.models = {};
+  this.rawModels = {};
+  this.useJQuery = (typeof api.useJQuery !== 'undefined') ? api.useJQuery : null;
+
+  if ((resourceObj.apis) && this.api.resourcePath) {
+    this.addApiDeclaration(resourceObj);
+  } else {
+    if (typeof this.path === 'undefined') {
+      this.api.fail('SwaggerResources must have a path.');
+    }
+    if (this.path.substring(0, 4) === 'http') {
+      this.url = this.path.replace('{format}', 'json');
+    } else {
+      this.url = this.api.basePath + this.path.replace('{format}', 'json');
+    }
+    this.api.progress('fetching resource ' + this.name + ': ' + this.url);
+    var obj = {
+      url: this.url,
+      method: 'GET',
+      useJQuery: this.useJQuery,
+      headers: {
+        accept: this.swaggerRequstHeaders
+      },
+      on: {
+        response: function (resp) {
+          var responseObj = resp.obj || JSON.parse(resp.data);
+          return _this.addApiDeclaration(responseObj);
+        },
+        error: function (response) {
+          return _this.api.fail('Unable to read api \'' +
+          _this.name + '\' from path ' + _this.url + ' (server returned ' + response.statusText + ')');
+        }
+      }
+    };
+    var e = typeof window !== 'undefined' ? window : exports;
+    e.authorizations.apply(obj);
+    new SwaggerHttp().execute(obj);
+  }
+};
+
+SwaggerResource.prototype.getAbsoluteBasePath = function (relativeBasePath) {
+  var pos, url;
+  url = this.api.basePath;
+  pos = url.lastIndexOf(relativeBasePath);
+  var parts = url.split('/');
+  var rootUrl = parts[0] + '//' + parts[2];
+
+  if (relativeBasePath.indexOf('http') === 0)
+    return relativeBasePath;
+  if (relativeBasePath === '/')
+    return rootUrl;
+  if (relativeBasePath.substring(0, 1) == '/') {
+    // use root + relative
+    return rootUrl + relativeBasePath;
+  }
+  else {
+    pos = this.basePath.lastIndexOf('/');
+    var base = this.basePath.substring(0, pos);
+    if (base.substring(base.length - 1) == '/')
+      return base + relativeBasePath;
+    else
+      return base + '/' + relativeBasePath;
+  }
+};
+
+SwaggerResource.prototype.addApiDeclaration = function (response) {
+  if (typeof response.produces === 'string')
+    this.produces = response.produces;
+  if (typeof response.consumes === 'string')
+    this.consumes = response.consumes;
+  if ((typeof response.basePath === 'string') && response.basePath.replace(/\s/g, '').length > 0)
+    this.basePath = response.basePath.indexOf('http') === -1 ? this.getAbsoluteBasePath(response.basePath) : response.basePath;
+
+  this.addModels(response.models);
+  if (response.apis) {
+    for (var i = 0 ; i < response.apis.length; i++) {
+      var endpoint = response.apis[i];
+      this.addOperations(endpoint.path, endpoint.operations, response.consumes, response.produces);
+    }
+  }
+  this.api[this.name] = this;
+  this.ready = true;
+  return this.api.selfReflect();
+};
+
+SwaggerResource.prototype.addModels = function (models) {
+  if (typeof models === 'object') {
+    var modelName;
+    for (modelName in models) {
+      if (typeof this.models[modelName] === 'undefined') {
+        var swaggerModel = new SwaggerModel(modelName, models[modelName]);
+        this.modelsArray.push(swaggerModel);
+        this.models[modelName] = swaggerModel;
+        this.rawModels[modelName] = models[modelName];
+      }
+    }
+    var output = [];
+    for (var i = 0; i < this.modelsArray.length; i++) {
+      var model = this.modelsArray[i];
+      output.push(model.setReferencedModels(this.models));
+    }
+    return output;
+  }
+};
+
+SwaggerResource.prototype.addOperations = function (resource_path, ops, consumes, produces) {
+  if (ops) {
+    var output = [];
+    for (var i = 0; i < ops.length; i++) {
+      var o = ops[i];
+      consumes = this.consumes;
+      produces = this.produces;
+      if (typeof o.consumes !== 'undefined')
+        consumes = o.consumes;
+      else
+        consumes = this.consumes;
+
+      if (typeof o.produces !== 'undefined')
+        produces = o.produces;
+      else
+        produces = this.produces;
+      var type = (o.type || o.responseClass);
+
+      if (type === 'array') {
+        ref = null;
+        if (o.items)
+          ref = o.items.type || o.items.$ref;
+        type = 'array[' + ref + ']';
+      }
+      var responseMessages = o.responseMessages;
+      var method = o.method;
+      if (o.httpMethod) {
+        method = o.httpMethod;
+      }
+      if (o.supportedContentTypes) {
+        consumes = o.supportedContentTypes;
+      }
+      if (o.errorResponses) {
+        responseMessages = o.errorResponses;
+        for (var j = 0; j < responseMessages.length; j++) {
+          r = responseMessages[j];
+          r.message = r.reason;
+          r.reason = null;
+        }
+      }
+      o.nickname = this.sanitize(o.nickname);
+      var op = new SwaggerOperation(o.nickname,
+          resource_path,
+          method,
+          o.parameters,
+          o.summary,
+          o.notes,
+          type,
+          responseMessages, 
+          this, 
+          consumes, 
+          produces, 
+          o.authorizations, 
+          o.deprecated);
+
+      this.operations[op.nickname] = op;
+      output.push(this.operationsArray.push(op));
+    }
+    return output;
+  }
+};
+
+SwaggerResource.prototype.sanitize = function (nickname) {
+  var op;
+  op = nickname.replace(/[\s!@#$%^&*()_+=\[{\]};:<>|.\/?,\\'""-]/g, '_');
+  op = op.replace(/((_){2,})/g, '_');
+  op = op.replace(/^(_)*/g, '');
+  op = op.replace(/([_])*$/g, '');
+  return op;
+};
+
+var SwaggerModel = function (modelName, obj) {
+  this.name = typeof obj.id !== 'undefined' ? obj.id : modelName;
+  this.properties = [];
+  var propertyName;
+  for (propertyName in obj.properties) {
+    if (obj.required) {
+      var value;
+      for (value in obj.required) {
+        if (propertyName === obj.required[value]) {
+          obj.properties[propertyName].required = true;
+        }
+      }
+    }
+    var prop = new SwaggerModelProperty(propertyName, obj.properties[propertyName], this);
+    this.properties.push(prop);
+  }
+};
+
+SwaggerModel.prototype.setReferencedModels = function (allModels) {
+  var results = [];
+  for (var i = 0; i < this.properties.length; i++) {
+    var property = this.properties[i];
+    var type = property.type || property.dataType;
+    if (allModels[type])
+      results.push(property.refModel = allModels[type]);
+    else if ((property.refDataType) && (allModels[property.refDataType]))
+      results.push(property.refModel = allModels[property.refDataType]);
+    else
+      results.push(void 0);
+  }
+  return results;
+};
+
+SwaggerModel.prototype.getMockSignature = function (modelsToIgnore) {
+  var i, prop, propertiesStr = [];
+  for (i = 0; i < this.properties.length; i++) {
+    prop = this.properties[i];
+    propertiesStr.push(prop.toString());
+  }
+
+  var strong = '<span class="strong">';
+  var strongClose = '</span>';
+  var classOpen = strong + this.name + ' {' + strongClose;
+  var classClose = strong + '}' + strongClose;
+  var returnVal = classOpen + '<div>' + propertiesStr.join(',</div><div>') + '</div>' + classClose;
+  if (!modelsToIgnore)
+    modelsToIgnore = [];
+  modelsToIgnore.push(this.name);
+
+  for (i = 0; i < this.properties.length; i++) {
+    prop = this.properties[i];
+    if ((prop.refModel) && modelsToIgnore.indexOf(prop.refModel.name) === -1) {
+      returnVal = returnVal + ('<br>' + prop.refModel.getMockSignature(modelsToIgnore));
+    }
+  }
+  return returnVal;
+};
+
+SwaggerModel.prototype.createJSONSample = function (modelsToIgnore) {
+  if (sampleModels[this.name]) {
+    return sampleModels[this.name];
+  }
+  else {
+    var result = {};
+    modelsToIgnore = (modelsToIgnore || []);
+    modelsToIgnore.push(this.name);
+    for (var i = 0; i < this.properties.length; i++) {
+      var prop = this.properties[i];
+      result[prop.name] = prop.getSampleValue(modelsToIgnore);
+    }
+    modelsToIgnore.pop(this.name);
+    return result;
+  }
+};
+
+var SwaggerModelProperty = function (name, obj, model) {
+  this.name = name;
+  this.dataType = obj.type || obj.dataType || obj.$ref;
+  this.isCollection = this.dataType && (this.dataType.toLowerCase() === 'array' || this.dataType.toLowerCase() === 'list' || this.dataType.toLowerCase() === 'set');
+  this.descr = obj.description;
+  this.required = obj.required;
+  this.defaultValue = applyModelPropertyMacro(obj, model);
+  if (obj.items) {
+    if (obj.items.type) {
+      this.refDataType = obj.items.type;
+    }
+    if (obj.items.$ref) {
+      this.refDataType = obj.items.$ref;
+    }
+  }
+  this.dataTypeWithRef = this.refDataType ? (this.dataType + '[' + this.refDataType + ']') : this.dataType;
+  if (obj.allowableValues) {
+    this.valueType = obj.allowableValues.valueType;
+    this.values = obj.allowableValues.values;
+    if (this.values) {
+      this.valuesString = '\'' + this.values.join('\' or \'') + '\'';
+    }
+  }
+  if (obj['enum']) {
+    this.valueType = 'string';
+    this.values = obj['enum'];
+    if (this.values) {
+      this.valueString = '\'' + this.values.join('\' or \'') + '\'';
+    }
+  }
+};
+
+SwaggerModelProperty.prototype.getSampleValue = function (modelsToIgnore) {
+  var result;
+  if ((this.refModel) && (modelsToIgnore.indexOf(this.refModel.name) === -1)) {
+    result = this.refModel.createJSONSample(modelsToIgnore);
+  } else {
+    if (this.isCollection) {
+      result = this.toSampleValue(this.refDataType);
+    } else {
+      result = this.toSampleValue(this.dataType);
+    }
+  }
+  if (this.isCollection) {
+    return [result];
+  } else {
+    return result;
+  }
+};
+
+SwaggerModelProperty.prototype.toSampleValue = function (value) {
+  var result;
+  if ((typeof this.defaultValue !== 'undefined') && this.defaultValue) {
+    result = this.defaultValue;
+  } else if (value === 'integer') {
+    result = 0;
+  } else if (value === 'boolean') {
+    result = false;
+  } else if (value === 'double' || value === 'number') {
+    result = 0.0;
+  } else if (value === 'string') {
+    result = '';
+  } else {
+    result = value;
+  }
+  return result;
+};
+
+SwaggerModelProperty.prototype.toString = function () {
+  var req = this.required ? 'propReq' : 'propOpt';
+  var str = '<span class="propName ' + req + '">' + this.name + '</span> (<span class="propType">' + this.dataTypeWithRef + '</span>';
+  if (!this.required) {
+    str += ', <span class="propOptKey">optional</span>';
+  }
+  str += ')';
+  if (this.values) {
+    str += ' = <span class="propVals">[\'' + this.values.join('\' or \'') + '\']</span>';
+  }
+  if (this.descr) {
+    str += ': <span class="propDesc">' + this.descr + '</span>';
+  }
+  return str;
+};
+
+var SwaggerOperation = function (nickname, path, method, parameters, summary, notes, type, responseMessages, resource, consumes, produces, authorizations, deprecated) {
+  var _this = this;
+
+  var errors = [];
+  this.nickname = (nickname || errors.push('SwaggerOperations must have a nickname.'));
+  this.path = (path || errors.push('SwaggerOperation ' + nickname + ' is missing path.'));
+  this.method = (method || errors.push('SwaggerOperation ' + nickname + ' is missing method.'));
+  this.parameters = parameters ? parameters : [];
+  this.summary = summary;
+  this.notes = notes;
+  this.type = type;
+  this.responseMessages = (responseMessages || []);
+  this.resource = (resource || errors.push('Resource is required'));
+  this.consumes = consumes;
+  this.produces = produces;
+  this.authorizations = typeof authorizations !== 'undefined' ? authorizations : resource.authorizations;
+  this.deprecated = (typeof deprecated === 'string' ? Boolean(deprecated) : deprecated);
+  this['do'] = __bind(this['do'], this);
+
+  if (errors.length > 0) {
+    console.error('SwaggerOperation errors', errors, arguments);
+    this.resource.api.fail(errors);
+  }
+
+  this.path = this.path.replace('{format}', 'json');
+  this.method = this.method.toLowerCase();
+  this.isGetMethod = this.method === 'GET';
+
+  var i, j, v;
+  this.resourceName = this.resource.name;
+  if (typeof this.type !== 'undefined' && this.type === 'void')
+    this.type = null;
+  else {
+    this.responseClassSignature = this.getSignature(this.type, this.resource.models);
+    this.responseSampleJSON = this.getSampleJSON(this.type, this.resource.models);
+  }
+
+  for (i = 0; i < this.parameters.length; i++) {
+    var param = this.parameters[i];
+    // might take this away
+    param.name = param.name || param.type || param.dataType;
+    // for 1.1 compatibility
+    type = param.type || param.dataType;
+    if (type === 'array') {
+      type = 'array[' + (param.items.$ref ? param.items.$ref : param.items.type) + ']';
+    }
+    param.type = type;
+
+    if (type && type.toLowerCase() === 'boolean') {
+      param.allowableValues = {};
+      param.allowableValues.values = ['true', 'false'];
+    }
+    param.signature = this.getSignature(type, this.resource.models);
+    param.sampleJSON = this.getSampleJSON(type, this.resource.models);
+
+    var enumValue = param['enum'];
+    if (typeof enumValue !== 'undefined') {
+      param.isList = true;
+      param.allowableValues = {};
+      param.allowableValues.descriptiveValues = [];
+
+      for (j = 0; j < enumValue.length; j++) {
+        v = enumValue[j];
+        if (param.defaultValue) {
+          param.allowableValues.descriptiveValues.push({
+            value: String(v),
+            isDefault: (v === param.defaultValue)
+          });
+        }
+        else {
+          param.allowableValues.descriptiveValues.push({
+            value: String(v),
+            isDefault: false
+          });
+        }
+      }
+    }
+    else if (param.allowableValues != null) {
+      if (param.allowableValues.valueType === 'RANGE')
+        param.isRange = true;
+      else
+        param.isList = true;
+      if (param.allowableValues != null) {
+        param.allowableValues.descriptiveValues = [];
+        if (param.allowableValues.values) {
+          for (j = 0; j < param.allowableValues.values.length; j++) {
+            v = param.allowableValues.values[j];
+            if (param.defaultValue != null) {
+              param.allowableValues.descriptiveValues.push({
+                value: String(v),
+                isDefault: (v === param.defaultValue)
+              });
+            }
+            else {
+              param.allowableValues.descriptiveValues.push({
+                value: String(v),
+                isDefault: false
+              });
+            }
+          }
+        }
+      }
+    }
+    param.defaultValue = applyParameterMacro(this, param);
+  }
+  var defaultSuccessCallback = this.resource.api.defaultSuccessCallback || null;
+  var defaultErrorCallback = this.resource.api.defaultErrorCallback || null;
+
+  this.resource[this.nickname] = function (args, opts, callback, error) {
+    var arg1, arg2, arg3, arg4;
+    if(typeof args === 'function') {  // right shift 3
+      arg1 = {}; arg2 = {}; arg3 = args; arg4 = opts;
+    }
+    else if(typeof args === 'object' && typeof opts === 'function') { // right shift 2
+      arg1 = args; arg2 = {}; arg3 = opts; arg4 = callback;
+    }
+    else {
+      arg1 = args; arg2 = opts; arg3 = callback; arg4 = error;
+    }
+    return _this['do'](arg1 || {}, arg2 || {}, arg3 || defaultSuccessCallback, arg4 || defaultErrorCallback);
+  };
+
+  this.resource[this.nickname].help = function () {
+    return _this.help();
+  };
+  this.resource[this.nickname].asCurl = function (args) {
+    return _this.asCurl(args);
+  };
+};
+
+SwaggerOperation.prototype.isListType = function (type) {
+  if (type && type.indexOf('[') >= 0) {
+    return type.substring(type.indexOf('[') + 1, type.indexOf(']'));
+  } else {
+    return void 0;
+  }
+};
+
+SwaggerOperation.prototype.getSignature = function (type, models) {
+  var isPrimitive, listType;
+  listType = this.isListType(type);
+  isPrimitive = ((typeof listType !== 'undefined') && models[listType]) || (typeof models[type] !== 'undefined') ? false : true;
+  if (isPrimitive) {
+    return type;
+  } else {
+    if (typeof listType !== 'undefined') {
+      return models[listType].getMockSignature();
+    } else {
+      return models[type].getMockSignature();
+    }
+  }
+};
+
+SwaggerOperation.prototype.getSampleJSON = function (type, models) {
+  var isPrimitive, listType, val;
+  listType = this.isListType(type);
+  isPrimitive = ((typeof listType !== 'undefined') && models[listType]) || (typeof models[type] !== 'undefined') ? false : true;
+  val = isPrimitive ? void 0 : (listType != null ? models[listType].createJSONSample() : models[type].createJSONSample());
+  if (val) {
+    val = listType ? [val] : val;
+    if (typeof val == 'string')
+      return val;
+    else if (typeof val === 'object') {
+      var t = val;
+      if (val instanceof Array && val.length > 0) {
+        t = val[0];
+      }
+      if (t.nodeName) {
+        var xmlString = new XMLSerializer().serializeToString(t);
+        return this.formatXml(xmlString);
+      }
+      else
+        return JSON.stringify(val, null, 2);
+    }
+    else
+      return val;
+  }
+};
+
+SwaggerOperation.prototype['do'] = function (args, opts, callback, error) {
+  var key, param, params, possibleParams = [], req, value;
+
+  if (typeof error !== 'function') {
+    error = function (xhr, textStatus, error) {
+      return log(xhr, textStatus, error);
+    };
+  }
+
+  if (typeof callback !== 'function') {
+    callback = function (response) {
+      var content;
+      content = null;
+      if (response != null) {
+        content = response.data;
+      } else {
+        content = 'no data';
+      }
+      return log('default callback: ' + content);
+    };
+  }
+
+  params = {};
+  params.headers = [];
+  if (args.headers != null) {
+    params.headers = args.headers;
+    delete args.headers;
+  }
+  // allow override from the opts
+  if(opts && opts.responseContentType) {
+    params.headers['Content-Type'] = opts.responseContentType;
+  }
+  if(opts && opts.requestContentType) {
+    params.headers.Accept = opts.requestContentType;
+  }
+
+  for (var i = 0; i < this.parameters.length; i++) {
+    param = this.parameters[i];
+    if (param.paramType === 'header') {
+      if (typeof args[param.name] !== 'undefined')
+        params.headers[param.name] = args[param.name];
+    }
+    else if (param.paramType === 'form' || param.paramType.toLowerCase() === 'file')
+      possibleParams.push(param);
+    else if (param.paramType === 'body' && param.name !== 'body' && typeof args[param.name] !== 'undefined') {
+      if (args.body) {
+        throw new Error('Saw two body params in an API listing; expecting a max of one.');
+      }
+      args.body = args[param.name];
+    }
+  }
+
+  if (typeof args.body !== 'undefined') {
+    params.body = args.body;
+    delete args.body;
+  }
+
+  if (possibleParams) {
+    for (key in possibleParams) {
+      value = possibleParams[key];
+      if (args[value.name]) {
+        params[value.name] = args[value.name];
+      }
+    }
+  }
+
+  req = new SwaggerRequest(this.method, this.urlify(args), params, opts, callback, error, this);
+  if (opts.mock) {
+    return req;
+  } else {
+    return true;
+  }
+};
+
+SwaggerOperation.prototype.pathJson = function () {
+  return this.path.replace('{format}', 'json');
+};
+
+SwaggerOperation.prototype.pathXml = function () {
+  return this.path.replace('{format}', 'xml');
+};
+
+SwaggerOperation.prototype.encodePathParam = function (pathParam) {
+  var encParts, part, parts, _i, _len;
+  pathParam = pathParam.toString();
+  if (pathParam.indexOf('/') === -1) {
+    return encodeURIComponent(pathParam);
+  } else {
+    parts = pathParam.split('/');
+    encParts = [];
+    for (_i = 0, _len = parts.length; _i < _len; _i++) {
+      part = parts[_i];
+      encParts.push(encodeURIComponent(part));
+    }
+    return encParts.join('/');
+  }
+};
+
+SwaggerOperation.prototype.urlify = function (args) {
+  var i, j, param, url;
+  // ensure no double slashing...
+  if(this.resource.basePath.length > 1 && this.resource.basePath.slice(-1) === '/' && this.pathJson().charAt(0) === '/')
+    url = this.resource.basePath + this.pathJson().substring(1);
+  else
+    url = this.resource.basePath + this.pathJson();
+  var params = this.parameters;
+  for (i = 0; i < params.length; i++) {
+    param = params[i];
+    if (param.paramType === 'path') {
+      if (typeof args[param.name] !== 'undefined') {
+        // apply path params and remove from args
+        var reg = new RegExp('\\{\\s*?' + param.name + '.*?\\}(?=\\s*?(\\/?|$))', 'gi');
+        url = url.replace(reg, this.encodePathParam(args[param.name]));
+        delete args[param.name];
+      }
+      else
+        throw '' + param.name + ' is a required path param.';
+    }
+  }
+
+  var queryParams = '';
+  for (i = 0; i < params.length; i++) {
+    param = params[i];
+    if(param.paramType === 'query') {
+      if (queryParams !== '')
+        queryParams += '&';    
+      if (Array.isArray(param)) {
+        var output = '';   
+        for(j = 0; j < param.length; j++) {    
+          if(j > 0)    
+            output += ',';   
+          output += encodeURIComponent(param[j]);    
+        }    
+        queryParams += encodeURIComponent(param.name) + '=' + output;    
+      }
+      else {
+        if (typeof args[param.name] !== 'undefined') {
+          queryParams += encodeURIComponent(param.name) + '=' + encodeURIComponent(args[param.name]);
+        } else {
+          if (param.required)
+            throw '' + param.name + ' is a required query param.';
+        }
+      }
+    }
+  }
+  if ((queryParams != null) && queryParams.length > 0)
+    url += '?' + queryParams;
+  return url;
+};
+
+SwaggerOperation.prototype.supportHeaderParams = function () {
+  return this.resource.api.supportHeaderParams;
+};
+
+SwaggerOperation.prototype.supportedSubmitMethods = function () {
+  return this.resource.api.supportedSubmitMethods;
+};
+
+SwaggerOperation.prototype.getQueryParams = function (args) {
+  return this.getMatchingParams(['query'], args);
+};
+
+SwaggerOperation.prototype.getHeaderParams = function (args) {
+  return this.getMatchingParams(['header'], args);
+};
+
+SwaggerOperation.prototype.getMatchingParams = function (paramTypes, args) {
+  var matchingParams = {};
+  var params = this.parameters;
+  for (var i = 0; i < params.length; i++) {
+    param = params[i];
+    if (args && args[param.name])
+      matchingParams[param.name] = args[param.name];
+  }
+  var headers = this.resource.api.headers;
+  var name;
+  for (name in headers) {
+    var value = headers[name];
+    matchingParams[name] = value;
+  }
+  return matchingParams;
+};
+
+SwaggerOperation.prototype.help = function () {
+  var msg = '';
+  var params = this.parameters;
+  for (var i = 0; i < params.length; i++) {
+    var param = params[i];
+    if (msg !== '')
+      msg += '\n';
+    msg += '* ' + param.name + (param.required ? ' (required)' : '') + " - " + param.description;
+  }
+  return msg;
+};
+
+SwaggerOperation.prototype.asCurl = function (args) {
+  var results = [];
+  var i;
+
+  var headers = SwaggerRequest.prototype.setHeaders(args, {}, this);    
+  for(i = 0; i < this.parameters.length; i++) {
+    var param = this.parameters[i];
+    if(param.paramType && param.paramType === 'header' && args[param.name]) {
+      headers[param.name] = args[param.name];
+    }
+  }
+
+  var key;
+  for (key in headers) {
+    results.push('--header "' + key + ': ' + headers[key] + '"');
+  }
+  return 'curl ' + (results.join(' ')) + ' ' + this.urlify(args);
+};
+
+SwaggerOperation.prototype.formatXml = function (xml) {
+  var contexp, formatted, indent, lastType, lines, ln, pad, reg, transitions, wsexp, _fn, _i, _len;
+  reg = /(>)(<)(\/*)/g;
+  wsexp = /[ ]*(.*)[ ]+\n/g;
+  contexp = /(<.+>)(.+\n)/g;
+  xml = xml.replace(reg, '$1\n$2$3').replace(wsexp, '$1\n').replace(contexp, '$1\n$2');
+  pad = 0;
+  formatted = '';
+  lines = xml.split('\n');
+  indent = 0;
+  lastType = 'other';
+  transitions = {
+    'single->single': 0,
+    'single->closing': -1,
+    'single->opening': 0,
+    'single->other': 0,
+    'closing->single': 0,
+    'closing->closing': -1,
+    'closing->opening': 0,
+    'closing->other': 0,
+    'opening->single': 1,
+    'opening->closing': 0,
+    'opening->opening': 1,
+    'opening->other': 1,
+    'other->single': 0,
+    'other->closing': -1,
+    'other->opening': 0,
+    'other->other': 0
+  };
+  _fn = function (ln) {
+    var fromTo, j, key, padding, type, types, value;
+    types = {
+      single: Boolean(ln.match(/<.+\/>/)),
+      closing: Boolean(ln.match(/<\/.+>/)),
+      opening: Boolean(ln.match(/<[^!?].*>/))
+    };
+    type = ((function () {
+      var _results;
+      _results = [];
+      for (key in types) {
+        value = types[key];
+        if (value) {
+          _results.push(key);
+        }
+      }
+      return _results;
+    })())[0];
+    type = type === void 0 ? 'other' : type;
+    fromTo = lastType + '->' + type;
+    lastType = type;
+    padding = '';
+    indent += transitions[fromTo];
+    padding = ((function () {
+      var _j, _ref5, _results;
+      _results = [];
+      for (j = _j = 0, _ref5 = indent; 0 <= _ref5 ? _j < _ref5 : _j > _ref5; j = 0 <= _ref5 ? ++_j : --_j) {
+        _results.push('  ');
+      }
+      return _results;
+    })()).join('');
+    if (fromTo === 'opening->closing') {
+      formatted = formatted.substr(0, formatted.length - 1) + ln + '\n';
+    } else {
+      formatted += padding + ln + '\n';
+    }
+  };
+  for (_i = 0, _len = lines.length; _i < _len; _i++) {
+    ln = lines[_i];
+    _fn(ln);
+  }
+  return formatted;
+};
+
+var SwaggerRequest = function (type, url, params, opts, successCallback, errorCallback, operation, execution) {
+  var _this = this;
+  var errors = [];
+
+  this.useJQuery = (typeof operation.resource.useJQuery !== 'undefined' ? operation.resource.useJQuery : null);
+  this.type = (type || errors.push('SwaggerRequest type is required (get/post/put/delete/patch/options).'));
+  this.url = (url || errors.push('SwaggerRequest url is required.'));
+  this.params = params;
+  this.opts = opts;
+  this.successCallback = (successCallback || errors.push('SwaggerRequest successCallback is required.'));
+  this.errorCallback = (errorCallback || errors.push('SwaggerRequest error callback is required.'));
+  this.operation = (operation || errors.push('SwaggerRequest operation is required.'));
+  this.execution = execution;
+  this.headers = (params.headers || {});
+
+  if (errors.length > 0) {
+    throw errors;
+  }
+
+  this.type = this.type.toUpperCase();
+
+  // set request, response content type headers
+  var headers = this.setHeaders(params, opts, this.operation);
+  var body = params.body;
+
+  // encode the body for form submits
+  if (headers['Content-Type']) {
+    var key, value, values = {}, i;
+    var operationParams = this.operation.parameters;
+    for (i = 0; i < operationParams.length; i++) {
+      var param = operationParams[i];
+      if (param.paramType === 'form')
+        values[param.name] = param;
+    }
+
+    if (headers['Content-Type'].indexOf('application/x-www-form-urlencoded') === 0) {
+      var encoded = '';
+      for (key in values) {
+        value = this.params[key];
+        if (typeof value !== 'undefined') {
+          if (encoded !== '')
+            encoded += '&';
+          encoded += encodeURIComponent(key) + '=' + encodeURIComponent(value);
+        }
+      }
+      body = encoded;
+    }
+    else if (headers['Content-Type'].indexOf('multipart/form-data') === 0) {
+      // encode the body for form submits
+      var data = '';
+      var boundary = '----SwaggerFormBoundary' + Date.now();
+      for (key in values) {
+        value = this.params[key];
+        if (typeof value !== 'undefined') {
+          data += '--' + boundary + '\n';
+          data += 'Content-Disposition: form-data; name="' + key + '"';
+          data += '\n\n';
+          data += value + '\n';
+        }
+      }
+      data += '--' + boundary + '--\n';
+      headers['Content-Type'] = 'multipart/form-data; boundary=' + boundary;
+      body = data;
+    }
+  }
+
+  var obj;
+  if (!((this.headers != null) && (this.headers.mock != null))) {
+    obj = {
+      url: this.url,
+      method: this.type,
+      headers: headers,
+      body: body,
+      useJQuery: this.useJQuery,
+      on: {
+        error: function (response) {
+          return _this.errorCallback(response, _this.opts.parent);
+        },
+        redirect: function (response) {
+          return _this.successCallback(response, _this.opts.parent);
+        },
+        307: function (response) {
+          return _this.successCallback(response, _this.opts.parent);
+        },
+        response: function (response) {
+          return _this.successCallback(response, _this.opts.parent);
+        }
+      }
+    };
+
+    var status = false;
+    if (this.operation.resource && this.operation.resource.api && this.operation.resource.api.clientAuthorizations) {
+      // Get the client authorizations from the resource declaration
+      status = this.operation.resource.api.clientAuthorizations.apply(obj, this.operation.authorizations);
+    } else {
+      // Get the client authorization from the default authorization declaration
+      var e;
+      if (typeof window !== 'undefined') {
+        e = window;
+      } else {
+        e = exports;
+      }
+      status = e.authorizations.apply(obj, this.operation.authorizations);
+    }
+
+    if (!opts.mock) {
+      if (status !== false) {
+        new SwaggerHttp().execute(obj);
+      } else {
+        obj.canceled = true;
+      }
+    } else {
+      return obj;
+    }
+  }
+  return obj;
+};
+
+SwaggerRequest.prototype.setHeaders = function (params, opts, operation) {
+  // default type
+  var accepts = opts.responseContentType || 'application/json';
+  var consumes = opts.requestContentType || 'application/json';
+
+  var allDefinedParams = operation.parameters;
+  var definedFormParams = [];
+  var definedFileParams = [];
+  var body = params.body;
+  var headers = {};
+
+  // get params from the operation and set them in definedFileParams, definedFormParams, headers
+  var i;
+  for (i = 0; i < allDefinedParams.length; i++) {
+    var param = allDefinedParams[i];
+    if (param.paramType === 'form')
+      definedFormParams.push(param);
+    else if (param.paramType === 'file')
+      definedFileParams.push(param);
+    else if (param.paramType === 'header' && this.params.headers) {
+      var key = param.name;
+      var headerValue = this.params.headers[param.name];
+      if (typeof this.params.headers[param.name] !== 'undefined')
+        headers[key] = headerValue;
+    }
+  }
+
+  // if there's a body, need to set the accepts header via requestContentType
+  if (body && (this.type === 'POST' || this.type === 'PUT' || this.type === 'PATCH' || this.type === 'DELETE')) {
+    if (this.opts.requestContentType)
+      consumes = this.opts.requestContentType;
+  } else {
+    // if any form params, content type must be set
+    if (definedFormParams.length > 0) {
+      if (definedFileParams.length > 0)
+        consumes = 'multipart/form-data';
+      else
+        consumes = 'application/x-www-form-urlencoded';
+    }
+    else if (this.type === 'DELETE')
+      body = '{}';
+    else if (this.type != 'DELETE')
+      consumes = null;
+  }
+
+  if (consumes && this.operation.consumes) {
+    if (this.operation.consumes.indexOf(consumes) === -1) {
+      log('server doesn\'t consume ' + consumes + ', try ' + JSON.stringify(this.operation.consumes));
+    }
+  }
+
+  if (this.opts && this.opts.responseContentType) {
+    accepts = this.opts.responseContentType;
+  } else {
+    accepts = 'application/json';
+  }
+  if (accepts && operation.produces) {
+    if (operation.produces.indexOf(accepts) === -1) {
+      log('server can\'t produce ' + accepts);
+    }
+  }
+
+  if ((consumes && body !== '') || (consumes === 'application/x-www-form-urlencoded'))
+    headers['Content-Type'] = consumes;
+  if (accepts)
+    headers.Accept = accepts;
+  return headers;
+};
+
+/**
+ * SwaggerHttp is a wrapper for executing requests
+ */
+var SwaggerHttp = function() {};
+
+SwaggerHttp.prototype.execute = function(obj) {
+  if(obj && (typeof obj.useJQuery === 'boolean'))
+    this.useJQuery = obj.useJQuery;
+  else
+    this.useJQuery = this.isIE8();
+
+  if(obj && typeof obj.body === 'object') {
+    obj.body = JSON.stringify(obj.body);
+  }
+
+  if(this.useJQuery)
+    return new JQueryHttpClient().execute(obj);
+  else
+    return new ShredHttpClient().execute(obj);
+};
+
+SwaggerHttp.prototype.isIE8 = function() {
+  var detectedIE = false;
+  if (typeof navigator !== 'undefined' && navigator.userAgent) {
+    nav = navigator.userAgent.toLowerCase();
+    if (nav.indexOf('msie') !== -1) {
+      var version = parseInt(nav.split('msie')[1]);
+      if (version <= 8) {
+        detectedIE = true;
+      }
+    }
+  }
+  return detectedIE;
+};
+
+/*
+ * JQueryHttpClient lets a browser take advantage of JQuery's cross-browser magic.
+ * NOTE: when jQuery is available it will export both '$' and 'jQuery' to the global space.
+ *       Since we are using closures here we need to alias it for internal use.
+ */
+var JQueryHttpClient = function(options) {
+  "use strict";
+  if(!jQuery){
+    var jQuery = window.jQuery;
+  }
+};
+
+JQueryHttpClient.prototype.execute = function(obj) {
+  var cb = obj.on;
+  var request = obj;
+
+  obj.type = obj.method;
+  obj.cache = false;
+
+  obj.beforeSend = function(xhr) {
+    var key, results;
+    if (obj.headers) {
+      results = [];
+      for (key in obj.headers) {
+        if (key.toLowerCase() === "content-type") {
+          results.push(obj.contentType = obj.headers[key]);
+        } else if (key.toLowerCase() === "accept") {
+          results.push(obj.accepts = obj.headers[key]);
+        } else {
+          results.push(xhr.setRequestHeader(key, obj.headers[key]));
+        }
+      }
+      return results;
+    }
+  };
+
+  obj.data = obj.body;
+  obj.complete = function(response, textStatus, opts) {
+    var headers = {},
+      headerArray = response.getAllResponseHeaders().split("\n");
+
+    for(var i = 0; i < headerArray.length; i++) {
+      var toSplit = headerArray[i].trim();
+      if(toSplit.length === 0)
+        continue;
+      var separator = toSplit.indexOf(":");
+      if(separator === -1) {
+        // Name but no value in the header
+        headers[toSplit] = null;
+        continue;
+      }
+      var name = toSplit.substring(0, separator).trim(),
+        value = toSplit.substring(separator + 1).trim();
+      headers[name] = value;
+    }
+
+    var out = {
+      url: request.url,
+      method: request.method,
+      status: response.status,
+      data: response.responseText,
+      headers: headers
+    };
+
+    var contentType = (headers["content-type"]||headers["Content-Type"]||null);
+    if(contentType) {
+      if(contentType.indexOf("application/json") === 0 || contentType.indexOf("+json") > 0) {
+        try {
+          out.obj = response.responseJSON || {};
+        } catch (ex) {
+          // do not set out.obj
+          log("unable to parse JSON content");
+        }
+      }
+    }
+
+    if(response.status >= 200 && response.status < 300)
+      cb.response(out);
+    else if(response.status === 0 || (response.status >= 400 && response.status < 599))
+      cb.error(out);
+    else
+      return cb.response(out);
+  };
+
+  jQuery.support.cors = true;
+  return jQuery.ajax(obj);
+};
+
+/*
+ * ShredHttpClient is a light-weight, node or browser HTTP client
+ */
+var ShredHttpClient = function(options) {
+  this.options = (options||{});
+  this.isInitialized = false;
+
+  var identity, toString;
+
+  if (typeof window !== 'undefined') {
+    this.Shred = require("./shred");
+    this.content = require("./shred/content");
+  }
+  else
+    this.Shred = require("shred");
+  this.shred = new this.Shred(options);
+};
+
+ShredHttpClient.prototype.initShred = function () {
+  this.isInitialized = true;
+  this.registerProcessors(this.shred);
+};
+
+ShredHttpClient.prototype.registerProcessors = function(shred) {
+  var identity = function(x) {
+    return x;
+  };
+  var toString = function(x) {
+    return x.toString();
+  };
+
+  if (typeof window !== 'undefined') {
+    this.content.registerProcessor(["application/json; charset=utf-8", "application/json", "json"], {
+      parser: identity,
+      stringify: toString
+    });
+  } else {
+    this.Shred.registerProcessor(["application/json; charset=utf-8", "application/json", "json"], {
+      parser: identity,
+      stringify: toString
+    });
+  }
+};
+
+ShredHttpClient.prototype.execute = function(obj) {
+  if(!this.isInitialized)
+    this.initShred();
+
+  var cb = obj.on, res;
+  var transform = function(response) {
+    var out = {
+      headers: response._headers,
+      url: response.request.url,
+      method: response.request.method,
+      status: response.status,
+      data: response.content.data
+    };
+
+    var headers = response._headers.normalized || response._headers;
+    var contentType = (headers["content-type"]||headers["Content-Type"]||null);
+
+    if(contentType) {
+      if(contentType.indexOf("application/json") === 0 || contentType.indexOf("+json") > 0) {
+        if(response.content.data && response.content.data !== "")
+          try{
+            out.obj = JSON.parse(response.content.data);
+          }
+          catch (e) {
+            // unable to parse
+          }
+        else
+          out.obj = {};
+      }
+    }
+    return out;
+  };
+
+  // Transform an error into a usable response-like object
+  var transformError = function (error) {
+    var out = {
+      // Default to a status of 0 - The client will treat this as a generic permissions sort of error
+      status: 0,
+      data: error.message || error
+    };
+
+    if (error.code) {
+      out.obj = error;
+
+      if (error.code === 'ENOTFOUND' || error.code === 'ECONNREFUSED') {
+        // We can tell the client that this should be treated as a missing resource and not as a permissions thing
+        out.status = 404;
+      }
+    }
+    return out;
+  };
+
+  res = {
+    error: function (response) {
+      if (obj)
+        return cb.error(transform(response));
+    },
+    // Catch the Shred error raised when the request errors as it is made (i.e. No Response is coming)
+    request_error: function (err) {
+      if (obj)
+        return cb.error(transformError(err));
+    },
+    response: function (response) {
+      if (obj) {
+        return cb.response(transform(response));
+      }
+    }
+  };
+  if (obj) {
+    obj.on = res;
+  }
+  return this.shred.request(obj);
+};
+
+
+var e = (typeof window !== 'undefined' ? window : exports);
+
+e.authorizations = new SwaggerAuthorizations();
+e.ApiKeyAuthorization = ApiKeyAuthorization;
+e.PasswordAuthorization = PasswordAuthorization;
+e.CookieAuthorization = CookieAuthorization;
+e.SwaggerClient = SwaggerClient;
+e.Operation = Operation;
+e.Model = Model;
+e.models = models;
+})();`)
+
+func third_partySwaggerUiLibSwaggerClientJsBytes() ([]byte, error) {
+	return _third_partySwaggerUiLibSwaggerClientJs, nil
+}
+
+func third_partySwaggerUiLibSwaggerClientJs() (*asset, error) {
+	bytes, err := third_partySwaggerUiLibSwaggerClientJsBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/lib/swagger-client.js", size: 86354, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiLibSwaggerOauthJs = []byte(`var appName;
+var popupMask;
+var popupDialog;
+var clientId;
+var realm;
+var oauth2KeyName;
+
+function handleLogin() {
+  var scopes = [];
+
+  var auths = window.swaggerUi.api.authSchemes || window.swaggerUi.api.securityDefinitions;
+  if(auths) {
+    var key;
+    var defs = auths;
+    for(key in defs) {
+      var auth = defs[key];
+      if(auth.type === 'oauth2' && auth.scopes) {
+        oauth2KeyName = key;
+        var scope;
+        if(Array.isArray(auth.scopes)) {
+          // 1.2 support
+          var i;
+          for(i = 0; i < auth.scopes.length; i++) {
+            scopes.push(auth.scopes[i]);
+          }
+        }
+        else {
+          // 2.0 support
+          for(scope in auth.scopes) {
+            scopes.push({scope: scope, description: auth.scopes[scope]});
+          }
+        }
+      }
+    }
+  }
+
+  if(window.swaggerUi.api
+    && window.swaggerUi.api.info) {
+    appName = window.swaggerUi.api.info.title;
+  }
+
+  popupDialog = $(
+    [
+      '<div class="api-popup-dialog">',
+      '<div class="api-popup-title">Select OAuth2.0 Scopes</div>',
+      '<div class="api-popup-content">',
+        '<p>Scopes are used to grant an application different levels of access to data on behalf of the end user. Each API may declare one or more scopes.',
+          '<a href="#">Learn how to use</a>',
+        '</p>',
+        '<p><strong>' + appName + '</strong> API requires the following scopes. Select which ones you want to grant to Swagger UI.</p>',
+        '<ul class="api-popup-scopes">',
+        '</ul>',
+        '<p class="error-msg"></p>',
+        '<div class="api-popup-actions"><button class="api-popup-authbtn api-button green" type="button">Authorize</button><button class="api-popup-cancel api-button gray" type="button">Cancel</button></div>',
+      '</div>',
+      '</div>'].join(''));
+  $(document.body).append(popupDialog);
+
+  popup = popupDialog.find('ul.api-popup-scopes').empty();
+  for (i = 0; i < scopes.length; i ++) {
+    scope = scopes[i];
+    str = '<li><input type="checkbox" id="scope_' + i + '" scope="' + scope.scope + '"/>' + '<label for="scope_' + i + '">' + scope.scope;
+    if (scope.description) {
+      str += '<br/><span class="api-scope-desc">' + scope.description + '</span>';
+    }
+    str += '</label></li>';
+    popup.append(str);
+  }
+
+  var $win = $(window),
+    dw = $win.width(),
+    dh = $win.height(),
+    st = $win.scrollTop(),
+    dlgWd = popupDialog.outerWidth(),
+    dlgHt = popupDialog.outerHeight(),
+    top = (dh -dlgHt)/2 + st,
+    left = (dw - dlgWd)/2;
+
+  popupDialog.css({
+    top: (top < 0? 0 : top) + 'px',
+    left: (left < 0? 0 : left) + 'px'
+  });
+
+  popupDialog.find('button.api-popup-cancel').click(function() {
+    popupMask.hide();
+    popupDialog.hide();
+    popupDialog.empty();
+    popupDialog = [];
+  });
+
+  $('button.api-popup-authbtn').unbind();
+  popupDialog.find('button.api-popup-authbtn').click(function() {
+    popupMask.hide();
+    popupDialog.hide();
+
+    var authSchemes = window.swaggerUi.api.authSchemes;
+    var host = window.location;
+    var pathname = location.pathname.substring(0, location.pathname.lastIndexOf("/"));
+    var redirectUrl = host.protocol + '//' + host.host + pathname + '/o2c.html';
+    var url = null;
+
+    for (var key in authSchemes) {
+      if (authSchemes.hasOwnProperty(key)) {
+        var flow = authSchemes[key].flow;
+        
+        if(authSchemes[key].type === 'oauth2' && flow && (flow === 'implicit' || flow === 'accessCode')) {
+          var dets = authSchemes[key];
+          url = dets.authorizationUrl + '?response_type=' + (flow === 'implicit' ? 'token' : 'code');
+          window.swaggerUi.tokenName = dets.tokenName || 'access_token';
+          window.swaggerUi.tokenUrl = (flow === 'accessCode' ? dets.tokenUrl : null);          
+        }
+        else if(authSchemes[key].grantTypes) {
+          // 1.2 support
+          var o = authSchemes[key].grantTypes;
+          for(var t in o) {
+            if(o.hasOwnProperty(t) && t === 'implicit') {
+              var dets = o[t];
+              var ep = dets.loginEndpoint.url;
+              url = dets.loginEndpoint.url + '?response_type=token';
+              window.swaggerUi.tokenName = dets.tokenName;
+            }
+            else if (o.hasOwnProperty(t) && t === 'accessCode') {
+              var dets = o[t];
+              var ep = dets.tokenRequestEndpoint.url;
+              url = dets.tokenRequestEndpoint.url + '?response_type=code';
+              window.swaggerUi.tokenName = dets.tokenName;
+            }
+          }
+        }
+      }
+    }
+    var scopes = []
+    var o = $('.api-popup-scopes').find('input:checked');
+
+    for(k =0; k < o.length; k++) {
+      var scope = $(o[k]).attr('scope');
+      
+      if (scopes.indexOf(scope) === -1)
+        scopes.push(scope);
+    }
+
+    window.enabledScopes=scopes;
+
+    url += '&redirect_uri=' + encodeURIComponent(redirectUrl);
+    url += '&realm=' + encodeURIComponent(realm);
+    url += '&client_id=' + encodeURIComponent(clientId);
+    url += '&scope=' + encodeURIComponent(scopes);
+
+    window.open(url);
+  });
+
+  popupMask.show();
+  popupDialog.show();
+  return;
+}
+
+
+function handleLogout() {
+  for(key in window.authorizations.authz){
+    window.authorizations.remove(key)
+  }
+  window.enabledScopes = null;
+  $('.api-ic.ic-on').addClass('ic-off');
+  $('.api-ic.ic-on').removeClass('ic-on');
+
+  // set the info box
+  $('.api-ic.ic-warning').addClass('ic-error');
+  $('.api-ic.ic-warning').removeClass('ic-warning');
+}
+
+function initOAuth(opts) {
+  var o = (opts||{});
+  var errors = [];
+
+  appName = (o.appName||errors.push('missing appName'));
+  popupMask = (o.popupMask||$('#api-common-mask'));
+  popupDialog = (o.popupDialog||$('.api-popup-dialog'));
+  clientId = (o.clientId||errors.push('missing client id'));
+  realm = (o.realm||errors.push('missing realm'));
+
+  if(errors.length > 0){
+    log('auth unable initialize oauth: ' + errors);
+    return;
+  }
+
+  $('pre code').each(function(i, e) {hljs.highlightBlock(e)});
+  $('.api-ic').unbind();
+  $('.api-ic').click(function(s) {
+    if($(s.target).hasClass('ic-off'))
+      handleLogin();
+    else {
+      handleLogout();
+    }
+    false;
+  });
+}
+
+function processOAuthCode(data) {
+  var params = {
+    'client_id': clientId,
+    'code': data.code,
+    'grant_type': 'authorization_code'
+  }
+  $.ajax(
+  {
+    url : window.swaggerUi.tokenUrl,
+    type: "POST",
+    data: params,
+    success:function(data, textStatus, jqXHR) 
+    {
+      onOAuthComplete(data);
+    },
+    error: function(jqXHR, textStatus, errorThrown) 
+    {
+      onOAuthComplete("");
+    }
+  });
+}
+
+function onOAuthComplete(token) {
+  if(token) {
+    if(token.error) {
+      var checkbox = $('input[type=checkbox],.secured')
+      checkbox.each(function(pos){
+        checkbox[pos].checked = false;
+      });
+      alert(token.error);
+    }
+    else {
+      var b = token[window.swaggerUi.tokenName];
+      if(b){
+        // if all roles are satisfied
+        var o = null;
+        $.each($('.auth #api_information_panel'), function(k, v) {
+          var children = v;
+          if(children && children.childNodes) {
+            var requiredScopes = [];
+            $.each((children.childNodes), function (k1, v1){
+              var inner = v1.innerHTML;
+              if(inner)
+                requiredScopes.push(inner);
+            });
+            var diff = [];
+            for(var i=0; i < requiredScopes.length; i++) {
+              var s = requiredScopes[i];
+              if(window.enabledScopes && window.enabledScopes.indexOf(s) == -1) {
+                diff.push(s);
+              }
+            }
+            if(diff.length > 0){
+              o = v.parentNode;
+              $(o.parentNode).find('.api-ic.ic-on').addClass('ic-off');
+              $(o.parentNode).find('.api-ic.ic-on').removeClass('ic-on');
+
+              // sorry, not all scopes are satisfied
+              $(o).find('.api-ic').addClass('ic-warning');
+              $(o).find('.api-ic').removeClass('ic-error');
+            }
+            else {
+              o = v.parentNode;
+              $(o.parentNode).find('.api-ic.ic-off').addClass('ic-on');
+              $(o.parentNode).find('.api-ic.ic-off').removeClass('ic-off');
+
+              // all scopes are satisfied
+              $(o).find('.api-ic').addClass('ic-info');
+              $(o).find('.api-ic').removeClass('ic-warning');
+              $(o).find('.api-ic').removeClass('ic-error');          
+            }
+          }
+        });
+        window.authorizations.add(oauth2KeyName, new ApiKeyAuthorization('Authorization', 'Bearer ' + b, 'header'));
+      }
+    }
+  }
+}`)
+
+func third_partySwaggerUiLibSwaggerOauthJsBytes() ([]byte, error) {
+	return _third_partySwaggerUiLibSwaggerOauthJs, nil
+}
+
+func third_partySwaggerUiLibSwaggerOauthJs() (*asset, error) {
+	bytes, err := third_partySwaggerUiLibSwaggerOauthJsBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/lib/swagger-oauth.js", size: 8580, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiLibSwaggerJs = []byte(`// swagger.js
+// version 2.0.47
+
+(function () {
+
+  var __bind = function (fn, me) {
+    return function () {
+      return fn.apply(me, arguments);
+    };
+  };
+
+  var log = function () {
+    log.history = log.history || [];
+    log.history.push(arguments);
+    if (this.console) {
+      console.log(Array.prototype.slice.call(arguments)[0]);
+    }
+  };
+
+  // if you want to apply conditional formatting of parameter values
+  var parameterMacro = function (value) {
+    return value;
+  }
+
+  // if you want to apply conditional formatting of model property values
+  var modelPropertyMacro = function (value) {
+    return value;
+  }
+
+  if (!Array.prototype.indexOf) {
+    Array.prototype.indexOf = function (obj, start) {
+      for (var i = (start || 0), j = this.length; i < j; i++) {
+        if (this[i] === obj) { return i; }
+      }
+      return -1;
+    }
+  }
+
+  if (!('filter' in Array.prototype)) {
+    Array.prototype.filter = function (filter, that /*opt*/) {
+      var other = [], v;
+      for (var i = 0, n = this.length; i < n; i++)
+        if (i in this && filter.call(that, v = this[i], i, this))
+          other.push(v);
+      return other;
+    };
+  }
+
+  if (!('map' in Array.prototype)) {
+    Array.prototype.map = function (mapper, that /*opt*/) {
+      var other = new Array(this.length);
+      for (var i = 0, n = this.length; i < n; i++)
+        if (i in this)
+          other[i] = mapper.call(that, this[i], i, this);
+      return other;
+    };
+  }
+
+  Object.keys = Object.keys || (function () {
+    var hasOwnProperty = Object.prototype.hasOwnProperty,
+      hasDontEnumBug = !{ toString: null }.propertyIsEnumerable("toString"),
+      DontEnums = [
+      'toString',
+      'toLocaleString',
+      'valueOf',
+      'hasOwnProperty',
+      'isPrototypeOf',
+      'propertyIsEnumerable',
+      'constructor'
+      ],
+    DontEnumsLength = DontEnums.length;
+
+    return function (o) {
+      if (typeof o != "object" && typeof o != "function" || o === null)
+        throw new TypeError("Object.keys called on a non-object");
+
+      var result = [];
+      for (var name in o) {
+        if (hasOwnProperty.call(o, name))
+          result.push(name);
+      }
+
+      if (hasDontEnumBug) {
+        for (var i = 0; i < DontEnumsLength; i++) {
+          if (hasOwnProperty.call(o, DontEnums[i]))
+            result.push(DontEnums[i]);
+        }
+      }
+
+      return result;
+    };
+  })();
+
+  var SwaggerApi = function (url, options) {
+    this.isBuilt = false;
+    this.url = null;
+    this.debug = false;
+    this.basePath = null;
+    this.authorizations = null;
+    this.authorizationScheme = null;
+    this.info = null;
+    this.useJQuery = false;
+    this.modelsArray = [];
+    this.isValid;
+
+    options = (options || {});
+    if (url)
+      if (url.url)
+        options = url;
+      else
+        this.url = url;
+    else
+      options = url;
+
+    if (options.url != null)
+      this.url = options.url;
+
+    if (options.success != null)
+      this.success = options.success;
+
+    if (typeof options.useJQuery === 'boolean')
+      this.useJQuery = options.useJQuery;
+
+    this.failure = options.failure != null ? options.failure : function () { };
+    this.progress = options.progress != null ? options.progress : function () { };
+    if (options.success != null) {
+      this.build();
+      this.isBuilt = true;
+    }
+  }
+
+  SwaggerApi.prototype.build = function () {
+    if (this.isBuilt)
+      return this;
+    var _this = this;
+    this.progress('fetching resource list: ' + this.url);
+    var obj = {
+      useJQuery: this.useJQuery,
+      url: this.url,
+      method: "get",
+      headers: {
+        accept: "application/json,application/json;charset=utf-8,*/*"
+      },
+      on: {
+        error: function (response) {
+          if (_this.url.substring(0, 4) !== 'http') {
+            return _this.fail('Please specify the protocol for ' + _this.url);
+          } else if (response.status === 0) {
+            return _this.fail('Can\'t read from server.  It may not have the appropriate access-control-origin settings.');
+          } else if (response.status === 404) {
+            return _this.fail('Can\'t read swagger JSON from ' + _this.url);
+          } else {
+            return _this.fail(response.status + ' : ' + response.statusText + ' ' + _this.url);
+          }
+        },
+        response: function (resp) {
+          var responseObj = resp.obj || JSON.parse(resp.data);
+          _this.swaggerVersion = responseObj.swaggerVersion;
+          if (_this.swaggerVersion === "1.2") {
+            return _this.buildFromSpec(responseObj);
+          } else {
+            return _this.buildFrom1_1Spec(responseObj);
+          }
+        }
+      }
+    };
+    var e = (typeof window !== 'undefined' ? window : exports);
+    e.authorizations.apply(obj);
+    new SwaggerHttp().execute(obj);
+    return this;
+  };
+
+  SwaggerApi.prototype.buildFromSpec = function (response) {
+    if (response.apiVersion != null) {
+      this.apiVersion = response.apiVersion;
+    }
+    this.apis = {};
+    this.apisArray = [];
+    this.consumes = response.consumes;
+    this.produces = response.produces;
+    this.authSchemes = response.authorizations;
+    if (response.info != null) {
+      this.info = response.info;
+    }
+    var isApi = false;
+    var i;
+    for (i = 0; i < response.apis.length; i++) {
+      var api = response.apis[i];
+      if (api.operations) {
+        var j;
+        for (j = 0; j < api.operations.length; j++) {
+          operation = api.operations[j];
+          isApi = true;
+        }
+      }
+    }
+    if (response.basePath)
+      this.basePath = response.basePath;
+    else if (this.url.indexOf('?') > 0)
+      this.basePath = this.url.substring(0, this.url.lastIndexOf('?'));
+    else
+      this.basePath = this.url;
+
+    if (isApi) {
+      var newName = response.resourcePath.replace(/\//g, '');
+      this.resourcePath = response.resourcePath;
+      var res = new SwaggerResource(response, this);
+      this.apis[newName] = res;
+      this.apisArray.push(res);
+    } else {
+      var k;
+      for (k = 0; k < response.apis.length; k++) {
+        var resource = response.apis[k];
+        var res = new SwaggerResource(resource, this);
+        this.apis[res.name] = res;
+        this.apisArray.push(res);
+      }
+    }
+    this.isValid = true;
+    if (this.success) {
+      this.success();
+    }
+    return this;
+  };
+
+  SwaggerApi.prototype.buildFrom1_1Spec = function (response) {
+    log("This API is using a deprecated version of Swagger!  Please see http://github.com/wordnik/swagger-core/wiki for more info");
+    if (response.apiVersion != null)
+      this.apiVersion = response.apiVersion;
+    this.apis = {};
+    this.apisArray = [];
+    this.produces = response.produces;
+    if (response.info != null) {
+      this.info = response.info;
+    }
+    var isApi = false;
+    for (var i = 0; i < response.apis.length; i++) {
+      var api = response.apis[i];
+      if (api.operations) {
+        for (var j = 0; j < api.operations.length; j++) {
+          operation = api.operations[j];
+          isApi = true;
+        }
+      }
+    }
+    if (response.basePath) {
+      this.basePath = response.basePath;
+    } else if (this.url.indexOf('?') > 0) {
+      this.basePath = this.url.substring(0, this.url.lastIndexOf('?'));
+    } else {
+      this.basePath = this.url;
+    }
+    if (isApi) {
+      var newName = response.resourcePath.replace(/\//g, '');
+      this.resourcePath = response.resourcePath;
+      var res = new SwaggerResource(response, this);
+      this.apis[newName] = res;
+      this.apisArray.push(res);
+    } else {
+      for (k = 0; k < response.apis.length; k++) {
+        resource = response.apis[k];
+        var res = new SwaggerResource(resource, this);
+        this.apis[res.name] = res;
+        this.apisArray.push(res);
+      }
+    }
+    this.isValid = true;
+    if (this.success) {
+      this.success();
+    }
+    return this;
+  };
+
+  SwaggerApi.prototype.selfReflect = function () {
+    var resource, resource_name, _ref;
+    if (this.apis == null) {
+      return false;
+    }
+    _ref = this.apis;
+    for (resource_name in _ref) {
+      resource = _ref[resource_name];
+      if (resource.ready == null) {
+        return false;
+      }
+    }
+    this.setConsolidatedModels();
+    this.ready = true;
+    if (this.success != null) {
+      return this.success();
+    }
+  };
+
+  SwaggerApi.prototype.fail = function (message) {
+    this.failure(message);
+    throw message;
+  };
+
+  SwaggerApi.prototype.setConsolidatedModels = function () {
+    var model, modelName, resource, resource_name, _i, _len, _ref, _ref1, _results;
+    this.models = {};
+    _ref = this.apis;
+    for (resource_name in _ref) {
+      resource = _ref[resource_name];
+      for (modelName in resource.models) {
+        if (this.models[modelName] == null) {
+          this.models[modelName] = resource.models[modelName];
+          this.modelsArray.push(resource.models[modelName]);
+        }
+      }
+    }
+    _ref1 = this.modelsArray;
+    _results = [];
+    for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
+      model = _ref1[_i];
+      _results.push(model.setReferencedModels(this.models));
+    }
+    return _results;
+  };
+
+  SwaggerApi.prototype.help = function () {
+    var operation, operation_name, parameter, resource, resource_name, _i, _len, _ref, _ref1, _ref2;
+    _ref = this.apis;
+    for (resource_name in _ref) {
+      resource = _ref[resource_name];
+      log(resource_name);
+      _ref1 = resource.operations;
+      for (operation_name in _ref1) {
+        operation = _ref1[operation_name];
+        log("  " + operation.nickname);
+        _ref2 = operation.parameters;
+        for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
+          parameter = _ref2[_i];
+          log("  " + parameter.name + (parameter.required ? ' (required)' : '') + " - " + parameter.description);
+        }
+      }
+    }
+    return this;
+  };
+
+  var SwaggerResource = function (resourceObj, api) {
+    var _this = this;
+    this.api = api;
+    this.api = this.api;
+    var consumes = (this.consumes | []);
+    var produces = (this.produces | []);
+    this.path = this.api.resourcePath != null ? this.api.resourcePath : resourceObj.path;
+    this.description = resourceObj.description;
+
+    var parts = this.path.split("/");
+    this.name = parts[parts.length - 1].replace('.{format}', '');
+    this.basePath = this.api.basePath;
+    this.operations = {};
+    this.operationsArray = [];
+    this.modelsArray = [];
+    this.models = {};
+    this.rawModels = {};
+    this.useJQuery = (typeof api.useJQuery !== 'undefined' ? api.useJQuery : null);
+
+    if ((resourceObj.apis != null) && (this.api.resourcePath != null)) {
+      this.addApiDeclaration(resourceObj);
+    } else {
+      if (this.path == null) {
+        this.api.fail("SwaggerResources must have a path.");
+      }
+      if (this.path.substring(0, 4) === 'http') {
+        this.url = this.path.replace('{format}', 'json');
+      } else {
+        this.url = this.api.basePath + this.path.replace('{format}', 'json');
+      }
+      this.api.progress('fetching resource ' + this.name + ': ' + this.url);
+      var obj = {
+        url: this.url,
+        method: "get",
+        useJQuery: this.useJQuery,
+        headers: {
+          accept: "application/json,application/json;charset=utf-8,*/*"
+        },
+        on: {
+          response: function (resp) {
+            var responseObj = resp.obj || JSON.parse(resp.data);
+            return _this.addApiDeclaration(responseObj);
+          },
+          error: function (response) {
+            return _this.api.fail("Unable to read api '" +
+              _this.name + "' from path " + _this.url + " (server returned " + response.statusText + ")");
+          }
+        }
+      };
+      var e = typeof window !== 'undefined' ? window : exports;
+      e.authorizations.apply(obj);
+      new SwaggerHttp().execute(obj);
+    }
+  }
+
+  SwaggerResource.prototype.getAbsoluteBasePath = function (relativeBasePath) {
+    var pos, url;
+    url = this.api.basePath;
+    pos = url.lastIndexOf(relativeBasePath);
+    var parts = url.split("/");
+    var rootUrl = parts[0] + "//" + parts[2];
+
+    if (relativeBasePath.indexOf("http") === 0)
+      return relativeBasePath;
+    if (relativeBasePath === "/")
+      return rootUrl;
+    if (relativeBasePath.substring(0, 1) == "/") {
+      // use root + relative
+      return rootUrl + relativeBasePath;
+    }
+    else {
+      var pos = this.basePath.lastIndexOf("/");
+      var base = this.basePath.substring(0, pos);
+      if (base.substring(base.length - 1) == "/")
+        return base + relativeBasePath;
+      else
+        return base + "/" + relativeBasePath;
+    }
+  };
+
+  SwaggerResource.prototype.addApiDeclaration = function (response) {
+    if (response.produces != null)
+      this.produces = response.produces;
+    if (response.consumes != null)
+      this.consumes = response.consumes;
+    if ((response.basePath != null) && response.basePath.replace(/\s/g, '').length > 0)
+      this.basePath = response.basePath.indexOf("http") === -1 ? this.getAbsoluteBasePath(response.basePath) : response.basePath;
+
+    this.addModels(response.models);
+    if (response.apis) {
+      for (var i = 0 ; i < response.apis.length; i++) {
+        var endpoint = response.apis[i];
+        this.addOperations(endpoint.path, endpoint.operations, response.consumes, response.produces);
+      }
+    }
+    this.api[this.name] = this;
+    this.ready = true;
+    return this.api.selfReflect();
+  };
+
+  SwaggerResource.prototype.addModels = function (models) {
+    if (models != null) {
+      var modelName;
+      for (modelName in models) {
+        if (this.models[modelName] == null) {
+          var swaggerModel = new SwaggerModel(modelName, models[modelName]);
+          this.modelsArray.push(swaggerModel);
+          this.models[modelName] = swaggerModel;
+          this.rawModels[modelName] = models[modelName];
+        }
+      }
+      var output = [];
+      for (var i = 0; i < this.modelsArray.length; i++) {
+        var model = this.modelsArray[i];
+        output.push(model.setReferencedModels(this.models));
+      }
+      return output;
+    }
+  };
+
+  SwaggerResource.prototype.addOperations = function (resource_path, ops, consumes, produces) {
+    if (ops) {
+      var output = [];
+      for (var i = 0; i < ops.length; i++) {
+        var o = ops[i];
+        consumes = this.consumes;
+        produces = this.produces;
+        if (o.consumes != null)
+          consumes = o.consumes;
+        else
+          consumes = this.consumes;
+
+        if (o.produces != null)
+          produces = o.produces;
+        else
+          produces = this.produces;
+        var type = (o.type || o.responseClass);
+
+        if (type === "array") {
+          ref = null;
+          if (o.items)
+            ref = o.items["type"] || o.items["$ref"];
+          type = "array[" + ref + "]";
+        }
+        var responseMessages = o.responseMessages;
+        var method = o.method;
+        if (o.httpMethod) {
+          method = o.httpMethod;
+        }
+        if (o.supportedContentTypes) {
+          consumes = o.supportedContentTypes;
+        }
+        if (o.errorResponses) {
+          responseMessages = o.errorResponses;
+          for (var j = 0; j < responseMessages.length; j++) {
+            r = responseMessages[j];
+            r.message = r.reason;
+            r.reason = null;
+          }
+        }
+        o.nickname = this.sanitize(o.nickname);
+        var op = new SwaggerOperation(o.nickname, resource_path, method, o.parameters, o.summary, o.notes, type, responseMessages, this, consumes, produces, o.authorizations, o.deprecated);
+        this.operations[op.nickname] = op;
+        output.push(this.operationsArray.push(op));
+      }
+      return output;
+    }
+  };
+
+  SwaggerResource.prototype.sanitize = function (nickname) {
+    var op;
+    op = nickname.replace(/[\s!@#$%^&*()_+=\[{\]};:<>|.\/?,\\'""-]/g, '_');
+    op = op.replace(/((_){2,})/g, '_');
+    op = op.replace(/^(_)*/g, '');
+    op = op.replace(/([_])*$/g, '');
+    return op;
+  };
+
+  SwaggerResource.prototype.help = function () {
+    var op = this.operations;
+    var output = [];
+    var operation_name;
+    for (operation_name in op) {
+      operation = op[operation_name];
+      var msg = "  " + operation.nickname;
+      for (var i = 0; i < operation.parameters; i++) {
+        parameter = operation.parameters[i];
+        msg.concat("  " + parameter.name + (parameter.required ? ' (required)' : '') + " - " + parameter.description);
+      }
+      output.push(msg);
+    }
+    return output;
+  };
+
+  var SwaggerModel = function (modelName, obj) {
+    this.name = obj.id != null ? obj.id : modelName;
+    this.properties = [];
+    var propertyName;
+    for (propertyName in obj.properties) {
+      if (obj.required != null) {
+        var value;
+        for (value in obj.required) {
+          if (propertyName === obj.required[value]) {
+            obj.properties[propertyName].required = true;
+          }
+        }
+      }
+      var prop = new SwaggerModelProperty(propertyName, obj.properties[propertyName]);
+      this.properties.push(prop);
+    }
+  }
+
+  SwaggerModel.prototype.setReferencedModels = function (allModels) {
+    var results = [];
+    for (var i = 0; i < this.properties.length; i++) {
+      var property = this.properties[i];
+      var type = property.type || property.dataType;
+      if (allModels[type] != null)
+        results.push(property.refModel = allModels[type]);
+      else if ((property.refDataType != null) && (allModels[property.refDataType] != null))
+        results.push(property.refModel = allModels[property.refDataType]);
+      else
+        results.push(void 0);
+    }
+    return results;
+  };
+
+  SwaggerModel.prototype.getMockSignature = function (modelsToIgnore) {
+    var propertiesStr = [];
+    for (var i = 0; i < this.properties.length; i++) {
+      var prop = this.properties[i];
+      propertiesStr.push(prop.toString());
+    }
+
+    var strong = '<span class="strong">';
+    var stronger = '<span class="stronger">';
+    var strongClose = '</span>';
+    var classOpen = strong + this.name + ' {' + strongClose;
+    var classClose = strong + '}' + strongClose;
+    var returnVal = classOpen + '<div>' + propertiesStr.join(',</div><div>') + '</div>' + classClose;
+    if (!modelsToIgnore)
+      modelsToIgnore = [];
+    modelsToIgnore.push(this.name);
+
+    for (var i = 0; i < this.properties.length; i++) {
+      var prop = this.properties[i];
+      if ((prop.refModel != null) && modelsToIgnore.indexOf(prop.refModel.name) === -1) {
+        returnVal = returnVal + ('<br>' + prop.refModel.getMockSignature(modelsToIgnore));
+      }
+    }
+    return returnVal;
+  };
+
+  SwaggerModel.prototype.createJSONSample = function (modelsToIgnore) {
+    if (sampleModels[this.name]) {
+      return sampleModels[this.name];
+    }
+    else {
+      var result = {};
+      var modelsToIgnore = (modelsToIgnore || [])
+      modelsToIgnore.push(this.name);
+      for (var i = 0; i < this.properties.length; i++) {
+        var prop = this.properties[i];
+        result[prop.name] = prop.getSampleValue(modelsToIgnore);
+      }
+      modelsToIgnore.pop(this.name);
+      return result;
+    }
+  };
+
+  var SwaggerModelProperty = function (name, obj) {
+    this.name = name;
+    this.dataType = obj.type || obj.dataType || obj["$ref"];
+    this.isCollection = this.dataType && (this.dataType.toLowerCase() === 'array' || this.dataType.toLowerCase() === 'list' || this.dataType.toLowerCase() === 'set');
+    this.descr = obj.description;
+    this.required = obj.required;
+    this.defaultValue = modelPropertyMacro(obj.defaultValue);
+    if (obj.items != null) {
+      if (obj.items.type != null) {
+        this.refDataType = obj.items.type;
+      }
+      if (obj.items.$ref != null) {
+        this.refDataType = obj.items.$ref;
+      }
+    }
+    this.dataTypeWithRef = this.refDataType != null ? (this.dataType + '[' + this.refDataType + ']') : this.dataType;
+    if (obj.allowableValues != null) {
+      this.valueType = obj.allowableValues.valueType;
+      this.values = obj.allowableValues.values;
+      if (this.values != null) {
+        this.valuesString = "'" + this.values.join("' or '") + "'";
+      }
+    }
+    if (obj["enum"] != null) {
+      this.valueType = "string";
+      this.values = obj["enum"];
+      if (this.values != null) {
+        this.valueString = "'" + this.values.join("' or '") + "'";
+      }
+    }
+  }
+
+  SwaggerModelProperty.prototype.getSampleValue = function (modelsToIgnore) {
+    var result;
+    if ((this.refModel != null) && (modelsToIgnore.indexOf(this.refModel.name) === -1)) {
+      result = this.refModel.createJSONSample(modelsToIgnore);
+    } else {
+      if (this.isCollection) {
+        result = this.toSampleValue(this.refDataType);
+      } else {
+        result = this.toSampleValue(this.dataType);
+      }
+    }
+    if (this.isCollection) {
+      return [result];
+    } else {
+      return result;
+    }
+  };
+
+  SwaggerModelProperty.prototype.toSampleValue = function (value) {
+    var result;
+    if ((typeof this.defaultValue !== 'undefined') && this.defaultValue !== null) {
+      result = this.defaultValue;
+    } else if (value === "integer") {
+      result = 0;
+    } else if (value === "boolean") {
+      result = false;
+    } else if (value === "double" || value === "number") {
+      result = 0.0;
+    } else if (value === "string") {
+      result = "";
+    } else {
+      result = value;
+    }
+    return result;
+  };
+
+  SwaggerModelProperty.prototype.toString = function () {
+    var req = this.required ? 'propReq' : 'propOpt';
+    var str = '<span class="propName ' + req + '">' + this.name + '</span> (<span class="propType">' + this.dataTypeWithRef + '</span>';
+    if (!this.required) {
+      str += ', <span class="propOptKey">optional</span>';
+    }
+    str += ')';
+    if (this.values != null) {
+      str += " = <span class='propVals'>['" + this.values.join("' or '") + "']</span>";
+    }
+    if (this.descr != null) {
+      str += ': <span class="propDesc">' + this.descr + '</span>';
+    }
+    return str;
+  };
+
+  var SwaggerOperation = function (nickname, path, method, parameters, summary, notes, type, responseMessages, resource, consumes, produces, authorizations, deprecated) {
+    var _this = this;
+
+    var errors = [];
+    this.nickname = (nickname || errors.push("SwaggerOperations must have a nickname."));
+    this.path = (path || errors.push("SwaggerOperation " + nickname + " is missing path."));
+    this.method = (method || errors.push("SwaggerOperation " + nickname + " is missing method."));
+    this.parameters = parameters != null ? parameters : [];
+    this.summary = summary;
+    this.notes = notes;
+    this.type = type;
+    this.responseMessages = (responseMessages || []);
+    this.resource = (resource || errors.push("Resource is required"));
+    this.consumes = consumes;
+    this.produces = produces;
+    this.authorizations = authorizations;
+    this.deprecated = deprecated;
+    this["do"] = __bind(this["do"], this);
+
+    if (errors.length > 0) {
+      console.error('SwaggerOperation errors', errors, arguments);
+      this.resource.api.fail(errors);
+    }
+
+    this.path = this.path.replace('{format}', 'json');
+    this.method = this.method.toLowerCase();
+    this.isGetMethod = this.method === "get";
+
+    this.resourceName = this.resource.name;
+    if (typeof this.type !== 'undefined' && this.type === 'void')
+      this.type = null;
+    else {
+      this.responseClassSignature = this.getSignature(this.type, this.resource.models);
+      this.responseSampleJSON = this.getSampleJSON(this.type, this.resource.models);
+    }
+
+    for (var i = 0; i < this.parameters.length; i++) {
+      var param = this.parameters[i];
+      // might take this away
+      param.name = param.name || param.type || param.dataType;
+
+      // for 1.1 compatibility
+      var type = param.type || param.dataType;
+      if (type === 'array') {
+        type = 'array[' + (param.items.$ref ? param.items.$ref : param.items.type) + ']';
+      }
+      param.type = type;
+
+      if (type && type.toLowerCase() === 'boolean') {
+        param.allowableValues = {};
+        param.allowableValues.values = ["true", "false"];
+      }
+      param.signature = this.getSignature(type, this.resource.models);
+      param.sampleJSON = this.getSampleJSON(type, this.resource.models);
+
+      var enumValue = param["enum"];
+      if (enumValue != null) {
+        param.isList = true;
+        param.allowableValues = {};
+        param.allowableValues.descriptiveValues = [];
+
+        for (var j = 0; j < enumValue.length; j++) {
+          var v = enumValue[j];
+          if (param.defaultValue != null) {
+            param.allowableValues.descriptiveValues.push({
+              value: String(v),
+              isDefault: (v === param.defaultValue)
+            });
+          }
+          else {
+            param.allowableValues.descriptiveValues.push({
+              value: String(v),
+              isDefault: false
+            });
+          }
+        }
+      }
+      else if (param.allowableValues != null) {
+        if (param.allowableValues.valueType === "RANGE")
+          param.isRange = true;
+        else
+          param.isList = true;
+        if (param.allowableValues != null) {
+          param.allowableValues.descriptiveValues = [];
+          if (param.allowableValues.values) {
+            for (var j = 0; j < param.allowableValues.values.length; j++) {
+              var v = param.allowableValues.values[j];
+              if (param.defaultValue != null) {
+                param.allowableValues.descriptiveValues.push({
+                  value: String(v),
+                  isDefault: (v === param.defaultValue)
+                });
+              }
+              else {
+                param.allowableValues.descriptiveValues.push({
+                  value: String(v),
+                  isDefault: false
+                });
+              }
+            }
+          }
+        }
+      }
+      param.defaultValue = parameterMacro(param.defaultValue);
+    }
+    this.resource[this.nickname] = function (args, callback, error) {
+      return _this["do"](args, callback, error);
+    };
+    this.resource[this.nickname].help = function () {
+      return _this.help();
+    };
+  }
+
+  SwaggerOperation.prototype.isListType = function (type) {
+    if (type && type.indexOf('[') >= 0) {
+      return type.substring(type.indexOf('[') + 1, type.indexOf(']'));
+    } else {
+      return void 0;
+    }
+  };
+
+  SwaggerOperation.prototype.getSignature = function (type, models) {
+    var isPrimitive, listType;
+    listType = this.isListType(type);
+    isPrimitive = ((listType != null) && models[listType]) || (models[type] != null) ? false : true;
+    if (isPrimitive) {
+      return type;
+    } else {
+      if (listType != null) {
+        return models[listType].getMockSignature();
+      } else {
+        return models[type].getMockSignature();
+      }
+    }
+  };
+
+  SwaggerOperation.prototype.getSampleJSON = function (type, models) {
+    var isPrimitive, listType, val;
+    listType = this.isListType(type);
+    isPrimitive = ((listType != null) && models[listType]) || (models[type] != null) ? false : true;
+    val = isPrimitive ? void 0 : (listType != null ? models[listType].createJSONSample() : models[type].createJSONSample());
+    if (val) {
+      val = listType ? [val] : val;
+      if (typeof val == "string")
+        return val;
+      else if (typeof val === "object") {
+        var t = val;
+        if (val instanceof Array && val.length > 0) {
+          t = val[0];
+        }
+        if (t.nodeName) {
+          var xmlString = new XMLSerializer().serializeToString(t);
+          return this.formatXml(xmlString);
+        }
+        else
+          return JSON.stringify(val, null, 2);
+      }
+      else
+        return val;
+    }
+  };
+
+  SwaggerOperation.prototype["do"] = function (args, opts, callback, error) {
+    var key, param, params, possibleParams, req, requestContentType, responseContentType, value, _i, _len, _ref;
+    if (args == null) {
+      args = {};
+    }
+    if (opts == null) {
+      opts = {};
+    }
+    requestContentType = null;
+    responseContentType = null;
+    if ((typeof args) === "function") {
+      error = opts;
+      callback = args;
+      args = {};
+    }
+    if ((typeof opts) === "function") {
+      error = callback;
+      callback = opts;
+    }
+    if (error == null) {
+      error = function (xhr, textStatus, error) {
+        return log(xhr, textStatus, error);
+      };
+    }
+    if (callback == null) {
+      callback = function (response) {
+        var content;
+        content = null;
+        if (response != null) {
+          content = response.data;
+        } else {
+          content = "no data";
+        }
+        return log("default callback: " + content);
+      };
+    }
+    params = {};
+    params.headers = [];
+    if (args.headers != null) {
+      params.headers = args.headers;
+      delete args.headers;
+    }
+
+    var possibleParams = [];
+    for (var i = 0; i < this.parameters.length; i++) {
+      var param = this.parameters[i];
+      if (param.paramType === 'header') {
+        if (args[param.name])
+          params.headers[param.name] = args[param.name];
+      }
+      else if (param.paramType === 'form' || param.paramType.toLowerCase() === 'file')
+        possibleParams.push(param);
+      else if (param.paramType === 'body' && param.name !== 'body') {
+        if (args.body) {
+          throw new Error("Saw two body params in an API listing; expecting a max of one.");
+        }
+        args.body = args[param.name];
+      }
+    }
+
+    if (args.body != null) {
+      params.body = args.body;
+      delete args.body;
+    }
+
+    if (possibleParams) {
+      var key;
+      for (key in possibleParams) {
+        var value = possibleParams[key];
+        if (args[value.name]) {
+          params[value.name] = args[value.name];
+        }
+      }
+    }
+
+    req = new SwaggerRequest(this.method, this.urlify(args), params, opts, callback, error, this);
+    if (opts.mock != null) {
+      return req;
+    } else {
+      return true;
+    }
+  };
+
+  SwaggerOperation.prototype.pathJson = function () {
+    return this.path.replace("{format}", "json");
+  };
+
+  SwaggerOperation.prototype.pathXml = function () {
+    return this.path.replace("{format}", "xml");
+  };
+
+  SwaggerOperation.prototype.encodePathParam = function (pathParam) {
+    var encParts, part, parts, _i, _len;
+    pathParam = pathParam.toString();
+    if (pathParam.indexOf("/") === -1) {
+      return encodeURIComponent(pathParam);
+    } else {
+      parts = pathParam.split("/");
+      encParts = [];
+      for (_i = 0, _len = parts.length; _i < _len; _i++) {
+        part = parts[_i];
+        encParts.push(encodeURIComponent(part));
+      }
+      return encParts.join("/");
+    }
+  };
+
+  SwaggerOperation.prototype.urlify = function (args) {
+    var url = this.resource.basePath + this.pathJson();
+    var params = this.parameters;
+    for (var i = 0; i < params.length; i++) {
+      var param = params[i];
+      if (param.paramType === 'path') {
+        if (args[param.name]) {
+          // apply path params and remove from args
+          var reg = new RegExp('\\{\\s*?' + param.name + '.*?\\}(?=\\s*?(\\/?|$))', 'gi');
+          url = url.replace(reg, this.encodePathParam(args[param.name]));
+          delete args[param.name];
+        }
+        else
+          throw "" + param.name + " is a required path param.";
+      }
+    }
+
+    var queryParams = "";
+    for (var i = 0; i < params.length; i++) {
+      var param = params[i];
+      if(param.paramType === 'query') {
+        if (queryParams !== '')
+          queryParams += '&';    
+        if (Array.isArray(param)) {
+          var j;   
+          var output = '';   
+          for(j = 0; j < param.length; j++) {    
+            if(j > 0)    
+              output += ',';   
+            output += encodeURIComponent(param[j]);    
+          }    
+          queryParams += encodeURIComponent(param.name) + '=' + output;    
+        }
+        else {
+          if (args[param.name]) {
+            queryParams += encodeURIComponent(param.name) + '=' + encodeURIComponent(args[param.name]);
+          } else {
+            if (param.required)
+              throw "" + param.name + " is a required query param.";
+          }
+        }
+      }
+    }
+    if ((queryParams != null) && queryParams.length > 0)
+      url += '?' + queryParams;
+    return url;
+  };
+
+  SwaggerOperation.prototype.supportHeaderParams = function () {
+    return this.resource.api.supportHeaderParams;
+  };
+
+  SwaggerOperation.prototype.supportedSubmitMethods = function () {
+    return this.resource.api.supportedSubmitMethods;
+  };
+
+  SwaggerOperation.prototype.getQueryParams = function (args) {
+    return this.getMatchingParams(['query'], args);
+  };
+
+  SwaggerOperation.prototype.getHeaderParams = function (args) {
+    return this.getMatchingParams(['header'], args);
+  };
+
+  SwaggerOperation.prototype.getMatchingParams = function (paramTypes, args) {
+    var matchingParams = {};
+    var params = this.parameters;
+    for (var i = 0; i < params.length; i++) {
+      param = params[i];
+      if (args && args[param.name])
+        matchingParams[param.name] = args[param.name];
+    }
+    var headers = this.resource.api.headers;
+    var name;
+    for (name in headers) {
+      var value = headers[name];
+      matchingParams[name] = value;
+    }
+    return matchingParams;
+  };
+
+  SwaggerOperation.prototype.help = function () {
+    var msg = "";
+    var params = this.parameters;
+    for (var i = 0; i < params.length; i++) {
+      var param = params[i];
+      if (msg !== "")
+        msg += "\n";
+      msg += "* " + param.name + (param.required ? ' (required)' : '') + " - " + param.description;
+    }
+    return msg;
+  };
+
+
+  SwaggerOperation.prototype.formatXml = function (xml) {
+    var contexp, formatted, indent, lastType, lines, ln, pad, reg, transitions, wsexp, _fn, _i, _len;
+    reg = /(>)(<)(\/*)/g;
+    wsexp = /[ ]*(.*)[ ]+\n/g;
+    contexp = /(<.+>)(.+\n)/g;
+    xml = xml.replace(reg, '$1\n$2$3').replace(wsexp, '$1\n').replace(contexp, '$1\n$2');
+    pad = 0;
+    formatted = '';
+    lines = xml.split('\n');
+    indent = 0;
+    lastType = 'other';
+    transitions = {
+      'single->single': 0,
+      'single->closing': -1,
+      'single->opening': 0,
+      'single->other': 0,
+      'closing->single': 0,
+      'closing->closing': -1,
+      'closing->opening': 0,
+      'closing->other': 0,
+      'opening->single': 1,
+      'opening->closing': 0,
+      'opening->opening': 1,
+      'opening->other': 1,
+      'other->single': 0,
+      'other->closing': -1,
+      'other->opening': 0,
+      'other->other': 0
+    };
+    _fn = function (ln) {
+      var fromTo, j, key, padding, type, types, value;
+      types = {
+        single: Boolean(ln.match(/<.+\/>/)),
+        closing: Boolean(ln.match(/<\/.+>/)),
+        opening: Boolean(ln.match(/<[^!?].*>/))
+      };
+      type = ((function () {
+        var _results;
+        _results = [];
+        for (key in types) {
+          value = types[key];
+          if (value) {
+            _results.push(key);
+          }
+        }
+        return _results;
+      })())[0];
+      type = type === void 0 ? 'other' : type;
+      fromTo = lastType + '->' + type;
+      lastType = type;
+      padding = '';
+      indent += transitions[fromTo];
+      padding = ((function () {
+        var _j, _ref5, _results;
+        _results = [];
+        for (j = _j = 0, _ref5 = indent; 0 <= _ref5 ? _j < _ref5 : _j > _ref5; j = 0 <= _ref5 ? ++_j : --_j) {
+          _results.push('  ');
+        }
+        return _results;
+      })()).join('');
+      if (fromTo === 'opening->closing') {
+        return formatted = formatted.substr(0, formatted.length - 1) + ln + '\n';
+      } else {
+        return formatted += padding + ln + '\n';
+      }
+    };
+    for (_i = 0, _len = lines.length; _i < _len; _i++) {
+      ln = lines[_i];
+      _fn(ln);
+    }
+    return formatted;
+  };
+
+  var SwaggerRequest = function (type, url, params, opts, successCallback, errorCallback, operation, execution) {
+    var _this = this;
+    var errors = [];
+    this.useJQuery = (typeof operation.resource.useJQuery !== 'undefined' ? operation.resource.useJQuery : null);
+    this.type = (type || errors.push("SwaggerRequest type is required (get/post/put/delete/patch/options)."));
+    this.url = (url || errors.push("SwaggerRequest url is required."));
+    this.params = params;
+    this.opts = opts;
+    this.successCallback = (successCallback || errors.push("SwaggerRequest successCallback is required."));
+    this.errorCallback = (errorCallback || errors.push("SwaggerRequest error callback is required."));
+    this.operation = (operation || errors.push("SwaggerRequest operation is required."));
+    this.execution = execution;
+    this.headers = (params.headers || {});
+
+    if (errors.length > 0) {
+      throw errors;
+    }
+
+    this.type = this.type.toUpperCase();
+
+    // set request, response content type headers
+    var headers = this.setHeaders(params, this.operation);
+    var body = params.body;
+
+    // encode the body for form submits
+    if (headers["Content-Type"]) {
+      var values = {};
+      var i;
+      var operationParams = this.operation.parameters;
+      for (i = 0; i < operationParams.length; i++) {
+        var param = operationParams[i];
+        if (param.paramType === "form")
+          values[param.name] = param;
+      }
+
+      if (headers["Content-Type"].indexOf("application/x-www-form-urlencoded") === 0) {
+        var encoded = "";
+        var key, value;
+        for (key in values) {
+          value = this.params[key];
+          if (typeof value !== 'undefined') {
+            if (encoded !== "")
+              encoded += "&";
+            encoded += encodeURIComponent(key) + '=' + encodeURIComponent(value);
+          }
+        }
+        body = encoded;
+      }
+      else if (headers["Content-Type"].indexOf("multipart/form-data") === 0) {
+        // encode the body for form submits
+        var data = "";
+        var boundary = "----SwaggerFormBoundary" + Date.now();
+        var key, value;
+        for (key in values) {
+          value = this.params[key];
+          if (typeof value !== 'undefined') {
+            data += '--' + boundary + '\n';
+            data += 'Content-Disposition: form-data; name="' + key + '"';
+            data += '\n\n';
+            data += value + "\n";
+          }
+        }
+        data += "--" + boundary + "--\n";
+        headers["Content-Type"] = "multipart/form-data; boundary=" + boundary;
+        body = data;
+      }
+    }
+
+    var obj;
+    if (!((this.headers != null) && (this.headers.mock != null))) {
+      obj = {
+        url: this.url,
+        method: this.type,
+        headers: headers,
+        body: body,
+        useJQuery: this.useJQuery,
+        on: {
+          error: function (response) {
+            return _this.errorCallback(response, _this.opts.parent);
+          },
+          redirect: function (response) {
+            return _this.successCallback(response, _this.opts.parent);
+          },
+          307: function (response) {
+            return _this.successCallback(response, _this.opts.parent);
+          },
+          response: function (response) {
+            return _this.successCallback(response, _this.opts.parent);
+          }
+        }
+      };
+      var e;
+      if (typeof window !== 'undefined') {
+        e = window;
+      } else {
+        e = exports;
+      }
+      var status = e.authorizations.apply(obj, this.operation.authorizations);
+      if (opts.mock == null) {
+        if (status !== false) {
+          new SwaggerHttp().execute(obj);
+        } else {
+          obj.canceled = true;
+        }
+      } else {
+        return obj;
+      }
+    }
+    return obj;
+  };
+
+  SwaggerRequest.prototype.setHeaders = function (params, operation) {
+    // default type
+    var accepts = "application/json";
+    var consumes = "application/json";
+
+    var allDefinedParams = this.operation.parameters;
+    var definedFormParams = [];
+    var definedFileParams = [];
+    var body = params.body;
+    var headers = {};
+
+    // get params from the operation and set them in definedFileParams, definedFormParams, headers
+    var i;
+    for (i = 0; i < allDefinedParams.length; i++) {
+      var param = allDefinedParams[i];
+      if (param.paramType === "form")
+        definedFormParams.push(param);
+      else if (param.paramType === "file")
+        definedFileParams.push(param);
+      else if (param.paramType === "header" && this.params.headers) {
+        var key = param.name;
+        var headerValue = this.params.headers[param.name];
+        if (typeof this.params.headers[param.name] !== 'undefined')
+          headers[key] = headerValue;
+      }
+    }
+
+    // if there's a body, need to set the accepts header via requestContentType
+    if (body && (this.type === "POST" || this.type === "PUT" || this.type === "PATCH" || this.type === "DELETE")) {
+      if (this.opts.requestContentType)
+        consumes = this.opts.requestContentType;
+    } else {
+      // if any form params, content type must be set
+      if (definedFormParams.length > 0) {
+        if (definedFileParams.length > 0)
+          consumes = "multipart/form-data";
+        else
+          consumes = "application/x-www-form-urlencoded";
+      }
+      else if (this.type === "DELETE")
+        body = "{}";
+      else if (this.type != "DELETE")
+        consumes = null;
+    }
+
+    if (consumes && this.operation.consumes) {
+      if (this.operation.consumes.indexOf(consumes) === -1) {
+        log("server doesn't consume " + consumes + ", try " + JSON.stringify(this.operation.consumes));
+        consumes = this.operation.consumes[0];
+      }
+    }
+
+    if (this.opts.responseContentType) {
+      accepts = this.opts.responseContentType;
+    } else {
+      accepts = "application/json";
+    }
+    if (accepts && this.operation.produces) {
+      if (this.operation.produces.indexOf(accepts) === -1) {
+        log("server can't produce " + accepts);
+        accepts = this.operation.produces[0];
+      }
+    }
+
+    if ((consumes && body !== "") || (consumes === "application/x-www-form-urlencoded"))
+      headers["Content-Type"] = consumes;
+    if (accepts)
+      headers["Accept"] = accepts;
+    return headers;
+  }
+
+  SwaggerRequest.prototype.asCurl = function () {
+    var results = [];
+    if (this.headers) {
+      var key;
+      for (key in this.headers) {
+        results.push("--header \"" + key + ": " + this.headers[v] + "\"");
+      }
+    }
+    return "curl " + (results.join(" ")) + " " + this.url;
+  };
+
+  /**
+   * SwaggerHttp is a wrapper for executing requests
+   */
+  var SwaggerHttp = function () { };
+
+  SwaggerHttp.prototype.execute = function (obj) {
+    if (obj && (typeof obj.useJQuery === 'boolean'))
+      this.useJQuery = obj.useJQuery;
+    else
+      this.useJQuery = this.isIE8();
+
+    if (this.useJQuery)
+      return new JQueryHttpClient().execute(obj);
+    else
+      return new ShredHttpClient().execute(obj);
+  }
+
+  SwaggerHttp.prototype.isIE8 = function () {
+    var detectedIE = false;
+    if (typeof navigator !== 'undefined' && navigator.userAgent) {
+      nav = navigator.userAgent.toLowerCase();
+      if (nav.indexOf('msie') !== -1) {
+        var version = parseInt(nav.split('msie')[1]);
+        if (version <= 8) {
+          detectedIE = true;
+        }
+      }
+    }
+    return detectedIE;
+  };
+
+  /*
+   * JQueryHttpClient lets a browser take advantage of JQuery's cross-browser magic.
+   * NOTE: when jQuery is available it will export both '$' and 'jQuery' to the global space.
+   *     Since we are using closures here we need to alias it for internal use.
+   */
+  var JQueryHttpClient = function (options) {
+    "use strict";
+    if (!jQuery) {
+      var jQuery = window.jQuery;
+    }
+  }
+
+  JQueryHttpClient.prototype.execute = function (obj) {
+    var cb = obj.on;
+    var request = obj;
+
+    obj.type = obj.method;
+    obj.cache = false;
+
+    obj.beforeSend = function (xhr) {
+      var key, results;
+      if (obj.headers) {
+        results = [];
+        var key;
+        for (key in obj.headers) {
+          if (key.toLowerCase() === "content-type") {
+            results.push(obj.contentType = obj.headers[key]);
+          } else if (key.toLowerCase() === "accept") {
+            results.push(obj.accepts = obj.headers[key]);
+          } else {
+            results.push(xhr.setRequestHeader(key, obj.headers[key]));
+          }
+        }
+        return results;
+      }
+    };
+
+    obj.data = obj.body;
+    obj.complete = function (response, textStatus, opts) {
+      var headers = {},
+        headerArray = response.getAllResponseHeaders().split("\n");
+
+      for (var i = 0; i < headerArray.length; i++) {
+        var toSplit = headerArray[i].trim();
+        if (toSplit.length === 0)
+          continue;
+        var separator = toSplit.indexOf(":");
+        if (separator === -1) {
+          // Name but no value in the header
+          headers[toSplit] = null;
+          continue;
+        }
+        var name = toSplit.substring(0, separator).trim(),
+          value = toSplit.substring(separator + 1).trim();
+        headers[name] = value;
+      }
+
+      var out = {
+        url: request.url,
+        method: request.method,
+        status: response.status,
+        data: response.responseText,
+        headers: headers
+      };
+
+      var contentType = (headers["content-type"] || headers["Content-Type"] || null)
+
+      if (contentType != null) {
+        if (contentType.indexOf("application/json") == 0 || contentType.indexOf("+json") > 0) {
+          if (response.responseText && response.responseText !== "")
+            out.obj = JSON.parse(response.responseText);
+          else
+            out.obj = {}
+        }
+      }
+
+      if (response.status >= 200 && response.status < 300)
+        cb.response(out);
+      else if (response.status === 0 || (response.status >= 400 && response.status < 599))
+        cb.error(out);
+      else
+        return cb.response(out);
+    };
+
+    jQuery.support.cors = true;
+    return jQuery.ajax(obj);
+  }
+
+  /*
+   * ShredHttpClient is a light-weight, node or browser HTTP client
+   */
+  var ShredHttpClient = function (options) {
+    this.options = (options || {});
+    this.isInitialized = false;
+
+    var identity, toString;
+
+    if (typeof window !== 'undefined') {
+      this.Shred = require("./shred");
+      this.content = require("./shred/content");
+    }
+    else
+      this.Shred = require("shred");
+    this.shred = new this.Shred();
+  }
+
+  ShredHttpClient.prototype.initShred = function () {
+    this.isInitialized = true;
+    this.registerProcessors(this.shred);
+  }
+
+  ShredHttpClient.prototype.registerProcessors = function (shred) {
+    var identity = function (x) {
+      return x;
+    };
+    var toString = function (x) {
+      return x.toString();
+    };
+
+    if (typeof window !== 'undefined') {
+      this.content.registerProcessor(["application/json; charset=utf-8", "application/json", "json"], {
+        parser: identity,
+        stringify: toString
+      });
+    } else {
+      this.Shred.registerProcessor(["application/json; charset=utf-8", "application/json", "json"], {
+        parser: identity,
+        stringify: toString
+      });
+    }
+  }
+
+  ShredHttpClient.prototype.execute = function (obj) {
+    if (!this.isInitialized)
+      this.initShred();
+
+    var cb = obj.on, res;
+
+    var transform = function (response) {
+      var out = {
+        headers: response._headers,
+        url: response.request.url,
+        method: response.request.method,
+        status: response.status,
+        data: response.content.data
+      };
+
+      var headers = response._headers.normalized || response._headers;
+      var contentType = (headers["content-type"] || headers["Content-Type"] || null)
+      if (contentType != null) {
+        if (contentType.indexOf("application/json") == 0 || contentType.indexOf("+json") > 0) {
+          if (response.content.data && response.content.data !== "")
+            try {
+              out.obj = JSON.parse(response.content.data);
+            }
+            catch (ex) {
+              // do not set out.obj
+              log ("unable to parse JSON content");
+            }
+          else
+            out.obj = {}
+        }
+      }
+      return out;
+    };
+
+    // Transform an error into a usable response-like object
+    var transformError = function (error) {
+      var out = {
+        // Default to a status of 0 - The client will treat this as a generic permissions sort of error
+        status: 0,
+        data: error.message || error
+      };
+
+      if (error.code) {
+        out.obj = error;
+
+        if (error.code === 'ENOTFOUND' || error.code === 'ECONNREFUSED') {
+          // We can tell the client that this should be treated as a missing resource and not as a permissions thing
+          out.status = 404;
+        }
+      }
+
+      return out;
+    };
+
+    var res = {
+      error: function (response) {
+        if (obj)
+          return cb.error(transform(response));
+      },
+      // Catch the Shred error raised when the request errors as it is made (i.e. No Response is coming)
+      request_error: function (err) {
+        if (obj)
+          return cb.error(transformError(err));
+      },
+      redirect: function (response) {
+        if (obj)
+          return cb.redirect(transform(response));
+      },
+      307: function (response) {
+        if (obj)
+          return cb.redirect(transform(response));
+      },
+      response: function (response) {
+        if (obj)
+          return cb.response(transform(response));
+      }
+    };
+    if (obj) {
+      obj.on = res;
+    }
+    return this.shred.request(obj);
+  };
+
+  /**
+   * SwaggerAuthorizations applys the correct authorization to an operation being executed
+   */
+  var SwaggerAuthorizations = function () {
+    this.authz = {};
+  };
+
+  SwaggerAuthorizations.prototype.add = function (name, auth) {
+    this.authz[name] = auth;
+    return auth;
+  };
+
+  SwaggerAuthorizations.prototype.remove = function (name) {
+    return delete this.authz[name];
+  };
+
+  SwaggerAuthorizations.prototype.apply = function (obj, authorizations) {
+    var status = null;
+    var key, value, result;
+
+    // if the "authorizations" key is undefined, or has an empty array, add all keys
+    if (typeof authorizations === 'undefined' || Object.keys(authorizations).length == 0) {
+      for (key in this.authz) {
+        value = this.authz[key];
+        result = value.apply(obj, authorizations);
+        if (result === true)
+          status = true;
+      }
+    }
+    else {
+      for (name in authorizations) {
+        for (key in this.authz) {
+          if (key == name) {
+            value = this.authz[key];
+            result = value.apply(obj, authorizations);
+            if (result === true)
+              status = true;
+          }
+        }
+      }
+    }
+
+    return status;
+  };
+
+  /**
+   * ApiKeyAuthorization allows a query param or header to be injected
+   */
+  var ApiKeyAuthorization = function (name, value, type, delimiter) {
+    this.name = name;
+    this.value = value;
+    this.type = type;
+    this.delimiter = delimiter;
+  };
+
+  ApiKeyAuthorization.prototype.apply = function (obj, authorizations) {
+    if (this.type === "query") {
+      if (obj.url.indexOf('?') > 0)
+        obj.url = obj.url + "&" + this.name + "=" + this.value;
+      else
+        obj.url = obj.url + "?" + this.name + "=" + this.value;
+      return true;
+    } else if (this.type === "header") {
+      if (typeof obj.headers[this.name] !== 'undefined') {
+        if (typeof this.delimiter !== 'undefined')
+          obj.headers[this.name] = obj.headers[this.name] + this.delimiter + this.value;
+      }
+      else
+        obj.headers[this.name] = this.value;
+      return true;
+    }
+  };
+
+  var CookieAuthorization = function (cookie) {
+    this.cookie = cookie;
+  }
+
+  CookieAuthorization.prototype.apply = function (obj, authorizations) {
+    obj.cookieJar = obj.cookieJar || CookieJar();
+    obj.cookieJar.setCookie(this.cookie);
+    return true;
+  }
+
+  /**
+   * Password Authorization is a basic auth implementation
+   */
+  var PasswordAuthorization = function (name, username, password) {
+    this.name = name;
+    this.username = username;
+    this.password = password;
+    this._btoa = null;
+    if (typeof window !== 'undefined')
+      this._btoa = btoa;
+    else
+      this._btoa = require("btoa");
+  };
+
+  PasswordAuthorization.prototype.apply = function (obj, authorizations) {
+    var base64encoder = this._btoa;
+    obj.headers["Authorization"] = "Basic " + base64encoder(this.username + ":" + this.password);
+    return true;
+  };
+
+  var e = (typeof window !== 'undefined' ? window : exports);
+
+  var sampleModels = {};
+  var cookies = {};
+
+  e.parameterMacro = parameterMacro;
+  e.modelPropertyMacro = modelPropertyMacro;
+  e.SampleModels = sampleModels;
+  e.SwaggerHttp = SwaggerHttp;
+  e.SwaggerRequest = SwaggerRequest;
+  e.authorizations = new SwaggerAuthorizations();
+  e.ApiKeyAuthorization = ApiKeyAuthorization;
+  e.PasswordAuthorization = PasswordAuthorization;
+  e.CookieAuthorization = CookieAuthorization;
+  e.JQueryHttpClient = JQueryHttpClient;
+  e.ShredHttpClient = ShredHttpClient;
+  e.SwaggerOperation = SwaggerOperation;
+  e.SwaggerModel = SwaggerModel;
+  e.SwaggerModelProperty = SwaggerModelProperty;
+  e.SwaggerResource = SwaggerResource;
+  e.SwaggerApi = SwaggerApi;
+  e.log = log;
+
+})();
+`)
+
+func third_partySwaggerUiLibSwaggerJsBytes() ([]byte, error) {
+	return _third_partySwaggerUiLibSwaggerJs, nil
+}
+
+func third_partySwaggerUiLibSwaggerJs() (*asset, error) {
+	bytes, err := third_partySwaggerUiLibSwaggerJsBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/lib/swagger.js", size: 53321, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiLibUnderscoreMinJs = []byte(`//     Underscore.js 1.7.0
+//     http://underscorejs.org
+//     (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+//     Underscore may be freely distributed under the MIT license.
+(function(){var n=this,t=n._,r=Array.prototype,e=Object.prototype,u=Function.prototype,i=r.push,a=r.slice,o=r.concat,l=e.toString,c=e.hasOwnProperty,f=Array.isArray,s=Object.keys,p=u.bind,h=function(n){return n instanceof h?n:this instanceof h?void(this._wrapped=n):new h(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=h),exports._=h):n._=h,h.VERSION="1.7.0";var g=function(n,t,r){if(t===void 0)return n;switch(null==r?3:r){case 1:return function(r){return n.call(t,r)};case 2:return function(r,e){return n.call(t,r,e)};case 3:return function(r,e,u){return n.call(t,r,e,u)};case 4:return function(r,e,u,i){return n.call(t,r,e,u,i)}}return function(){return n.apply(t,arguments)}};h.iteratee=function(n,t,r){return null==n?h.identity:h.isFunction(n)?g(n,t,r):h.isObject(n)?h.matches(n):h.property(n)},h.each=h.forEach=function(n,t,r){if(null==n)return n;t=g(t,r);var e,u=n.length;if(u===+u)for(e=0;u>e;e++)t(n[e],e,n);else{var i=h.keys(n);for(e=0,u=i.length;u>e;e++)t(n[i[e]],i[e],n)}return n},h.map=h.collect=function(n,t,r){if(null==n)return[];t=h.iteratee(t,r);for(var e,u=n.length!==+n.length&&h.keys(n),i=(u||n).length,a=Array(i),o=0;i>o;o++)e=u?u[o]:o,a[o]=t(n[e],e,n);return a};var v="Reduce of empty array with no initial value";h.reduce=h.foldl=h.inject=function(n,t,r,e){null==n&&(n=[]),t=g(t,e,4);var u,i=n.length!==+n.length&&h.keys(n),a=(i||n).length,o=0;if(arguments.length<3){if(!a)throw new TypeError(v);r=n[i?i[o++]:o++]}for(;a>o;o++)u=i?i[o]:o,r=t(r,n[u],u,n);return r},h.reduceRight=h.foldr=function(n,t,r,e){null==n&&(n=[]),t=g(t,e,4);var u,i=n.length!==+n.length&&h.keys(n),a=(i||n).length;if(arguments.length<3){if(!a)throw new TypeError(v);r=n[i?i[--a]:--a]}for(;a--;)u=i?i[a]:a,r=t(r,n[u],u,n);return r},h.find=h.detect=function(n,t,r){var e;return t=h.iteratee(t,r),h.some(n,function(n,r,u){return t(n,r,u)?(e=n,!0):void 0}),e},h.filter=h.select=function(n,t,r){var e=[];return null==n?e:(t=h.iteratee(t,r),h.each(n,function(n,r,u){t(n,r,u)&&e.push(n)}),e)},h.reject=function(n,t,r){return h.filter(n,h.negate(h.iteratee(t)),r)},h.every=h.all=function(n,t,r){if(null==n)return!0;t=h.iteratee(t,r);var e,u,i=n.length!==+n.length&&h.keys(n),a=(i||n).length;for(e=0;a>e;e++)if(u=i?i[e]:e,!t(n[u],u,n))return!1;return!0},h.some=h.any=function(n,t,r){if(null==n)return!1;t=h.iteratee(t,r);var e,u,i=n.length!==+n.length&&h.keys(n),a=(i||n).length;for(e=0;a>e;e++)if(u=i?i[e]:e,t(n[u],u,n))return!0;return!1},h.contains=h.include=function(n,t){return null==n?!1:(n.length!==+n.length&&(n=h.values(n)),h.indexOf(n,t)>=0)},h.invoke=function(n,t){var r=a.call(arguments,2),e=h.isFunction(t);return h.map(n,function(n){return(e?t:n[t]).apply(n,r)})},h.pluck=function(n,t){return h.map(n,h.property(t))},h.where=function(n,t){return h.filter(n,h.matches(t))},h.findWhere=function(n,t){return h.find(n,h.matches(t))},h.max=function(n,t,r){var e,u,i=-1/0,a=-1/0;if(null==t&&null!=n){n=n.length===+n.length?n:h.values(n);for(var o=0,l=n.length;l>o;o++)e=n[o],e>i&&(i=e)}else t=h.iteratee(t,r),h.each(n,function(n,r,e){u=t(n,r,e),(u>a||u===-1/0&&i===-1/0)&&(i=n,a=u)});return i},h.min=function(n,t,r){var e,u,i=1/0,a=1/0;if(null==t&&null!=n){n=n.length===+n.length?n:h.values(n);for(var o=0,l=n.length;l>o;o++)e=n[o],i>e&&(i=e)}else t=h.iteratee(t,r),h.each(n,function(n,r,e){u=t(n,r,e),(a>u||1/0===u&&1/0===i)&&(i=n,a=u)});return i},h.shuffle=function(n){for(var t,r=n&&n.length===+n.length?n:h.values(n),e=r.length,u=Array(e),i=0;e>i;i++)t=h.random(0,i),t!==i&&(u[i]=u[t]),u[t]=r[i];return u},h.sample=function(n,t,r){return null==t||r?(n.length!==+n.length&&(n=h.values(n)),n[h.random(n.length-1)]):h.shuffle(n).slice(0,Math.max(0,t))},h.sortBy=function(n,t,r){return t=h.iteratee(t,r),h.pluck(h.map(n,function(n,r,e){return{value:n,index:r,criteria:t(n,r,e)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var m=function(n){return function(t,r,e){var u={};return r=h.iteratee(r,e),h.each(t,function(e,i){var a=r(e,i,t);n(u,e,a)}),u}};h.groupBy=m(function(n,t,r){h.has(n,r)?n[r].push(t):n[r]=[t]}),h.indexBy=m(function(n,t,r){n[r]=t}),h.countBy=m(function(n,t,r){h.has(n,r)?n[r]++:n[r]=1}),h.sortedIndex=function(n,t,r,e){r=h.iteratee(r,e,1);for(var u=r(t),i=0,a=n.length;a>i;){var o=i+a>>>1;r(n[o])<u?i=o+1:a=o}return i},h.toArray=function(n){return n?h.isArray(n)?a.call(n):n.length===+n.length?h.map(n,h.identity):h.values(n):[]},h.size=function(n){return null==n?0:n.length===+n.length?n.length:h.keys(n).length},h.partition=function(n,t,r){t=h.iteratee(t,r);var e=[],u=[];return h.each(n,function(n,r,i){(t(n,r,i)?e:u).push(n)}),[e,u]},h.first=h.head=h.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:0>t?[]:a.call(n,0,t)},h.initial=function(n,t,r){return a.call(n,0,Math.max(0,n.length-(null==t||r?1:t)))},h.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:a.call(n,Math.max(n.length-t,0))},h.rest=h.tail=h.drop=function(n,t,r){return a.call(n,null==t||r?1:t)},h.compact=function(n){return h.filter(n,h.identity)};var y=function(n,t,r,e){if(t&&h.every(n,h.isArray))return o.apply(e,n);for(var u=0,a=n.length;a>u;u++){var l=n[u];h.isArray(l)||h.isArguments(l)?t?i.apply(e,l):y(l,t,r,e):r||e.push(l)}return e};h.flatten=function(n,t){return y(n,t,!1,[])},h.without=function(n){return h.difference(n,a.call(arguments,1))},h.uniq=h.unique=function(n,t,r,e){if(null==n)return[];h.isBoolean(t)||(e=r,r=t,t=!1),null!=r&&(r=h.iteratee(r,e));for(var u=[],i=[],a=0,o=n.length;o>a;a++){var l=n[a];if(t)a&&i===l||u.push(l),i=l;else if(r){var c=r(l,a,n);h.indexOf(i,c)<0&&(i.push(c),u.push(l))}else h.indexOf(u,l)<0&&u.push(l)}return u},h.union=function(){return h.uniq(y(arguments,!0,!0,[]))},h.intersection=function(n){if(null==n)return[];for(var t=[],r=arguments.length,e=0,u=n.length;u>e;e++){var i=n[e];if(!h.contains(t,i)){for(var a=1;r>a&&h.contains(arguments[a],i);a++);a===r&&t.push(i)}}return t},h.difference=function(n){var t=y(a.call(arguments,1),!0,!0,[]);return h.filter(n,function(n){return!h.contains(t,n)})},h.zip=function(n){if(null==n)return[];for(var t=h.max(arguments,"length").length,r=Array(t),e=0;t>e;e++)r[e]=h.pluck(arguments,e);return r},h.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},h.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if("number"!=typeof r)return e=h.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}for(;u>e;e++)if(n[e]===t)return e;return-1},h.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=n.length;for("number"==typeof r&&(e=0>r?e+r+1:Math.min(e,r+1));--e>=0;)if(n[e]===t)return e;return-1},h.range=function(n,t,r){arguments.length<=1&&(t=n||0,n=0),r=r||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=Array(e),i=0;e>i;i++,n+=r)u[i]=n;return u};var d=function(){};h.bind=function(n,t){var r,e;if(p&&n.bind===p)return p.apply(n,a.call(arguments,1));if(!h.isFunction(n))throw new TypeError("Bind must be called on a function");return r=a.call(arguments,2),e=function(){if(!(this instanceof e))return n.apply(t,r.concat(a.call(arguments)));d.prototype=n.prototype;var u=new d;d.prototype=null;var i=n.apply(u,r.concat(a.call(arguments)));return h.isObject(i)?i:u}},h.partial=function(n){var t=a.call(arguments,1);return function(){for(var r=0,e=t.slice(),u=0,i=e.length;i>u;u++)e[u]===h&&(e[u]=arguments[r++]);for(;r<arguments.length;)e.push(arguments[r++]);return n.apply(this,e)}},h.bindAll=function(n){var t,r,e=arguments.length;if(1>=e)throw new Error("bindAll must be passed function names");for(t=1;e>t;t++)r=arguments[t],n[r]=h.bind(n[r],n);return n},h.memoize=function(n,t){var r=function(e){var u=r.cache,i=t?t.apply(this,arguments):e;return h.has(u,i)||(u[i]=n.apply(this,arguments)),u[i]};return r.cache={},r},h.delay=function(n,t){var r=a.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},h.defer=function(n){return h.delay.apply(h,[n,1].concat(a.call(arguments,1)))},h.throttle=function(n,t,r){var e,u,i,a=null,o=0;r||(r={});var l=function(){o=r.leading===!1?0:h.now(),a=null,i=n.apply(e,u),a||(e=u=null)};return function(){var c=h.now();o||r.leading!==!1||(o=c);var f=t-(c-o);return e=this,u=arguments,0>=f||f>t?(clearTimeout(a),a=null,o=c,i=n.apply(e,u),a||(e=u=null)):a||r.trailing===!1||(a=setTimeout(l,f)),i}},h.debounce=function(n,t,r){var e,u,i,a,o,l=function(){var c=h.now()-a;t>c&&c>0?e=setTimeout(l,t-c):(e=null,r||(o=n.apply(i,u),e||(i=u=null)))};return function(){i=this,u=arguments,a=h.now();var c=r&&!e;return e||(e=setTimeout(l,t)),c&&(o=n.apply(i,u),i=u=null),o}},h.wrap=function(n,t){return h.partial(t,n)},h.negate=function(n){return function(){return!n.apply(this,arguments)}},h.compose=function(){var n=arguments,t=n.length-1;return function(){for(var r=t,e=n[t].apply(this,arguments);r--;)e=n[r].call(this,e);return e}},h.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},h.before=function(n,t){var r;return function(){return--n>0?r=t.apply(this,arguments):t=null,r}},h.once=h.partial(h.before,2),h.keys=function(n){if(!h.isObject(n))return[];if(s)return s(n);var t=[];for(var r in n)h.has(n,r)&&t.push(r);return t},h.values=function(n){for(var t=h.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},h.pairs=function(n){for(var t=h.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},h.invert=function(n){for(var t={},r=h.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},h.functions=h.methods=function(n){var t=[];for(var r in n)h.isFunction(n[r])&&t.push(r);return t.sort()},h.extend=function(n){if(!h.isObject(n))return n;for(var t,r,e=1,u=arguments.length;u>e;e++){t=arguments[e];for(r in t)c.call(t,r)&&(n[r]=t[r])}return n},h.pick=function(n,t,r){var e,u={};if(null==n)return u;if(h.isFunction(t)){t=g(t,r);for(e in n){var i=n[e];t(i,e,n)&&(u[e]=i)}}else{var l=o.apply([],a.call(arguments,1));n=new Object(n);for(var c=0,f=l.length;f>c;c++)e=l[c],e in n&&(u[e]=n[e])}return u},h.omit=function(n,t,r){if(h.isFunction(t))t=h.negate(t);else{var e=h.map(o.apply([],a.call(arguments,1)),String);t=function(n,t){return!h.contains(e,t)}}return h.pick(n,t,r)},h.defaults=function(n){if(!h.isObject(n))return n;for(var t=1,r=arguments.length;r>t;t++){var e=arguments[t];for(var u in e)n[u]===void 0&&(n[u]=e[u])}return n},h.clone=function(n){return h.isObject(n)?h.isArray(n)?n.slice():h.extend({},n):n},h.tap=function(n,t){return t(n),n};var b=function(n,t,r,e){if(n===t)return 0!==n||1/n===1/t;if(null==n||null==t)return n===t;n instanceof h&&(n=n._wrapped),t instanceof h&&(t=t._wrapped);var u=l.call(n);if(u!==l.call(t))return!1;switch(u){case"[object RegExp]":case"[object String]":return""+n==""+t;case"[object Number]":return+n!==+n?+t!==+t:0===+n?1/+n===1/t:+n===+t;case"[object Date]":case"[object Boolean]":return+n===+t}if("object"!=typeof n||"object"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]===n)return e[i]===t;var a=n.constructor,o=t.constructor;if(a!==o&&"constructor"in n&&"constructor"in t&&!(h.isFunction(a)&&a instanceof a&&h.isFunction(o)&&o instanceof o))return!1;r.push(n),e.push(t);var c,f;if("[object Array]"===u){if(c=n.length,f=c===t.length)for(;c--&&(f=b(n[c],t[c],r,e)););}else{var s,p=h.keys(n);if(c=p.length,f=h.keys(t).length===c)for(;c--&&(s=p[c],f=h.has(t,s)&&b(n[s],t[s],r,e)););}return r.pop(),e.pop(),f};h.isEqual=function(n,t){return b(n,t,[],[])},h.isEmpty=function(n){if(null==n)return!0;if(h.isArray(n)||h.isString(n)||h.isArguments(n))return 0===n.length;for(var t in n)if(h.has(n,t))return!1;return!0},h.isElement=function(n){return!(!n||1!==n.nodeType)},h.isArray=f||function(n){return"[object Array]"===l.call(n)},h.isObject=function(n){var t=typeof n;return"function"===t||"object"===t&&!!n},h.each(["Arguments","Function","String","Number","Date","RegExp"],function(n){h["is"+n]=function(t){return l.call(t)==="[object "+n+"]"}}),h.isArguments(arguments)||(h.isArguments=function(n){return h.has(n,"callee")}),"function"!=typeof/./&&(h.isFunction=function(n){return"function"==typeof n||!1}),h.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},h.isNaN=function(n){return h.isNumber(n)&&n!==+n},h.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"===l.call(n)},h.isNull=function(n){return null===n},h.isUndefined=function(n){return n===void 0},h.has=function(n,t){return null!=n&&c.call(n,t)},h.noConflict=function(){return n._=t,this},h.identity=function(n){return n},h.constant=function(n){return function(){return n}},h.noop=function(){},h.property=function(n){return function(t){return t[n]}},h.matches=function(n){var t=h.pairs(n),r=t.length;return function(n){if(null==n)return!r;n=new Object(n);for(var e=0;r>e;e++){var u=t[e],i=u[0];if(u[1]!==n[i]||!(i in n))return!1}return!0}},h.times=function(n,t,r){var e=Array(Math.max(0,n));t=g(t,r,1);for(var u=0;n>u;u++)e[u]=t(u);return e},h.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))},h.now=Date.now||function(){return(new Date).getTime()};var _={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","` + "`" + `":"&#x60;"},w=h.invert(_),j=function(n){var t=function(t){return n[t]},r="(?:"+h.keys(n).join("|")+")",e=RegExp(r),u=RegExp(r,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,t):n}};h.escape=j(_),h.unescape=j(w),h.result=function(n,t){if(null==n)return void 0;var r=n[t];return h.isFunction(r)?n[t]():r};var x=0;h.uniqueId=function(n){var t=++x+"";return n?n+t:t},h.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var A=/(.)^/,k={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},O=/\\|'|\r|\n|\u2028|\u2029/g,F=function(n){return"\\"+k[n]};h.template=function(n,t,r){!t&&r&&(t=r),t=h.defaults({},t,h.templateSettings);var e=RegExp([(t.escape||A).source,(t.interpolate||A).source,(t.evaluate||A).source].join("|")+"|$","g"),u=0,i="__p+='";n.replace(e,function(t,r,e,a,o){return i+=n.slice(u,o).replace(O,F),u=o+t.length,r?i+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'":e?i+="'+\n((__t=("+e+"))==null?'':__t)+\n'":a&&(i+="';\n"+a+"\n__p+='"),t}),i+="';\n",t.variable||(i="with(obj||{}){\n"+i+"}\n"),i="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+i+"return __p;\n";try{var a=new Function(t.variable||"obj","_",i)}catch(o){throw o.source=i,o}var l=function(n){return a.call(this,n,h)},c=t.variable||"obj";return l.source="function("+c+"){\n"+i+"}",l},h.chain=function(n){var t=h(n);return t._chain=!0,t};var E=function(n){return this._chain?h(n).chain():n};h.mixin=function(n){h.each(h.functions(n),function(t){var r=h[t]=n[t];h.prototype[t]=function(){var n=[this._wrapped];return i.apply(n,arguments),E.call(this,r.apply(h,n))}})},h.mixin(h),h.each(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=r[n];h.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!==n&&"splice"!==n||0!==r.length||delete r[0],E.call(this,r)}}),h.each(["concat","join","slice"],function(n){var t=r[n];h.prototype[n]=function(){return E.call(this,t.apply(this._wrapped,arguments))}}),h.prototype.value=function(){return this._wrapped},"function"==typeof define&&define.amd&&define("underscore",[],function(){return h})}).call(this);
+//# sourceMappingURL=underscore-min.map`)
+
+func third_partySwaggerUiLibUnderscoreMinJsBytes() ([]byte, error) {
+	return _third_partySwaggerUiLibUnderscoreMinJs, nil
+}
+
+func third_partySwaggerUiLibUnderscoreMinJs() (*asset, error) {
+	bytes, err := third_partySwaggerUiLibUnderscoreMinJsBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/lib/underscore-min.js", size: 15626, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiO2cHtml = []byte(`<script>
+var qp = null;
+if(window.location.hash) {
+  qp = location.hash.substring(1);
+}
+else {
+  qp = location.search.substring(1);
+}
+qp = qp ? JSON.parse('{"' + qp.replace(/&/g, '","').replace(/=/g,'":"') + '"}',
+  function(key, value) {
+    return key===""?value:decodeURIComponent(value) }
+  ):{}
+
+if (window.opener.swaggerUi.tokenUrl)
+    window.opener.processOAuthCode(qp);
+else
+    window.opener.onOAuthComplete(qp);
+
+window.close();
+</script>`)
+
+func third_partySwaggerUiO2cHtmlBytes() ([]byte, error) {
+	return _third_partySwaggerUiO2cHtml, nil
+}
+
+func third_partySwaggerUiO2cHtml() (*asset, error) {
+	bytes, err := third_partySwaggerUiO2cHtmlBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/o2c.html", size: 449, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiSwaggerUiJs = []byte(`/**
+ * swagger-ui - Swagger UI is a dependency-free collection of HTML, Javascript, and CSS assets that dynamically generate beautiful documentation from a Swagger-compliant API
+ * @version v2.1.1-M1
+ * @link http://swagger.io
+ * @license Apache 2.0
+ */
+$(function() {
+
+	// Helper function for vertically aligning DOM elements
+	// http://www.seodenver.com/simple-vertical-align-plugin-for-jquery/
+	$.fn.vAlign = function() {
+		return this.each(function(i){
+		var ah = $(this).height();
+		var ph = $(this).parent().height();
+		var mh = (ph - ah) / 2;
+		$(this).css('margin-top', mh);
+		});
+	};
+
+	$.fn.stretchFormtasticInputWidthToParent = function() {
+		return this.each(function(i){
+		var p_width = $(this).closest("form").innerWidth();
+		var p_padding = parseInt($(this).closest("form").css('padding-left') ,10) + parseInt($(this).closest("form").css('padding-right'), 10);
+		var this_padding = parseInt($(this).css('padding-left'), 10) + parseInt($(this).css('padding-right'), 10);
+		$(this).css('width', p_width - p_padding - this_padding);
+		});
+	};
+
+	$('form.formtastic li.string input, form.formtastic textarea').stretchFormtasticInputWidthToParent();
+
+	// Vertically center these paragraphs
+	// Parent may need a min-height for this to work..
+	$('ul.downplayed li div.content p').vAlign();
+
+	// When a sandbox form is submitted..
+	$("form.sandbox").submit(function(){
+
+		var error_free = true;
+
+		// Cycle through the forms required inputs
+ 		$(this).find("input.required").each(function() {
+
+			// Remove any existing error styles from the input
+			$(this).removeClass('error');
+
+			// Tack the error style on if the input is empty..
+			if ($(this).val() == '') {
+				$(this).addClass('error');
+				$(this).wiggle();
+				error_free = false;
+			}
+
+		});
+
+		return error_free;
+	});
+
+});
+
+function clippyCopiedCallback(a) {
+  $('#api_key_copied').fadeIn().delay(1000).fadeOut();
+
+  // var b = $("#clippy_tooltip_" + a);
+  // b.length != 0 && (b.attr("title", "copied!").trigger("tipsy.reload"), setTimeout(function() {
+  //   b.attr("title", "copy to clipboard")
+  // },
+  // 500))
+}
+
+// Logging function that accounts for browsers that don't have window.console
+log = function(){
+  log.history = log.history || [];
+  log.history.push(arguments);
+  if(this.console){
+    console.log( Array.prototype.slice.call(arguments)[0] );
+  }
+};
+
+// Handle browsers that do console incorrectly (IE9 and below, see http://stackoverflow.com/a/5539378/7913)
+if (Function.prototype.bind && console && typeof console.log == "object") {
+    [
+      "log","info","warn","error","assert","dir","clear","profile","profileEnd"
+    ].forEach(function (method) {
+        console[method] = this.bind(console[method], console);
+    }, Function.prototype.call);
+}
+
+var Docs = {
+
+	shebang: function() {
+
+		// If shebang has an operation nickname in it..
+		// e.g. /docs/#!/words/get_search
+		var fragments = $.param.fragment().split('/');
+		fragments.shift(); // get rid of the bang
+
+		switch (fragments.length) {
+			case 1:
+				// Expand all operations for the resource and scroll to it
+				var dom_id = 'resource_' + fragments[0];
+
+				Docs.expandEndpointListForResource(fragments[0]);
+				$("#"+dom_id).slideto({highlight: false});
+				break;
+			case 2:
+				// Refer to the endpoint DOM element, e.g. #words_get_search
+
+        // Expand Resource
+        Docs.expandEndpointListForResource(fragments[0]);
+        $("#"+dom_id).slideto({highlight: false});
+
+        // Expand operation
+				var li_dom_id = fragments.join('_');
+				var li_content_dom_id = li_dom_id + "_content";
+
+
+				Docs.expandOperation($('#'+li_content_dom_id));
+				$('#'+li_dom_id).slideto({highlight: false});
+				break;
+		}
+
+	},
+
+	toggleEndpointListForResource: function(resource) {
+		var elem = $('li#resource_' + Docs.escapeResourceName(resource) + ' ul.endpoints');
+		if (elem.is(':visible')) {
+			Docs.collapseEndpointListForResource(resource);
+		} else {
+			Docs.expandEndpointListForResource(resource);
+		}
+	},
+
+	// Expand resource
+	expandEndpointListForResource: function(resource) {
+		var resource = Docs.escapeResourceName(resource);
+		if (resource == '') {
+			$('.resource ul.endpoints').slideDown();
+			return;
+		}
+		
+		$('li#resource_' + resource).addClass('active');
+
+		var elem = $('li#resource_' + resource + ' ul.endpoints');
+		elem.slideDown();
+	},
+
+	// Collapse resource and mark as explicitly closed
+	collapseEndpointListForResource: function(resource) {
+		var resource = Docs.escapeResourceName(resource);
+		if (resource == '') {
+			$('.resource ul.endpoints').slideUp();
+			return;
+		}
+
+		$('li#resource_' + resource).removeClass('active');
+
+		var elem = $('li#resource_' + resource + ' ul.endpoints');
+		elem.slideUp();
+	},
+
+	expandOperationsForResource: function(resource) {
+		// Make sure the resource container is open..
+		Docs.expandEndpointListForResource(resource);
+		
+		if (resource == '') {
+			$('.resource ul.endpoints li.operation div.content').slideDown();
+			return;
+		}
+
+		$('li#resource_' + Docs.escapeResourceName(resource) + ' li.operation div.content').each(function() {
+			Docs.expandOperation($(this));
+		});
+	},
+
+	collapseOperationsForResource: function(resource) {
+		// Make sure the resource container is open..
+		Docs.expandEndpointListForResource(resource);
+
+		if (resource == '') {
+			$('.resource ul.endpoints li.operation div.content').slideUp();
+			return;
+		}
+
+		$('li#resource_' + Docs.escapeResourceName(resource) + ' li.operation div.content').each(function() {
+			Docs.collapseOperation($(this));
+		});
+	},
+
+	escapeResourceName: function(resource) {
+		return resource.replace(/[!"#$%&'()*+,.\/:;<=>?@\[\\\]\^` + "`" + `{|}~]/g, "\\$&");
+	},
+
+	expandOperation: function(elem) {
+		elem.slideDown();
+	},
+
+	collapseOperation: function(elem) {
+		elem.slideUp();
+	}
+};
+
+var SwaggerUi,
+  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
+  __hasProp = {}.hasOwnProperty;
+
+SwaggerUi = (function(_super) {
+  __extends(SwaggerUi, _super);
+
+  function SwaggerUi() {
+    return SwaggerUi.__super__.constructor.apply(this, arguments);
+  }
+
+  SwaggerUi.prototype.dom_id = "swagger_ui";
+
+  SwaggerUi.prototype.options = null;
+
+  SwaggerUi.prototype.api = null;
+
+  SwaggerUi.prototype.headerView = null;
+
+  SwaggerUi.prototype.mainView = null;
+
+  SwaggerUi.prototype.initialize = function(options) {
+    if (options == null) {
+      options = {};
+    }
+    if (options.dom_id != null) {
+      this.dom_id = options.dom_id;
+      delete options.dom_id;
+    }
+    if (options.supportedSubmitMethods == null) {
+      options.supportedSubmitMethods = ['get', 'put', 'post', 'delete', 'head', 'options', 'patch'];
+    }
+    if ($('#' + this.dom_id) == null) {
+      $('body').append('<div id="' + this.dom_id + '"></div>');
+    }
+    this.options = options;
+    this.options.success = (function(_this) {
+      return function() {
+        return _this.render();
+      };
+    })(this);
+    this.options.progress = (function(_this) {
+      return function(d) {
+        return _this.showMessage(d);
+      };
+    })(this);
+    this.options.failure = (function(_this) {
+      return function(d) {
+        return _this.onLoadFailure(d);
+      };
+    })(this);
+    this.headerView = new HeaderView({
+      el: $('#header')
+    });
+    return this.headerView.on('update-swagger-ui', (function(_this) {
+      return function(data) {
+        return _this.updateSwaggerUi(data);
+      };
+    })(this));
+  };
+
+  SwaggerUi.prototype.setOption = function(option, value) {
+    return this.options[option] = value;
+  };
+
+  SwaggerUi.prototype.getOption = function(option) {
+    return this.options[option];
+  };
+
+  SwaggerUi.prototype.updateSwaggerUi = function(data) {
+    this.options.url = data.url;
+    return this.load();
+  };
+
+  SwaggerUi.prototype.load = function() {
+    var url, _ref;
+    if ((_ref = this.mainView) != null) {
+      _ref.clear();
+    }
+    url = this.options.url;
+    if (url && url.indexOf("http") !== 0) {
+      url = this.buildUrl(window.location.href.toString(), url);
+    }
+    this.options.url = url;
+    this.headerView.update(url);
+    this.api = new SwaggerClient(this.options);
+    return this.api.build();
+  };
+
+  SwaggerUi.prototype.collapseAll = function() {
+    return Docs.collapseEndpointListForResource('');
+  };
+
+  SwaggerUi.prototype.listAll = function() {
+    return Docs.collapseOperationsForResource('');
+  };
+
+  SwaggerUi.prototype.expandAll = function() {
+    return Docs.expandOperationsForResource('');
+  };
+
+  SwaggerUi.prototype.render = function() {
+    this.showMessage('Finished Loading Resource Information. Rendering Swagger UI...');
+    this.mainView = new MainView({
+      model: this.api,
+      el: $('#' + this.dom_id),
+      swaggerOptions: this.options
+    }).render();
+    this.showMessage();
+    switch (this.options.docExpansion) {
+      case "full":
+        this.expandAll();
+        break;
+      case "list":
+        this.listAll();
+    }
+    this.renderGFM();
+    if (this.options.onComplete) {
+      this.options.onComplete(this.api, this);
+    }
+    return setTimeout((function(_this) {
+      return function() {
+        return Docs.shebang();
+      };
+    })(this), 400);
+  };
+
+  SwaggerUi.prototype.buildUrl = function(base, url) {
+    var endOfPath, parts;
+    if (url.indexOf("/") === 0) {
+      parts = base.split("/");
+      base = parts[0] + "//" + parts[2];
+      return base + url;
+    } else {
+      endOfPath = base.length;
+      if (base.indexOf("?") > -1) {
+        endOfPath = Math.min(endOfPath, base.indexOf("?"));
+      }
+      if (base.indexOf("#") > -1) {
+        endOfPath = Math.min(endOfPath, base.indexOf("#"));
+      }
+      base = base.substring(0, endOfPath);
+      if (base.indexOf("/", base.length - 1) !== -1) {
+        return base + url;
+      }
+      return base + "/" + url;
+    }
+  };
+
+  SwaggerUi.prototype.showMessage = function(data) {
+    if (data == null) {
+      data = '';
+    }
+    $('#message-bar').removeClass('message-fail');
+    $('#message-bar').addClass('message-success');
+    return $('#message-bar').html(data);
+  };
+
+  SwaggerUi.prototype.onLoadFailure = function(data) {
+    var val;
+    if (data == null) {
+      data = '';
+    }
+    $('#message-bar').removeClass('message-success');
+    $('#message-bar').addClass('message-fail');
+    val = $('#message-bar').html(data);
+    if (this.options.onFailure != null) {
+      this.options.onFailure(data);
+    }
+    return val;
+  };
+
+  SwaggerUi.prototype.renderGFM = function(data) {
+    if (data == null) {
+      data = '';
+    }
+    return $('.markdown').each(function(index) {
+      return $(this).html(marked($(this).html()));
+    });
+  };
+
+  return SwaggerUi;
+
+})(Backbone.Router);
+
+window.SwaggerUi = SwaggerUi;
+
+this["Handlebars"] = this["Handlebars"] || {};
+this["Handlebars"]["templates"] = this["Handlebars"]["templates"] || {};
+this["Handlebars"]["templates"]["apikey_button_view"] = Handlebars.template({"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+  var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+  return "<!--div class='auth_button' id='apikey_button'><img class='auth_icon' alt='apply api key' src='images/apikey.jpeg'></div-->\n<div class='auth_container' id='apikey_container'>\n  <div class='key_input_container'>\n    <div class='auth_label'>"
+    + escapeExpression(((helper = (helper = helpers.keyName || (depth0 != null ? depth0.keyName : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"keyName","hash":{},"data":data}) : helper)))
+    + "</div>\n    <input placeholder=\"api_key\" class=\"auth_input\" id=\"input_apiKey_entry\" name=\"apiKey\" type=\"text\"/>\n    <div class='auth_submit'><a class='auth_submit_button' id=\"apply_api_key\" href=\"#\">apply</a></div>\n  </div>\n</div>\n\n";
+},"useData":true});
+Handlebars.registerHelper('sanitize', function(html) {
+  html = html.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '');
+  return new Handlebars.SafeString(html);
+});
+
+this["Handlebars"]["templates"]["basic_auth_button_view"] = Handlebars.template({"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+  return "<div class='auth_button' id='basic_auth_button'><img class='auth_icon' src='images/password.jpeg'></div>\n<div class='auth_container' id='basic_auth_container'>\n  <div class='key_input_container'>\n    <div class=\"auth_label\">Username</div>\n    <input placeholder=\"username\" class=\"auth_input\" id=\"input_username\" name=\"username\" type=\"text\"/>\n    <div class=\"auth_label\">Password</div>\n    <input placeholder=\"password\" class=\"auth_input\" id=\"input_password\" name=\"password\" type=\"password\"/>\n    <div class='auth_submit'><a class='auth_submit_button' id=\"apply_basic_auth\" href=\"#\">apply</a></div>\n  </div>\n</div>\n\n";
+  },"useData":true});
+var ApiKeyButton,
+  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
+  __hasProp = {}.hasOwnProperty;
+
+ApiKeyButton = (function(_super) {
+  __extends(ApiKeyButton, _super);
+
+  function ApiKeyButton() {
+    return ApiKeyButton.__super__.constructor.apply(this, arguments);
+  }
+
+  ApiKeyButton.prototype.initialize = function() {};
+
+  ApiKeyButton.prototype.render = function() {
+    var template;
+    template = this.template();
+    $(this.el).html(template(this.model));
+    return this;
+  };
+
+  ApiKeyButton.prototype.events = {
+    "click #apikey_button": "toggleApiKeyContainer",
+    "click #apply_api_key": "applyApiKey"
+  };
+
+  ApiKeyButton.prototype.applyApiKey = function() {
+    var elem;
+    window.authorizations.add(this.model.name, new ApiKeyAuthorization(this.model.name, $("#input_apiKey_entry").val(), this.model["in"]));
+    window.swaggerUi.load();
+    return elem = $('#apikey_container').show();
+  };
+
+  ApiKeyButton.prototype.toggleApiKeyContainer = function() {
+    var elem;
+    if ($('#apikey_container').length > 0) {
+      elem = $('#apikey_container').first();
+      if (elem.is(':visible')) {
+        return elem.hide();
+      } else {
+        $('.auth_container').hide();
+        return elem.show();
+      }
+    }
+  };
+
+  ApiKeyButton.prototype.template = function() {
+    return Handlebars.templates.apikey_button_view;
+  };
+
+  return ApiKeyButton;
+
+})(Backbone.View);
+
+this["Handlebars"]["templates"]["content_type"] = Handlebars.template({"1":function(depth0,helpers,partials,data) {
+  var stack1, buffer = "";
+  stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.produces : depth0), {"name":"each","hash":{},"fn":this.program(2, data),"inverse":this.noop,"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  return buffer;
+},"2":function(depth0,helpers,partials,data) {
+  var stack1, lambda=this.lambda, buffer = "	<option value=\"";
+  stack1 = lambda(depth0, depth0);
+  if (stack1 != null) { buffer += stack1; }
+  buffer += "\">";
+  stack1 = lambda(depth0, depth0);
+  if (stack1 != null) { buffer += stack1; }
+  return buffer + "</option>\n";
+},"4":function(depth0,helpers,partials,data) {
+  return "  <option value=\"application/json\">application/json</option>\n";
+  },"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+  var stack1, buffer = "<label for=\"contentType\"></label>\n<select name=\"contentType\">\n";
+  stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.produces : depth0), {"name":"if","hash":{},"fn":this.program(1, data),"inverse":this.program(4, data),"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  return buffer + "</select>\n";
+},"useData":true});
+var BasicAuthButton,
+  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
+  __hasProp = {}.hasOwnProperty;
+
+BasicAuthButton = (function(_super) {
+  __extends(BasicAuthButton, _super);
+
+  function BasicAuthButton() {
+    return BasicAuthButton.__super__.constructor.apply(this, arguments);
+  }
+
+  BasicAuthButton.prototype.initialize = function() {};
+
+  BasicAuthButton.prototype.render = function() {
+    var template;
+    template = this.template();
+    $(this.el).html(template(this.model));
+    return this;
+  };
+
+  BasicAuthButton.prototype.events = {
+    "click #basic_auth_button": "togglePasswordContainer",
+    "click #apply_basic_auth": "applyPassword"
+  };
+
+  BasicAuthButton.prototype.applyPassword = function() {
+    var elem, password, username;
+    username = $(".input_username").val();
+    password = $(".input_password").val();
+    window.authorizations.add(this.model.type, new PasswordAuthorization("basic", username, password));
+    window.swaggerUi.load();
+    return elem = $('#basic_auth_container').hide();
+  };
+
+  BasicAuthButton.prototype.togglePasswordContainer = function() {
+    var elem;
+    if ($('#basic_auth_container').length > 0) {
+      elem = $('#basic_auth_container').show();
+      if (elem.is(':visible')) {
+        return elem.slideUp();
+      } else {
+        $('.auth_container').hide();
+        return elem.show();
+      }
+    }
+  };
+
+  BasicAuthButton.prototype.template = function() {
+    return Handlebars.templates.basic_auth_button_view;
+  };
+
+  return BasicAuthButton;
+
+})(Backbone.View);
+
+this["Handlebars"]["templates"]["main"] = Handlebars.template({"1":function(depth0,helpers,partials,data) {
+  var stack1, lambda=this.lambda, escapeExpression=this.escapeExpression, buffer = "  <div class=\"info_title\">"
+    + escapeExpression(lambda(((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.title : stack1), depth0))
+    + "</div>\n  <div class=\"info_description markdown\">";
+  stack1 = lambda(((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.description : stack1), depth0);
+  if (stack1 != null) { buffer += stack1; }
+  buffer += "</div>\n  ";
+  stack1 = helpers['if'].call(depth0, ((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.termsOfServiceUrl : stack1), {"name":"if","hash":{},"fn":this.program(2, data),"inverse":this.noop,"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  buffer += "\n  ";
+  stack1 = helpers['if'].call(depth0, ((stack1 = ((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.contact : stack1)) != null ? stack1.name : stack1), {"name":"if","hash":{},"fn":this.program(4, data),"inverse":this.noop,"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  buffer += "\n  ";
+  stack1 = helpers['if'].call(depth0, ((stack1 = ((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.contact : stack1)) != null ? stack1.url : stack1), {"name":"if","hash":{},"fn":this.program(6, data),"inverse":this.noop,"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  buffer += "\n  ";
+  stack1 = helpers['if'].call(depth0, ((stack1 = ((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.contact : stack1)) != null ? stack1.email : stack1), {"name":"if","hash":{},"fn":this.program(8, data),"inverse":this.noop,"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  buffer += "\n  ";
+  stack1 = helpers['if'].call(depth0, ((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.license : stack1), {"name":"if","hash":{},"fn":this.program(10, data),"inverse":this.noop,"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  return buffer + "\n";
+},"2":function(depth0,helpers,partials,data) {
+  var stack1, lambda=this.lambda, escapeExpression=this.escapeExpression;
+  return "<div class=\"info_tos\"><a href=\""
+    + escapeExpression(lambda(((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.termsOfServiceUrl : stack1), depth0))
+    + "\">Terms of service</a></div>";
+},"4":function(depth0,helpers,partials,data) {
+  var stack1, lambda=this.lambda, escapeExpression=this.escapeExpression;
+  return "<div class='info_name'>Created by "
+    + escapeExpression(lambda(((stack1 = ((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.contact : stack1)) != null ? stack1.name : stack1), depth0))
+    + "</div>";
+},"6":function(depth0,helpers,partials,data) {
+  var stack1, lambda=this.lambda, escapeExpression=this.escapeExpression;
+  return "<div class='info_url'>See more at <a href=\""
+    + escapeExpression(lambda(((stack1 = ((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.contact : stack1)) != null ? stack1.url : stack1), depth0))
+    + "\">"
+    + escapeExpression(lambda(((stack1 = ((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.contact : stack1)) != null ? stack1.url : stack1), depth0))
+    + "</a></div>";
+},"8":function(depth0,helpers,partials,data) {
+  var stack1, lambda=this.lambda, escapeExpression=this.escapeExpression;
+  return "<div class='info_email'><a href=\"mailto:"
+    + escapeExpression(lambda(((stack1 = ((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.contact : stack1)) != null ? stack1.email : stack1), depth0))
+    + "?subject="
+    + escapeExpression(lambda(((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.title : stack1), depth0))
+    + "\">Contact the developer</a></div>";
+},"10":function(depth0,helpers,partials,data) {
+  var stack1, lambda=this.lambda, escapeExpression=this.escapeExpression;
+  return "<div class='info_license'><a href='"
+    + escapeExpression(lambda(((stack1 = ((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.license : stack1)) != null ? stack1.url : stack1), depth0))
+    + "'>"
+    + escapeExpression(lambda(((stack1 = ((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.license : stack1)) != null ? stack1.name : stack1), depth0))
+    + "</a></div>";
+},"12":function(depth0,helpers,partials,data) {
+  var stack1, lambda=this.lambda, escapeExpression=this.escapeExpression;
+  return "    , <span style=\"font-variant: small-caps\">api version</span>: "
+    + escapeExpression(lambda(((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.version : stack1), depth0))
+    + "\n    ";
+},"14":function(depth0,helpers,partials,data) {
+  var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+  return "    <span style=\"float:right\"><a href=\""
+    + escapeExpression(((helper = (helper = helpers.validatorUrl || (depth0 != null ? depth0.validatorUrl : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"validatorUrl","hash":{},"data":data}) : helper)))
+    + "/debug?url="
+    + escapeExpression(((helper = (helper = helpers.url || (depth0 != null ? depth0.url : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"url","hash":{},"data":data}) : helper)))
+    + "\"><img id=\"validator\" src=\""
+    + escapeExpression(((helper = (helper = helpers.validatorUrl || (depth0 != null ? depth0.validatorUrl : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"validatorUrl","hash":{},"data":data}) : helper)))
+    + "?url="
+    + escapeExpression(((helper = (helper = helpers.url || (depth0 != null ? depth0.url : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"url","hash":{},"data":data}) : helper)))
+    + "\"></a>\n    </span>\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+  var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "<div class='info' id='api_info'>\n";
+  stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.info : depth0), {"name":"if","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  buffer += "</div>\n<div class='container' id='resources_container'>\n  <ul id='resources'></ul>\n\n  <div class=\"footer\">\n    <br>\n    <br>\n    <h4 style=\"color: #999\">[ <span style=\"font-variant: small-caps\">base url</span>: "
+    + escapeExpression(((helper = (helper = helpers.basePath || (depth0 != null ? depth0.basePath : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"basePath","hash":{},"data":data}) : helper)))
+    + "\n";
+  stack1 = helpers['if'].call(depth0, ((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.version : stack1), {"name":"if","hash":{},"fn":this.program(12, data),"inverse":this.noop,"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  buffer += "]\n";
+  stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.validatorUrl : depth0), {"name":"if","hash":{},"fn":this.program(14, data),"inverse":this.noop,"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  return buffer + "    </h4>\n    </div>\n</div>\n";
+},"useData":true});
+this["Handlebars"]["templates"]["operation"] = Handlebars.template({"1":function(depth0,helpers,partials,data) {
+  return "deprecated";
+  },"3":function(depth0,helpers,partials,data) {
+  return "            <h4>Warning: Deprecated</h4>\n";
+  },"5":function(depth0,helpers,partials,data) {
+  var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, buffer = "        <h4>Implementation Notes</h4>\n        <p class=\"markdown\">";
+  stack1 = ((helper = (helper = helpers.description || (depth0 != null ? depth0.description : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"description","hash":{},"data":data}) : helper));
+  if (stack1 != null) { buffer += stack1; }
+  return buffer + "</p>\n";
+},"7":function(depth0,helpers,partials,data) {
+  return "        <div class=\"auth\">\n        <span class=\"api-ic ic-error\"></span>";
+  },"9":function(depth0,helpers,partials,data) {
+  var stack1, buffer = "          <div id=\"api_information_panel\" style=\"top: 526px; left: 776px; display: none;\">\n";
+  stack1 = helpers.each.call(depth0, depth0, {"name":"each","hash":{},"fn":this.program(10, data),"inverse":this.noop,"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  return buffer + "          </div>\n";
+},"10":function(depth0,helpers,partials,data) {
+  var stack1, lambda=this.lambda, escapeExpression=this.escapeExpression, buffer = "            <div title='";
+  stack1 = lambda((depth0 != null ? depth0.description : depth0), depth0);
+  if (stack1 != null) { buffer += stack1; }
+  return buffer + "'>"
+    + escapeExpression(lambda((depth0 != null ? depth0.scope : depth0), depth0))
+    + "</div>\n";
+},"12":function(depth0,helpers,partials,data) {
+  return "</div>";
+  },"14":function(depth0,helpers,partials,data) {
+  return "        <div class='access'>\n          <span class=\"api-ic ic-off\" title=\"click to authenticate\"></span>\n        </div>\n";
+  },"16":function(depth0,helpers,partials,data) {
+  var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+  return "          <h4>Response Class (Status "
+    + escapeExpression(((helper = (helper = helpers.successCode || (depth0 != null ? depth0.successCode : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"successCode","hash":{},"data":data}) : helper)))
+    + ")</h4>\n          <p><span class=\"model-signature\" /></p>\n          <br/>\n          <div class=\"response-content-type\" />\n";
+},"18":function(depth0,helpers,partials,data) {
+  return "          <h4>Parameters</h4>\n          <table class='fullwidth'>\n          <thead>\n            <tr>\n            <th style=\"width: 100px; max-width: 100px\">Parameter</th>\n            <th style=\"width: 310px; max-width: 310px\">Value</th>\n            <th style=\"width: 200px; max-width: 200px\">Description</th>\n            <th style=\"width: 100px; max-width: 100px\">Parameter Type</th>\n            <th style=\"width: 220px; max-width: 230px\">Data Type</th>\n            </tr>\n          </thead>\n          <tbody class=\"operation-params\">\n\n          </tbody>\n          </table>\n";
+  },"20":function(depth0,helpers,partials,data) {
+  return "          <div style='margin:0;padding:0;display:inline'></div>\n          <h4>Response Messages</h4>\n          <table class='fullwidth'>\n            <thead>\n            <tr>\n              <th>HTTP Status Code</th>\n              <th>Reason</th>\n              <th>Response Model</th>\n            </tr>\n            </thead>\n            <tbody class=\"operation-status\">\n            \n            </tbody>\n          </table>\n";
+  },"22":function(depth0,helpers,partials,data) {
+  return "";
+},"24":function(depth0,helpers,partials,data) {
+  return "          <div class='sandbox_header'>\n            <input class='submit' name='commit' type='button' value='Try it out!' />\n            <a href='#' class='response_hider' style='display:none'>Hide Response</a>\n            <span class='response_throbber' style='display:none'></span>\n          </div>\n";
+  },"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+  var stack1, helper, options, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, blockHelperMissing=helpers.blockHelperMissing, buffer = "\n  <ul class='operations' >\n    <li class='"
+    + escapeExpression(((helper = (helper = helpers.method || (depth0 != null ? depth0.method : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"method","hash":{},"data":data}) : helper)))
+    + " operation' id='"
+    + escapeExpression(((helper = (helper = helpers.parentId || (depth0 != null ? depth0.parentId : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"parentId","hash":{},"data":data}) : helper)))
+    + "_"
+    + escapeExpression(((helper = (helper = helpers.nickname || (depth0 != null ? depth0.nickname : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"nickname","hash":{},"data":data}) : helper)))
+    + "'>\n      <div class='heading'>\n        <h3>\n          <span class='http_method'>\n          <a href='#!/"
+    + escapeExpression(((helper = (helper = helpers.parentId || (depth0 != null ? depth0.parentId : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"parentId","hash":{},"data":data}) : helper)))
+    + "/"
+    + escapeExpression(((helper = (helper = helpers.nickname || (depth0 != null ? depth0.nickname : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"nickname","hash":{},"data":data}) : helper)))
+    + "' class=\"toggleOperation\">"
+    + escapeExpression(((helper = (helper = helpers.method || (depth0 != null ? depth0.method : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"method","hash":{},"data":data}) : helper)))
+    + "</a>\n          </span>\n          <span class='path'>\n          <a href='#!/"
+    + escapeExpression(((helper = (helper = helpers.parentId || (depth0 != null ? depth0.parentId : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"parentId","hash":{},"data":data}) : helper)))
+    + "/"
+    + escapeExpression(((helper = (helper = helpers.nickname || (depth0 != null ? depth0.nickname : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"nickname","hash":{},"data":data}) : helper)))
+    + "' class=\"toggleOperation ";
+  stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.deprecated : depth0), {"name":"if","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  buffer += "\">"
+    + escapeExpression(((helper = (helper = helpers.path || (depth0 != null ? depth0.path : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"path","hash":{},"data":data}) : helper)))
+    + "</a>\n          </span>\n        </h3>\n        <ul class='options'>\n          <li>\n          <a href='#!/"
+    + escapeExpression(((helper = (helper = helpers.parentId || (depth0 != null ? depth0.parentId : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"parentId","hash":{},"data":data}) : helper)))
+    + "/"
+    + escapeExpression(((helper = (helper = helpers.nickname || (depth0 != null ? depth0.nickname : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"nickname","hash":{},"data":data}) : helper)))
+    + "' class=\"toggleOperation\">";
+  stack1 = ((helper = (helper = helpers.summary || (depth0 != null ? depth0.summary : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"summary","hash":{},"data":data}) : helper));
+  if (stack1 != null) { buffer += stack1; }
+  buffer += "</a>\n          </li>\n        </ul>\n      </div>\n      <div class='content' id='"
+    + escapeExpression(((helper = (helper = helpers.parentId || (depth0 != null ? depth0.parentId : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"parentId","hash":{},"data":data}) : helper)))
+    + "_"
+    + escapeExpression(((helper = (helper = helpers.nickname || (depth0 != null ? depth0.nickname : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"nickname","hash":{},"data":data}) : helper)))
+    + "_content' style='display:none'>\n";
+  stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.deprecated : depth0), {"name":"if","hash":{},"fn":this.program(3, data),"inverse":this.noop,"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.description : depth0), {"name":"if","hash":{},"fn":this.program(5, data),"inverse":this.noop,"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  stack1 = ((helper = (helper = helpers.oauth || (depth0 != null ? depth0.oauth : depth0)) != null ? helper : helperMissing),(options={"name":"oauth","hash":{},"fn":this.program(7, data),"inverse":this.noop,"data":data}),(typeof helper === functionType ? helper.call(depth0, options) : helper));
+  if (!helpers.oauth) { stack1 = blockHelperMissing.call(depth0, stack1, options); }
+  if (stack1 != null) { buffer += stack1; }
+  buffer += "\n";
+  stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.oauth : depth0), {"name":"each","hash":{},"fn":this.program(9, data),"inverse":this.noop,"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  buffer += "        ";
+  stack1 = ((helper = (helper = helpers.oauth || (depth0 != null ? depth0.oauth : depth0)) != null ? helper : helperMissing),(options={"name":"oauth","hash":{},"fn":this.program(12, data),"inverse":this.noop,"data":data}),(typeof helper === functionType ? helper.call(depth0, options) : helper));
+  if (!helpers.oauth) { stack1 = blockHelperMissing.call(depth0, stack1, options); }
+  if (stack1 != null) { buffer += stack1; }
+  buffer += "\n";
+  stack1 = ((helper = (helper = helpers.oauth || (depth0 != null ? depth0.oauth : depth0)) != null ? helper : helperMissing),(options={"name":"oauth","hash":{},"fn":this.program(14, data),"inverse":this.noop,"data":data}),(typeof helper === functionType ? helper.call(depth0, options) : helper));
+  if (!helpers.oauth) { stack1 = blockHelperMissing.call(depth0, stack1, options); }
+  if (stack1 != null) { buffer += stack1; }
+  stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.type : depth0), {"name":"if","hash":{},"fn":this.program(16, data),"inverse":this.noop,"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  buffer += "        <form accept-charset='UTF-8' class='sandbox'>\n          <div style='margin:0;padding:0;display:inline'></div>\n";
+  stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.parameters : depth0), {"name":"if","hash":{},"fn":this.program(18, data),"inverse":this.noop,"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.responseMessages : depth0), {"name":"if","hash":{},"fn":this.program(20, data),"inverse":this.noop,"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.isReadOnly : depth0), {"name":"if","hash":{},"fn":this.program(22, data),"inverse":this.program(24, data),"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  return buffer + "        </form>\n        <div class='response' style='display:none'>\n          <h4>Request URL</h4>\n          <div class='block request_url'></div>\n          <h4>Response Body</h4>\n          <div class='block response_body'></div>\n          <h4>Response Code</h4>\n          <div class='block response_code'></div>\n          <h4>Response Headers</h4>\n          <div class='block response_headers'></div>\n        </div>\n      </div>\n    </li>\n  </ul>\n";
+},"useData":true});
+var ContentTypeView,
+  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
+  __hasProp = {}.hasOwnProperty;
+
+ContentTypeView = (function(_super) {
+  __extends(ContentTypeView, _super);
+
+  function ContentTypeView() {
+    return ContentTypeView.__super__.constructor.apply(this, arguments);
+  }
+
+  ContentTypeView.prototype.initialize = function() {};
+
+  ContentTypeView.prototype.render = function() {
+    var template;
+    template = this.template();
+    $(this.el).html(template(this.model));
+    $('label[for=contentType]', $(this.el)).text('Response Content Type');
+    return this;
+  };
+
+  ContentTypeView.prototype.template = function() {
+    return Handlebars.templates.content_type;
+  };
+
+  return ContentTypeView;
+
+})(Backbone.View);
+
+this["Handlebars"]["templates"]["param"] = Handlebars.template({"1":function(depth0,helpers,partials,data) {
+  var stack1, buffer = "";
+  stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.isFile : depth0), {"name":"if","hash":{},"fn":this.program(2, data),"inverse":this.program(4, data),"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  return buffer;
+},"2":function(depth0,helpers,partials,data) {
+  var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+  return "			<input type=\"file\" name='"
+    + escapeExpression(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"name","hash":{},"data":data}) : helper)))
+    + "'/>\n			<div class=\"parameter-content-type\" />\n";
+},"4":function(depth0,helpers,partials,data) {
+  var stack1, buffer = "";
+  stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['default'] : depth0), {"name":"if","hash":{},"fn":this.program(5, data),"inverse":this.program(7, data),"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  return buffer;
+},"5":function(depth0,helpers,partials,data) {
+  var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+  return "				<textarea class='body-textarea' name='"
+    + escapeExpression(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"name","hash":{},"data":data}) : helper)))
+    + "'>"
+    + escapeExpression(((helper = (helper = helpers['default'] || (depth0 != null ? depth0['default'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"default","hash":{},"data":data}) : helper)))
+    + "</textarea>\n        <br />\n        <div class=\"parameter-content-type\" />\n";
+},"7":function(depth0,helpers,partials,data) {
+  var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+  return "				<textarea class='body-textarea' name='"
+    + escapeExpression(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"name","hash":{},"data":data}) : helper)))
+    + "'></textarea>\n				<br />\n				<div class=\"parameter-content-type\" />\n";
+},"9":function(depth0,helpers,partials,data) {
+  var stack1, buffer = "";
+  stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.isFile : depth0), {"name":"if","hash":{},"fn":this.program(2, data),"inverse":this.program(10, data),"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  return buffer;
+},"10":function(depth0,helpers,partials,data) {
+  var stack1, buffer = "";
+  stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['default'] : depth0), {"name":"if","hash":{},"fn":this.program(11, data),"inverse":this.program(13, data),"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  return buffer;
+},"11":function(depth0,helpers,partials,data) {
+  var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+  return "				<input class='parameter' minlength='0' name='"
+    + escapeExpression(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"name","hash":{},"data":data}) : helper)))
+    + "' placeholder='' type='text' value='"
+    + escapeExpression(((helper = (helper = helpers['default'] || (depth0 != null ? depth0['default'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"default","hash":{},"data":data}) : helper)))
+    + "'/>\n";
+},"13":function(depth0,helpers,partials,data) {
+  var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+  return "				<input class='parameter' minlength='0' name='"
+    + escapeExpression(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"name","hash":{},"data":data}) : helper)))
+    + "' placeholder='' type='text' value=''/>\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+  var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "<td class='code'>"
+    + escapeExpression(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"name","hash":{},"data":data}) : helper)))
+    + "</td>\n<td>\n\n";
+  stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.isBody : depth0), {"name":"if","hash":{},"fn":this.program(1, data),"inverse":this.program(9, data),"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  buffer += "\n</td>\n<td class=\"markdown\">";
+  stack1 = ((helper = (helper = helpers.description || (depth0 != null ? depth0.description : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"description","hash":{},"data":data}) : helper));
+  if (stack1 != null) { buffer += stack1; }
+  buffer += "</td>\n<td>";
+  stack1 = ((helper = (helper = helpers.paramType || (depth0 != null ? depth0.paramType : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"paramType","hash":{},"data":data}) : helper));
+  if (stack1 != null) { buffer += stack1; }
+  return buffer + "</td>\n<td>\n	<span class=\"model-signature\"></span>\n</td>\n";
+},"useData":true});
+var HeaderView,
+  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
+  __hasProp = {}.hasOwnProperty;
+
+HeaderView = (function(_super) {
+  __extends(HeaderView, _super);
+
+  function HeaderView() {
+    return HeaderView.__super__.constructor.apply(this, arguments);
+  }
+
+  HeaderView.prototype.events = {
+    'click #show-pet-store-icon': 'showPetStore',
+    'click #show-wordnik-dev-icon': 'showWordnikDev',
+    'click #explore': 'showCustom',
+    'keyup #input_baseUrl': 'showCustomOnKeyup',
+    'keyup #input_apiKey': 'showCustomOnKeyup'
+  };
+
+  HeaderView.prototype.initialize = function() {};
+
+  HeaderView.prototype.showPetStore = function(e) {
+    return this.trigger('update-swagger-ui', {
+      url: "http://petstore.swagger.wordnik.com/api/api-docs"
+    });
+  };
+
+  HeaderView.prototype.showWordnikDev = function(e) {
+    return this.trigger('update-swagger-ui', {
+      url: "http://api.wordnik.com/v4/resources.json"
+    });
+  };
+
+  HeaderView.prototype.showCustomOnKeyup = function(e) {
+    if (e.keyCode === 13) {
+      return this.showCustom();
+    }
+  };
+
+  HeaderView.prototype.showCustom = function(e) {
+    if (e != null) {
+      e.preventDefault();
+    }
+    return this.trigger('update-swagger-ui', {
+      url: $('#input_baseUrl').val(),
+      apiKey: $('#input_apiKey').val()
+    });
+  };
+
+  HeaderView.prototype.update = function(url, apiKey, trigger) {
+    if (trigger == null) {
+      trigger = false;
+    }
+    $('#input_baseUrl').val(url);
+    if (trigger) {
+      return this.trigger('update-swagger-ui', {
+        url: url
+      });
+    }
+  };
+
+  return HeaderView;
+
+})(Backbone.View);
+
+this["Handlebars"]["templates"]["param_list"] = Handlebars.template({"1":function(depth0,helpers,partials,data) {
+  return " multiple='multiple'";
+  },"3":function(depth0,helpers,partials,data) {
+  return "";
+},"5":function(depth0,helpers,partials,data) {
+  var stack1, buffer = "";
+  stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['default'] : depth0), {"name":"if","hash":{},"fn":this.program(3, data),"inverse":this.program(6, data),"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  return buffer;
+},"6":function(depth0,helpers,partials,data) {
+  var stack1, helperMissing=helpers.helperMissing, buffer = "";
+  stack1 = ((helpers.isArray || (depth0 && depth0.isArray) || helperMissing).call(depth0, depth0, {"name":"isArray","hash":{},"fn":this.program(3, data),"inverse":this.program(7, data),"data":data}));
+  if (stack1 != null) { buffer += stack1; }
+  return buffer;
+},"7":function(depth0,helpers,partials,data) {
+  return "          <option selected=\"\" value=''></option>\n";
+  },"9":function(depth0,helpers,partials,data) {
+  var stack1, buffer = "";
+  stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.isDefault : depth0), {"name":"if","hash":{},"fn":this.program(10, data),"inverse":this.program(12, data),"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  return buffer;
+},"10":function(depth0,helpers,partials,data) {
+  var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+  return "        <option selected=\"\" value='"
+    + escapeExpression(((helper = (helper = helpers.value || (depth0 != null ? depth0.value : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"value","hash":{},"data":data}) : helper)))
+    + "'>"
+    + escapeExpression(((helper = (helper = helpers.value || (depth0 != null ? depth0.value : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"value","hash":{},"data":data}) : helper)))
+    + " (default)</option>\n";
+},"12":function(depth0,helpers,partials,data) {
+  var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+  return "        <option value='"
+    + escapeExpression(((helper = (helper = helpers.value || (depth0 != null ? depth0.value : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"value","hash":{},"data":data}) : helper)))
+    + "'>"
+    + escapeExpression(((helper = (helper = helpers.value || (depth0 != null ? depth0.value : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"value","hash":{},"data":data}) : helper)))
+    + "</option>\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+  var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "<td class='code'>"
+    + escapeExpression(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"name","hash":{},"data":data}) : helper)))
+    + "</td>\n<td>\n  <select ";
+  stack1 = ((helpers.isArray || (depth0 && depth0.isArray) || helperMissing).call(depth0, depth0, {"name":"isArray","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data}));
+  if (stack1 != null) { buffer += stack1; }
+  buffer += " class='parameter' name='"
+    + escapeExpression(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"name","hash":{},"data":data}) : helper)))
+    + "'>\n";
+  stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.required : depth0), {"name":"if","hash":{},"fn":this.program(3, data),"inverse":this.program(5, data),"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  stack1 = helpers.each.call(depth0, ((stack1 = (depth0 != null ? depth0.allowableValues : depth0)) != null ? stack1.descriptiveValues : stack1), {"name":"each","hash":{},"fn":this.program(9, data),"inverse":this.noop,"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  buffer += "  </select>\n</td>\n<td class=\"markdown\">";
+  stack1 = ((helper = (helper = helpers.description || (depth0 != null ? depth0.description : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"description","hash":{},"data":data}) : helper));
+  if (stack1 != null) { buffer += stack1; }
+  buffer += "</td>\n<td>";
+  stack1 = ((helper = (helper = helpers.paramType || (depth0 != null ? depth0.paramType : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"paramType","hash":{},"data":data}) : helper));
+  if (stack1 != null) { buffer += stack1; }
+  return buffer + "</td>\n<td><span class=\"model-signature\"></span></td>";
+},"useData":true});
+var MainView,
+  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
+  __hasProp = {}.hasOwnProperty;
+
+MainView = (function(_super) {
+  var sorters;
+
+  __extends(MainView, _super);
+
+  function MainView() {
+    return MainView.__super__.constructor.apply(this, arguments);
+  }
+
+  sorters = {
+    'alpha': function(a, b) {
+      return a.path.localeCompare(b.path);
+    },
+    'method': function(a, b) {
+      return a.method.localeCompare(b.method);
+    }
+  };
+
+  MainView.prototype.initialize = function(opts) {
+    var auth, key, value, _ref;
+    if (opts == null) {
+      opts = {};
+    }
+    this.model.auths = [];
+    _ref = this.model.securityDefinitions;
+    for (key in _ref) {
+      value = _ref[key];
+      auth = {
+        name: key,
+        type: value.type,
+        value: value
+      };
+      this.model.auths.push(auth);
+    }
+    if (this.model.swaggerVersion === "2.0") {
+      if ("validatorUrl" in opts.swaggerOptions) {
+        return this.model.validatorUrl = opts.swaggerOptions.validatorUrl;
+      } else if (this.model.url.indexOf("localhost") > 0) {
+        return this.model.validatorUrl = null;
+      } else {
+        return this.model.validatorUrl = "http://online.swagger.io/validator";
+      }
+    }
+  };
+
+  MainView.prototype.render = function() {
+    var auth, button, counter, id, name, resource, resources, _i, _len, _ref;
+    if (this.model.securityDefinitions) {
+      for (name in this.model.securityDefinitions) {
+        auth = this.model.securityDefinitions[name];
+        if (auth.type === "apiKey" && $("#apikey_button").length === 0) {
+          button = new ApiKeyButton({
+            model: auth
+          }).render().el;
+          $('.auth_main_container').append(button);
+        }
+        if (auth.type === "basicAuth" && $("#basic_auth_button").length === 0) {
+          button = new BasicAuthButton({
+            model: auth
+          }).render().el;
+          $('.auth_main_container').append(button);
+        }
+      }
+    }
+    $(this.el).html(Handlebars.templates.main(this.model));
+    resources = {};
+    counter = 0;
+    _ref = _.sortBy(this.model.apisArray, function(resource) { return resource.name;});
+    for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+      resource = _ref[_i];
+      id = resource.name;
+      while (typeof resources[id] !== 'undefined') {
+        id = id + "_" + counter;
+        counter += 1;
+      }
+      resource.id = id;
+      resources[id] = resource;
+      this.addResource(resource, this.model.auths);
+    }
+    $('.propWrap').hover(function() {
+      return $('.optionsWrapper', $(this)).show();
+    }, function() {
+      return $('.optionsWrapper', $(this)).hide();
+    });
+    return this;
+  };
+
+  MainView.prototype.addResource = function(resource, auths) {
+    var resourceView;
+    resource.id = resource.id.replace(/\s/g, '_');
+    resourceView = new ResourceView({
+      model: resource,
+      tagName: 'li',
+      id: 'resource_' + resource.id,
+      className: 'resource',
+      auths: auths,
+      swaggerOptions: this.options.swaggerOptions
+    });
+    return $('#resources').append(resourceView.render().el);
+  };
+
+  MainView.prototype.clear = function() {
+    return $(this.el).html('');
+  };
+
+  return MainView;
+
+})(Backbone.View);
+
+this["Handlebars"]["templates"]["param_readonly"] = Handlebars.template({"1":function(depth0,helpers,partials,data) {
+  var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+  return "        <textarea class='body-textarea' readonly='readonly' name='"
+    + escapeExpression(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"name","hash":{},"data":data}) : helper)))
+    + "'>"
+    + escapeExpression(((helper = (helper = helpers['default'] || (depth0 != null ? depth0['default'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"default","hash":{},"data":data}) : helper)))
+    + "</textarea>\n";
+},"3":function(depth0,helpers,partials,data) {
+  var stack1, buffer = "";
+  stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['default'] : depth0), {"name":"if","hash":{},"fn":this.program(4, data),"inverse":this.program(6, data),"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  return buffer;
+},"4":function(depth0,helpers,partials,data) {
+  var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+  return "            "
+    + escapeExpression(((helper = (helper = helpers['default'] || (depth0 != null ? depth0['default'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"default","hash":{},"data":data}) : helper)))
+    + "\n";
+},"6":function(depth0,helpers,partials,data) {
+  return "            (empty)\n";
+  },"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+  var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "<td class='code'>"
+    + escapeExpression(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"name","hash":{},"data":data}) : helper)))
+    + "</td>\n<td>\n";
+  stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.isBody : depth0), {"name":"if","hash":{},"fn":this.program(1, data),"inverse":this.program(3, data),"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  buffer += "</td>\n<td class=\"markdown\">";
+  stack1 = ((helper = (helper = helpers.description || (depth0 != null ? depth0.description : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"description","hash":{},"data":data}) : helper));
+  if (stack1 != null) { buffer += stack1; }
+  buffer += "</td>\n<td>";
+  stack1 = ((helper = (helper = helpers.paramType || (depth0 != null ? depth0.paramType : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"paramType","hash":{},"data":data}) : helper));
+  if (stack1 != null) { buffer += stack1; }
+  return buffer + "</td>\n<td><span class=\"model-signature\"></span></td>\n";
+},"useData":true});
+var OperationView,
+  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
+  __hasProp = {}.hasOwnProperty;
+
+OperationView = (function(_super) {
+  __extends(OperationView, _super);
+
+  function OperationView() {
+    return OperationView.__super__.constructor.apply(this, arguments);
+  }
+
+  OperationView.prototype.invocationUrl = null;
+
+  OperationView.prototype.events = {
+    'submit .sandbox': 'submitOperation',
+    'click .submit': 'submitOperation',
+    'click .response_hider': 'hideResponse',
+    'click .toggleOperation': 'toggleOperationContent',
+    'mouseenter .api-ic': 'mouseEnter',
+    'mouseout .api-ic': 'mouseExit'
+  };
+
+  OperationView.prototype.initialize = function(opts) {
+    if (opts == null) {
+      opts = {};
+    }
+    this.auths = opts.auths;
+    return this;
+  };
+
+  OperationView.prototype.mouseEnter = function(e) {
+    var elem, hgh, pos, scMaxX, scMaxY, scX, scY, wd, x, y;
+    elem = $(this.el).find('.content');
+    x = e.pageX;
+    y = e.pageY;
+    scX = $(window).scrollLeft();
+    scY = $(window).scrollTop();
+    scMaxX = scX + $(window).width();
+    scMaxY = scY + $(window).height();
+    wd = elem.width();
+    hgh = elem.height();
+    if (x + wd > scMaxX) {
+      x = scMaxX - wd;
+    }
+    if (x < scX) {
+      x = scX;
+    }
+    if (y + hgh > scMaxY) {
+      y = scMaxY - hgh;
+    }
+    if (y < scY) {
+      y = scY;
+    }
+    pos = {};
+    pos.top = y;
+    pos.left = x;
+    elem.css(pos);
+    return $(e.currentTarget.parentNode).find('#api_information_panel').show();
+  };
+
+  OperationView.prototype.mouseExit = function(e) {
+    return $(e.currentTarget.parentNode).find('#api_information_panel').hide();
+  };
+
+  OperationView.prototype.render = function() {
+    var a, auth, auths, code, contentTypeModel, isMethodSubmissionSupported, k, key, modelAuths, o, param, ref, responseContentTypeView, responseSignatureView, schema, schemaObj, scopeIndex, signatureModel, statusCode, successResponse, type, v, value, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _m, _ref, _ref1, _ref2, _ref3, _ref4;
+    isMethodSubmissionSupported = jQuery.inArray(this.model.method, this.model.supportedSubmitMethods()) >= 0;
+    if (!isMethodSubmissionSupported) {
+      this.model.isReadOnly = true;
+    }
+    this.model.description = this.model.description || this.model.notes;
+    if (this.model.description) {
+      this.model.description = this.model.description.replace(/(?:\r\n|\r|\n)/g, '<br />');
+    }
+    this.model.oauth = null;
+    modelAuths = this.model.authorizations || this.model.security;
+    if (modelAuths) {
+      if (Array.isArray(modelAuths)) {
+        for (_i = 0, _len = modelAuths.length; _i < _len; _i++) {
+          auths = modelAuths[_i];
+          for (key in auths) {
+            auth = auths[key];
+            for (a in this.auths) {
+              auth = this.auths[a];
+              if (auth.type === 'oauth2') {
+                this.model.oauth = {};
+                this.model.oauth.scopes = [];
+                _ref = auth.value.scopes;
+                for (k in _ref) {
+                  v = _ref[k];
+                  scopeIndex = auths[key].indexOf(k);
+                  if (scopeIndex >= 0) {
+                    o = {
+                      scope: k,
+                      description: v
+                    };
+                    this.model.oauth.scopes.push(o);
+                  }
+                }
+              }
+            }
+          }
+        }
+      } else {
+        for (k in modelAuths) {
+          v = modelAuths[k];
+          if (k === "oauth2") {
+            if (this.model.oauth === null) {
+              this.model.oauth = {};
+            }
+            if (this.model.oauth.scopes === void 0) {
+              this.model.oauth.scopes = [];
+            }
+            for (_j = 0, _len1 = v.length; _j < _len1; _j++) {
+              o = v[_j];
+              this.model.oauth.scopes.push(o);
+            }
+          }
+        }
+      }
+    }
+    if (typeof this.model.responses !== 'undefined') {
+      this.model.responseMessages = [];
+      _ref1 = this.model.responses;
+      for (code in _ref1) {
+        value = _ref1[code];
+        schema = null;
+        schemaObj = this.model.responses[code].schema;
+        if (schemaObj && schemaObj['$ref']) {
+          schema = schemaObj['$ref'];
+          if (schema.indexOf('#/definitions/') === 0) {
+            schema = schema.substring('#/definitions/'.length);
+          }
+        }
+        this.model.responseMessages.push({
+          code: code,
+          message: value.description,
+          responseModel: schema
+        });
+      }
+    }
+    if (typeof this.model.responseMessages === 'undefined') {
+      this.model.responseMessages = [];
+    }
+    signatureModel = null;
+    if (this.model.successResponse) {
+      successResponse = this.model.successResponse;
+      for (key in successResponse) {
+        value = successResponse[key];
+        this.model.successCode = key;
+        if (typeof value === 'object' && typeof value.createJSONSample === 'function') {
+          signatureModel = {
+            sampleJSON: JSON.stringify(value.createJSONSample(), void 0, 2),
+            isParam: false,
+            signature: value.getMockSignature()
+          };
+        }
+      }
+    } else if (this.model.responseClassSignature && this.model.responseClassSignature !== 'string') {
+      signatureModel = {
+        sampleJSON: this.model.responseSampleJSON,
+        isParam: false,
+        signature: this.model.responseClassSignature
+      };
+    }
+    $(this.el).html(Handlebars.templates.operation(this.model));
+    if (signatureModel) {
+      responseSignatureView = new SignatureView({
+        model: signatureModel,
+        tagName: 'div'
+      });
+      $('.model-signature', $(this.el)).append(responseSignatureView.render().el);
+    } else {
+      this.model.responseClassSignature = 'string';
+      $('.model-signature', $(this.el)).html(this.model.type);
+    }
+    contentTypeModel = {
+      isParam: false
+    };
+    contentTypeModel.consumes = this.model.consumes;
+    contentTypeModel.produces = this.model.produces;
+    _ref2 = this.model.parameters;
+    for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
+      param = _ref2[_k];
+      type = param.type || param.dataType || '';
+      if (typeof type === 'undefined') {
+        schema = param.schema;
+        if (schema && schema['$ref']) {
+          ref = schema['$ref'];
+          if (ref.indexOf('#/definitions/') === 0) {
+            type = ref.substring('#/definitions/'.length);
+          } else {
+            type = ref;
+          }
+        }
+      }
+      if (type && type.toLowerCase() === 'file') {
+        if (!contentTypeModel.consumes) {
+          contentTypeModel.consumes = 'multipart/form-data';
+        }
+      }
+      param.type = type;
+    }
+    responseContentTypeView = new ResponseContentTypeView({
+      model: contentTypeModel
+    });
+    $('.response-content-type', $(this.el)).append(responseContentTypeView.render().el);
+    _ref3 = this.model.parameters;
+    for (_l = 0, _len3 = _ref3.length; _l < _len3; _l++) {
+      param = _ref3[_l];
+      this.addParameter(param, contentTypeModel.consumes);
+    }
+    _ref4 = this.model.responseMessages;
+    for (_m = 0, _len4 = _ref4.length; _m < _len4; _m++) {
+      statusCode = _ref4[_m];
+      this.addStatusCode(statusCode);
+    }
+    return this;
+  };
+
+  OperationView.prototype.addParameter = function(param, consumes) {
+    var paramView;
+    param.consumes = consumes;
+    paramView = new ParameterView({
+      model: param,
+      tagName: 'tr',
+      readOnly: this.model.isReadOnly
+    });
+    return $('.operation-params', $(this.el)).append(paramView.render().el);
+  };
+
+  OperationView.prototype.addStatusCode = function(statusCode) {
+    var statusCodeView;
+    statusCodeView = new StatusCodeView({
+      model: statusCode,
+      tagName: 'tr'
+    });
+    return $('.operation-status', $(this.el)).append(statusCodeView.render().el);
+  };
+
+  OperationView.prototype.submitOperation = function(e) {
+    var error_free, form, isFileUpload, map, o, opts, val, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2;
+    if (e != null) {
+      e.preventDefault();
+    }
+    form = $('.sandbox', $(this.el));
+    error_free = true;
+    form.find("input.required").each(function() {
+      $(this).removeClass("error");
+      if (jQuery.trim($(this).val()) === "") {
+        $(this).addClass("error");
+        $(this).wiggle({
+          callback: (function(_this) {
+            return function() {
+              return $(_this).focus();
+            };
+          })(this)
+        });
+        return error_free = false;
+      }
+    });
+    form.find("textarea.required").each(function() {
+      $(this).removeClass("error");
+      if (jQuery.trim($(this).val()) === "") {
+        $(this).addClass("error");
+        $(this).wiggle({
+          callback: (function(_this) {
+            return function() {
+              return $(_this).focus();
+            };
+          })(this)
+        });
+        return error_free = false;
+      }
+    });
+    if (error_free) {
+      map = {};
+      opts = {
+        parent: this
+      };
+      isFileUpload = false;
+      _ref = form.find("input");
+      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+        o = _ref[_i];
+        if ((o.value != null) && jQuery.trim(o.value).length > 0) {
+          map[o.name] = o.value;
+        }
+        if (o.type === "file") {
+          isFileUpload = true;
+        }
+      }
+      _ref1 = form.find("textarea");
+      for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
+        o = _ref1[_j];
+        if ((o.value != null) && jQuery.trim(o.value).length > 0) {
+          map[o.name] = o.value;
+        }
+      }
+      _ref2 = form.find("select");
+      for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
+        o = _ref2[_k];
+        val = this.getSelectedValue(o);
+        if ((val != null) && jQuery.trim(val).length > 0) {
+          map[o.name] = val;
+        }
+      }
+      opts.responseContentType = $("div select[name=responseContentType]", $(this.el)).val();
+      opts.requestContentType = $("div select[name=parameterContentType]", $(this.el)).val();
+      $(".response_throbber", $(this.el)).show();
+      if (isFileUpload) {
+        return this.handleFileUpload(map, form);
+      } else {
+        return this.model["do"](map, opts, this.showCompleteStatus, this.showErrorStatus, this);
+      }
+    }
+  };
+
+  OperationView.prototype.success = function(response, parent) {
+    return parent.showCompleteStatus(response);
+  };
+
+  OperationView.prototype.handleFileUpload = function(map, form) {
+    var bodyParam, el, headerParams, o, obj, param, params, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _ref3;
+    _ref = form.serializeArray();
+    for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+      o = _ref[_i];
+      if ((o.value != null) && jQuery.trim(o.value).length > 0) {
+        map[o.name] = o.value;
+      }
+    }
+    bodyParam = new FormData();
+    params = 0;
+    _ref1 = this.model.parameters;
+    for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
+      param = _ref1[_j];
+      if (param.paramType === 'form') {
+        if (param.type.toLowerCase() !== 'file' && map[param.name] !== void 0) {
+          bodyParam.append(param.name, map[param.name]);
+        }
+      }
+    }
+    headerParams = {};
+    _ref2 = this.model.parameters;
+    for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
+      param = _ref2[_k];
+      if (param.paramType === 'header') {
+        headerParams[param.name] = map[param.name];
+      }
+    }
+    _ref3 = form.find('input[type~="file"]');
+    for (_l = 0, _len3 = _ref3.length; _l < _len3; _l++) {
+      el = _ref3[_l];
+      if (typeof el.files[0] !== 'undefined') {
+        bodyParam.append($(el).attr('name'), el.files[0]);
+        params += 1;
+      }
+    }
+    this.invocationUrl = this.model.supportHeaderParams() ? (headerParams = this.model.getHeaderParams(map), delete headerParams['Content-Type'], this.model.urlify(map, false)) : this.model.urlify(map, true);
+    $(".request_url", $(this.el)).html("<pre></pre>");
+    $(".request_url pre", $(this.el)).text(this.invocationUrl);
+    obj = {
+      type: this.model.method,
+      url: this.invocationUrl,
+      headers: headerParams,
+      data: bodyParam,
+      dataType: 'json',
+      contentType: false,
+      processData: false,
+      error: (function(_this) {
+        return function(data, textStatus, error) {
+          return _this.showErrorStatus(_this.wrap(data), _this);
+        };
+      })(this),
+      success: (function(_this) {
+        return function(data) {
+          return _this.showResponse(data, _this);
+        };
+      })(this),
+      complete: (function(_this) {
+        return function(data) {
+          return _this.showCompleteStatus(_this.wrap(data), _this);
+        };
+      })(this)
+    };
+    if (window.authorizations) {
+      window.authorizations.apply(obj);
+    }
+    if (params === 0) {
+      obj.data.append("fake", "true");
+    }
+    jQuery.ajax(obj);
+    return false;
+  };
+
+  OperationView.prototype.wrap = function(data) {
+    var h, headerArray, headers, i, o, _i, _len;
+    headers = {};
+    headerArray = data.getAllResponseHeaders().split("\r");
+    for (_i = 0, _len = headerArray.length; _i < _len; _i++) {
+      i = headerArray[_i];
+      h = i.match(/^([^:]*?):(.*)$/);
+      if (!h) {
+        h = [];
+      }
+      h.shift();
+      if (h[0] !== void 0 && h[1] !== void 0) {
+        headers[h[0].trim()] = h[1].trim();
+      }
+    }
+    o = {};
+    o.content = {};
+    o.content.data = data.responseText;
+    o.headers = headers;
+    o.request = {};
+    o.request.url = this.invocationUrl;
+    o.status = data.status;
+    return o;
+  };
+
+  OperationView.prototype.getSelectedValue = function(select) {
+    var opt, options, _i, _len, _ref;
+    if (!select.multiple) {
+      return select.value;
+    } else {
+      options = [];
+      _ref = select.options;
+      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+        opt = _ref[_i];
+        if (opt.selected) {
+          options.push(opt.value);
+        }
+      }
+      if (options.length > 0) {
+        return options;
+      } else {
+        return null;
+      }
+    }
+  };
+
+  OperationView.prototype.hideResponse = function(e) {
+    if (e != null) {
+      e.preventDefault();
+    }
+    $(".response", $(this.el)).slideUp();
+    return $(".response_hider", $(this.el)).fadeOut();
+  };
+
+  OperationView.prototype.showResponse = function(response) {
+    var prettyJson;
+    prettyJson = JSON.stringify(response, null, "\t").replace(/\n/g, "<br>");
+    return $(".response_body", $(this.el)).html(escape(prettyJson));
+  };
+
+  OperationView.prototype.showErrorStatus = function(data, parent) {
+    return parent.showStatus(data);
+  };
+
+  OperationView.prototype.showCompleteStatus = function(data, parent) {
+    return parent.showStatus(data);
+  };
+
+  OperationView.prototype.formatXml = function(xml) {
+    var contexp, formatted, indent, lastType, lines, ln, pad, reg, transitions, wsexp, _fn, _i, _len;
+    reg = /(>)(<)(\/*)/g;
+    wsexp = /[ ]*(.*)[ ]+\n/g;
+    contexp = /(<.+>)(.+\n)/g;
+    xml = xml.replace(reg, '$1\n$2$3').replace(wsexp, '$1\n').replace(contexp, '$1\n$2');
+    pad = 0;
+    formatted = '';
+    lines = xml.split('\n');
+    indent = 0;
+    lastType = 'other';
+    transitions = {
+      'single->single': 0,
+      'single->closing': -1,
+      'single->opening': 0,
+      'single->other': 0,
+      'closing->single': 0,
+      'closing->closing': -1,
+      'closing->opening': 0,
+      'closing->other': 0,
+      'opening->single': 1,
+      'opening->closing': 0,
+      'opening->opening': 1,
+      'opening->other': 1,
+      'other->single': 0,
+      'other->closing': -1,
+      'other->opening': 0,
+      'other->other': 0
+    };
+    _fn = function(ln) {
+      var fromTo, j, key, padding, type, types, value;
+      types = {
+        single: Boolean(ln.match(/<.+\/>/)),
+        closing: Boolean(ln.match(/<\/.+>/)),
+        opening: Boolean(ln.match(/<[^!?].*>/))
+      };
+      type = ((function() {
+        var _results;
+        _results = [];
+        for (key in types) {
+          value = types[key];
+          if (value) {
+            _results.push(key);
+          }
+        }
+        return _results;
+      })())[0];
+      type = type === void 0 ? 'other' : type;
+      fromTo = lastType + '->' + type;
+      lastType = type;
+      padding = '';
+      indent += transitions[fromTo];
+      padding = ((function() {
+        var _j, _ref, _results;
+        _results = [];
+        for (j = _j = 0, _ref = indent; 0 <= _ref ? _j < _ref : _j > _ref; j = 0 <= _ref ? ++_j : --_j) {
+          _results.push('  ');
+        }
+        return _results;
+      })()).join('');
+      if (fromTo === 'opening->closing') {
+        return formatted = formatted.substr(0, formatted.length - 1) + ln + '\n';
+      } else {
+        return formatted += padding + ln + '\n';
+      }
+    };
+    for (_i = 0, _len = lines.length; _i < _len; _i++) {
+      ln = lines[_i];
+      _fn(ln);
+    }
+    return formatted;
+  };
+
+  OperationView.prototype.showStatus = function(response) {
+    var code, content, contentType, e, headers, json, opts, pre, response_body, response_body_el, url;
+    if (response.content === void 0) {
+      content = response.data;
+      url = response.url;
+    } else {
+      content = response.content.data;
+      url = response.request.url;
+    }
+    headers = response.headers;
+    contentType = null;
+    if (headers) {
+      contentType = headers["Content-Type"] || headers["content-type"];
+      if (contentType) {
+        contentType = contentType.split(";")[0].trim();
+      }
+    }
+    $(".response_body", $(this.el)).removeClass('json');
+    $(".response_body", $(this.el)).removeClass('xml');
+    if (!content) {
+      code = $('<code />').text("no content");
+      pre = $('<pre class="json" />').append(code);
+    } else if (contentType === "application/json" || /\+json$/.test(contentType)) {
+      json = null;
+      try {
+        json = JSON.stringify(JSON.parse(content), null, "  ");
+      } catch (_error) {
+        e = _error;
+        json = "can't parse JSON.  Raw result:\n\n" + content;
+      }
+      code = $('<code />').text(json);
+      pre = $('<pre class="json" />').append(code);
+    } else if (contentType === "application/xml" || /\+xml$/.test(contentType)) {
+      code = $('<code />').text(this.formatXml(content));
+      pre = $('<pre class="xml" />').append(code);
+    } else if (contentType === "text/html") {
+      code = $('<code />').html(_.escape(content));
+      pre = $('<pre class="xml" />').append(code);
+    } else if (/^image\//.test(contentType)) {
+      pre = $('<img>').attr('src', url);
+    } else {
+      code = $('<code />').text(content);
+      pre = $('<pre class="json" />').append(code);
+    }
+    response_body = pre;
+    $(".request_url", $(this.el)).html("<pre></pre>");
+    $(".request_url pre", $(this.el)).text(url);
+    $(".response_code", $(this.el)).html("<pre>" + response.status + "</pre>");
+    $(".response_body", $(this.el)).html(response_body);
+    $(".response_headers", $(this.el)).html("<pre>" + _.escape(JSON.stringify(response.headers, null, "  ")).replace(/\n/g, "<br>") + "</pre>");
+    $(".response", $(this.el)).slideDown();
+    $(".response_hider", $(this.el)).show();
+    $(".response_throbber", $(this.el)).hide();
+    response_body_el = $('.response_body', $(this.el))[0];
+    opts = this.options.swaggerOptions;
+    if (opts.highlightSizeThreshold && response.data.length > opts.highlightSizeThreshold) {
+      return response_body_el;
+    } else {
+      return hljs.highlightBlock(response_body_el);
+    }
+  };
+
+  OperationView.prototype.toggleOperationContent = function() {
+    var elem;
+    elem = $('#' + Docs.escapeResourceName(this.model.parentId + "_" + this.model.nickname + "_content"));
+    if (elem.is(':visible')) {
+      return Docs.collapseOperation(elem);
+    } else {
+      return Docs.expandOperation(elem);
+    }
+  };
+
+  return OperationView;
+
+})(Backbone.View);
+
+this["Handlebars"]["templates"]["param_readonly_required"] = Handlebars.template({"1":function(depth0,helpers,partials,data) {
+  var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+  return "        <textarea class='body-textarea'  readonly='readonly' placeholder='(required)' name='"
+    + escapeExpression(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"name","hash":{},"data":data}) : helper)))
+    + "'>"
+    + escapeExpression(((helper = (helper = helpers['default'] || (depth0 != null ? depth0['default'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"default","hash":{},"data":data}) : helper)))
+    + "</textarea>\n";
+},"3":function(depth0,helpers,partials,data) {
+  var stack1, buffer = "";
+  stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['default'] : depth0), {"name":"if","hash":{},"fn":this.program(4, data),"inverse":this.program(6, data),"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  return buffer;
+},"4":function(depth0,helpers,partials,data) {
+  var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+  return "            "
+    + escapeExpression(((helper = (helper = helpers['default'] || (depth0 != null ? depth0['default'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"default","hash":{},"data":data}) : helper)))
+    + "\n";
+},"6":function(depth0,helpers,partials,data) {
+  return "            (empty)\n";
+  },"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+  var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "<td class='code required'>"
+    + escapeExpression(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"name","hash":{},"data":data}) : helper)))
+    + "</td>\n<td>\n";
+  stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.isBody : depth0), {"name":"if","hash":{},"fn":this.program(1, data),"inverse":this.program(3, data),"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  buffer += "</td>\n<td class=\"markdown\">";
+  stack1 = ((helper = (helper = helpers.description || (depth0 != null ? depth0.description : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"description","hash":{},"data":data}) : helper));
+  if (stack1 != null) { buffer += stack1; }
+  buffer += "</td>\n<td>";
+  stack1 = ((helper = (helper = helpers.paramType || (depth0 != null ? depth0.paramType : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"paramType","hash":{},"data":data}) : helper));
+  if (stack1 != null) { buffer += stack1; }
+  return buffer + "</td>\n<td><span class=\"model-signature\"></span></td>\n";
+},"useData":true});
+var ParameterContentTypeView,
+  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
+  __hasProp = {}.hasOwnProperty;
+
+ParameterContentTypeView = (function(_super) {
+  __extends(ParameterContentTypeView, _super);
+
+  function ParameterContentTypeView() {
+    return ParameterContentTypeView.__super__.constructor.apply(this, arguments);
+  }
+
+  ParameterContentTypeView.prototype.initialize = function() {};
+
+  ParameterContentTypeView.prototype.render = function() {
+    var template;
+    template = this.template();
+    $(this.el).html(template(this.model));
+    $('label[for=parameterContentType]', $(this.el)).text('Parameter content type:');
+    return this;
+  };
+
+  ParameterContentTypeView.prototype.template = function() {
+    return Handlebars.templates.parameter_content_type;
+  };
+
+  return ParameterContentTypeView;
+
+})(Backbone.View);
+
+this["Handlebars"]["templates"]["param_required"] = Handlebars.template({"1":function(depth0,helpers,partials,data) {
+  var stack1, buffer = "";
+  stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.isFile : depth0), {"name":"if","hash":{},"fn":this.program(2, data),"inverse":this.program(4, data),"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  return buffer;
+},"2":function(depth0,helpers,partials,data) {
+  var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+  return "			<input type=\"file\" name='"
+    + escapeExpression(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"name","hash":{},"data":data}) : helper)))
+    + "'/>\n";
+},"4":function(depth0,helpers,partials,data) {
+  var stack1, buffer = "";
+  stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['default'] : depth0), {"name":"if","hash":{},"fn":this.program(5, data),"inverse":this.program(7, data),"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  return buffer;
+},"5":function(depth0,helpers,partials,data) {
+  var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+  return "				<textarea class='body-textarea required' placeholder='(required)' name='"
+    + escapeExpression(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"name","hash":{},"data":data}) : helper)))
+    + "'>"
+    + escapeExpression(((helper = (helper = helpers['default'] || (depth0 != null ? depth0['default'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"default","hash":{},"data":data}) : helper)))
+    + "</textarea>\n        <br />\n        <div class=\"parameter-content-type\" />\n";
+},"7":function(depth0,helpers,partials,data) {
+  var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+  return "				<textarea class='body-textarea required' placeholder='(required)' name='"
+    + escapeExpression(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"name","hash":{},"data":data}) : helper)))
+    + "'></textarea>\n				<br />\n				<div class=\"parameter-content-type\" />\n";
+},"9":function(depth0,helpers,partials,data) {
+  var stack1, buffer = "";
+  stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.isFile : depth0), {"name":"if","hash":{},"fn":this.program(10, data),"inverse":this.program(12, data),"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  return buffer;
+},"10":function(depth0,helpers,partials,data) {
+  var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+  return "			<input class='parameter' class='required' type='file' name='"
+    + escapeExpression(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"name","hash":{},"data":data}) : helper)))
+    + "'/>\n";
+},"12":function(depth0,helpers,partials,data) {
+  var stack1, buffer = "";
+  stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['default'] : depth0), {"name":"if","hash":{},"fn":this.program(13, data),"inverse":this.program(15, data),"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  return buffer;
+},"13":function(depth0,helpers,partials,data) {
+  var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+  return "				<input class='parameter required' minlength='1' name='"
+    + escapeExpression(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"name","hash":{},"data":data}) : helper)))
+    + "' placeholder='(required)' type='text' value='"
+    + escapeExpression(((helper = (helper = helpers['default'] || (depth0 != null ? depth0['default'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"default","hash":{},"data":data}) : helper)))
+    + "'/>\n";
+},"15":function(depth0,helpers,partials,data) {
+  var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+  return "				<input class='parameter required' minlength='1' name='"
+    + escapeExpression(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"name","hash":{},"data":data}) : helper)))
+    + "' placeholder='(required)' type='text' value=''/>\n";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+  var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "<td class='code required'>"
+    + escapeExpression(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"name","hash":{},"data":data}) : helper)))
+    + "</td>\n<td>\n";
+  stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.isBody : depth0), {"name":"if","hash":{},"fn":this.program(1, data),"inverse":this.program(9, data),"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  buffer += "</td>\n<td>\n	<strong><span class=\"markdown\">";
+  stack1 = ((helper = (helper = helpers.description || (depth0 != null ? depth0.description : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"description","hash":{},"data":data}) : helper));
+  if (stack1 != null) { buffer += stack1; }
+  buffer += "</span></strong>\n</td>\n<td>";
+  stack1 = ((helper = (helper = helpers.paramType || (depth0 != null ? depth0.paramType : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"paramType","hash":{},"data":data}) : helper));
+  if (stack1 != null) { buffer += stack1; }
+  return buffer + "</td>\n<td><span class=\"model-signature\"></span></td>\n";
+},"useData":true});
+var ParameterView,
+  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
+  __hasProp = {}.hasOwnProperty;
+
+ParameterView = (function(_super) {
+  __extends(ParameterView, _super);
+
+  function ParameterView() {
+    return ParameterView.__super__.constructor.apply(this, arguments);
+  }
+
+  ParameterView.prototype.initialize = function() {
+    return Handlebars.registerHelper('isArray', function(param, opts) {
+      if (param.type.toLowerCase() === 'array' || param.allowMultiple) {
+        return opts.fn(this);
+      } else {
+        return opts.inverse(this);
+      }
+    });
+  };
+
+  ParameterView.prototype.render = function() {
+    var contentTypeModel, isParam, parameterContentTypeView, ref, responseContentTypeView, schema, signatureModel, signatureView, template, type;
+    type = this.model.type || this.model.dataType;
+    if (typeof type === 'undefined') {
+      schema = this.model.schema;
+      if (schema && schema['$ref']) {
+        ref = schema['$ref'];
+        if (ref.indexOf('#/definitions/') === 0) {
+          type = ref.substring('#/definitions/'.length);
+        } else {
+          type = ref;
+        }
+      }
+    }
+    this.model.type = type;
+    this.model.paramType = this.model["in"] || this.model.paramType;
+    if (this.model.paramType === 'body' || this.model["in"] === 'body') {
+      this.model.isBody = true;
+    }
+    if (type && type.toLowerCase() === 'file') {
+      this.model.isFile = true;
+    }
+    this.model["default"] = this.model["default"] || this.model.defaultValue;
+    if (this.model.allowableValues) {
+      this.model.isList = true;
+    }
+    template = this.template();
+    $(this.el).html(template(this.model));
+    signatureModel = {
+      sampleJSON: this.model.sampleJSON,
+      isParam: true,
+      signature: this.model.signature
+    };
+    if (this.model.sampleJSON) {
+      signatureView = new SignatureView({
+        model: signatureModel,
+        tagName: 'div'
+      });
+      $('.model-signature', $(this.el)).append(signatureView.render().el);
+    } else {
+      $('.model-signature', $(this.el)).html(this.model.signature);
+    }
+    isParam = false;
+    if (this.model.isBody) {
+      isParam = true;
+    }
+    contentTypeModel = {
+      isParam: isParam
+    };
+    contentTypeModel.consumes = this.model.consumes;
+    if (isParam) {
+      parameterContentTypeView = new ParameterContentTypeView({
+        model: contentTypeModel
+      });
+      $('.parameter-content-type', $(this.el)).append(parameterContentTypeView.render().el);
+    } else {
+      responseContentTypeView = new ResponseContentTypeView({
+        model: contentTypeModel
+      });
+      $('.response-content-type', $(this.el)).append(responseContentTypeView.render().el);
+    }
+    return this;
+  };
+
+  ParameterView.prototype.template = function() {
+    if (this.model.isList) {
+      return Handlebars.templates.param_list;
+    } else {
+      if (this.options.readOnly) {
+        if (this.model.required) {
+          return Handlebars.templates.param_readonly_required;
+        } else {
+          return Handlebars.templates.param_readonly;
+        }
+      } else {
+        if (this.model.required) {
+          return Handlebars.templates.param_required;
+        } else {
+          return Handlebars.templates.param;
+        }
+      }
+    }
+  };
+
+  return ParameterView;
+
+})(Backbone.View);
+
+this["Handlebars"]["templates"]["parameter_content_type"] = Handlebars.template({"1":function(depth0,helpers,partials,data) {
+  var stack1, buffer = "";
+  stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.consumes : depth0), {"name":"each","hash":{},"fn":this.program(2, data),"inverse":this.noop,"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  return buffer;
+},"2":function(depth0,helpers,partials,data) {
+  var stack1, lambda=this.lambda, buffer = "  <option value=\"";
+  stack1 = lambda(depth0, depth0);
+  if (stack1 != null) { buffer += stack1; }
+  buffer += "\">";
+  stack1 = lambda(depth0, depth0);
+  if (stack1 != null) { buffer += stack1; }
+  return buffer + "</option>\n";
+},"4":function(depth0,helpers,partials,data) {
+  return "  <option value=\"application/json\">application/json</option>\n";
+  },"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+  var stack1, buffer = "<label for=\"parameterContentType\"></label>\n<select name=\"parameterContentType\">\n";
+  stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.consumes : depth0), {"name":"if","hash":{},"fn":this.program(1, data),"inverse":this.program(4, data),"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  return buffer + "</select>\n";
+},"useData":true});
+var ResourceView,
+  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
+  __hasProp = {}.hasOwnProperty;
+
+ResourceView = (function(_super) {
+  __extends(ResourceView, _super);
+
+  function ResourceView() {
+    return ResourceView.__super__.constructor.apply(this, arguments);
+  }
+
+  ResourceView.prototype.initialize = function(opts) {
+    if (opts == null) {
+      opts = {};
+    }
+    this.auths = opts.auths;
+    if ("" === this.model.description) {
+      return this.model.description = null;
+    }
+  };
+
+  ResourceView.prototype.render = function() {
+    var counter, id, methods, operation, _i, _len, _ref;
+    $(this.el).html(Handlebars.templates.resource(this.model));
+    methods = {};
+    if (this.model.description) {
+      this.model.summary = this.model.description;
+    }
+
+    // Sort the operations by path and method (get/post).
+    _ref = _.sortBy(this.model.operationsArray, function(operation) { return [operation.path, operation.method];});
+    for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+      operation = _ref[_i];
+      counter = 0;
+      id = operation.nickname;
+      while (typeof methods[id] !== 'undefined') {
+        id = id + "_" + counter;
+        counter += 1;
+      }
+      methods[id] = operation;
+      operation.nickname = id;
+      operation.parentId = this.model.id;
+      this.addOperation(operation);
+    }
+    $('.toggleEndpointList', this.el).click(this.callDocs.bind(this, 'toggleEndpointListForResource'));
+    $('.collapseResource', this.el).click(this.callDocs.bind(this, 'collapseOperationsForResource'));
+    $('.expandResource', this.el).click(this.callDocs.bind(this, 'expandOperationsForResource'));
+    return this;
+  };
+
+  ResourceView.prototype.addOperation = function(operation) {
+    var operationView;
+    operation.number = this.number;
+    operationView = new OperationView({
+      model: operation,
+      tagName: 'li',
+      className: 'endpoint',
+      swaggerOptions: this.options.swaggerOptions,
+      auths: this.auths
+    });
+    $('.endpoints', $(this.el)).append(operationView.render().el);
+    return this.number++;
+  };
+
+  ResourceView.prototype.callDocs = function(fnName, e) {
+    e.preventDefault();
+    return Docs[fnName](e.currentTarget.getAttribute('data-id'));
+  };
+
+  return ResourceView;
+
+})(Backbone.View);
+
+this["Handlebars"]["templates"]["resource"] = Handlebars.template({"1":function(depth0,helpers,partials,data) {
+  return " : ";
+  },"3":function(depth0,helpers,partials,data) {
+  var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
+  return "<li>\n      <a href='"
+    + escapeExpression(((helper = (helper = helpers.url || (depth0 != null ? depth0.url : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"url","hash":{},"data":data}) : helper)))
+    + "'>Raw</a>\n    </li>";
+},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+  var stack1, helper, options, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, blockHelperMissing=helpers.blockHelperMissing, buffer = "<div class='heading'>\n  <h2>\n    <a href='#!/"
+    + escapeExpression(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"id","hash":{},"data":data}) : helper)))
+    + "' class=\"toggleEndpointList\" data-id=\""
+    + escapeExpression(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"id","hash":{},"data":data}) : helper)))
+    + "\">"
+    + escapeExpression(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"name","hash":{},"data":data}) : helper)))
+    + "</a> ";
+  stack1 = ((helper = (helper = helpers.summary || (depth0 != null ? depth0.summary : depth0)) != null ? helper : helperMissing),(options={"name":"summary","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data}),(typeof helper === functionType ? helper.call(depth0, options) : helper));
+  if (!helpers.summary) { stack1 = blockHelperMissing.call(depth0, stack1, options); }
+  if (stack1 != null) { buffer += stack1; }
+  stack1 = ((helper = (helper = helpers.summary || (depth0 != null ? depth0.summary : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"summary","hash":{},"data":data}) : helper));
+  if (stack1 != null) { buffer += stack1; }
+  buffer += "\n  </h2>\n  <ul class='options'>\n    <li>\n      <a href='#!/"
+    + escapeExpression(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"id","hash":{},"data":data}) : helper)))
+    + "' id='endpointListTogger_"
+    + escapeExpression(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"id","hash":{},"data":data}) : helper)))
+    + "' class=\"toggleEndpointList\" data-id=\""
+    + escapeExpression(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"id","hash":{},"data":data}) : helper)))
+    + "\">Show/Hide</a>\n    </li>\n    <li>\n      <a href='#' class=\"collapseResource\" data-id=\""
+    + escapeExpression(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"id","hash":{},"data":data}) : helper)))
+    + "\">\n        List Operations\n      </a>\n    </li>\n    <li>\n      <a href='#' class=\"expandResource\" data-id=\""
+    + escapeExpression(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"id","hash":{},"data":data}) : helper)))
+    + "\">\n        Expand Operations\n      </a>\n    </li>\n    ";
+  stack1 = ((helper = (helper = helpers.url || (depth0 != null ? depth0.url : depth0)) != null ? helper : helperMissing),(options={"name":"url","hash":{},"fn":this.program(3, data),"inverse":this.noop,"data":data}),(typeof helper === functionType ? helper.call(depth0, options) : helper));
+  if (!helpers.url) { stack1 = blockHelperMissing.call(depth0, stack1, options); }
+  if (stack1 != null) { buffer += stack1; }
+  return buffer + "\n  </ul>\n</div>\n<ul class='endpoints' id='"
+    + escapeExpression(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"id","hash":{},"data":data}) : helper)))
+    + "_endpoint_list' style='display:none'>\n\n</ul>\n";
+},"useData":true});
+var ResponseContentTypeView,
+  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
+  __hasProp = {}.hasOwnProperty;
+
+ResponseContentTypeView = (function(_super) {
+  __extends(ResponseContentTypeView, _super);
+
+  function ResponseContentTypeView() {
+    return ResponseContentTypeView.__super__.constructor.apply(this, arguments);
+  }
+
+  ResponseContentTypeView.prototype.initialize = function() {};
+
+  ResponseContentTypeView.prototype.render = function() {
+    var template;
+    template = this.template();
+    $(this.el).html(template(this.model));
+    $('label[for=responseContentType]', $(this.el)).text('Response Content Type');
+    return this;
+  };
+
+  ResponseContentTypeView.prototype.template = function() {
+    return Handlebars.templates.response_content_type;
+  };
+
+  return ResponseContentTypeView;
+
+})(Backbone.View);
+
+this["Handlebars"]["templates"]["response_content_type"] = Handlebars.template({"1":function(depth0,helpers,partials,data) {
+  var stack1, buffer = "";
+  stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.produces : depth0), {"name":"each","hash":{},"fn":this.program(2, data),"inverse":this.noop,"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  return buffer;
+},"2":function(depth0,helpers,partials,data) {
+  var stack1, lambda=this.lambda, buffer = "  <option value=\"";
+  stack1 = lambda(depth0, depth0);
+  if (stack1 != null) { buffer += stack1; }
+  buffer += "\">";
+  stack1 = lambda(depth0, depth0);
+  if (stack1 != null) { buffer += stack1; }
+  return buffer + "</option>\n";
+},"4":function(depth0,helpers,partials,data) {
+  return "  <option value=\"application/json\">application/json</option>\n";
+  },"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+  var stack1, buffer = "<label for=\"responseContentType\"></label>\n<select name=\"responseContentType\">\n";
+  stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.produces : depth0), {"name":"if","hash":{},"fn":this.program(1, data),"inverse":this.program(4, data),"data":data});
+  if (stack1 != null) { buffer += stack1; }
+  return buffer + "</select>\n";
+},"useData":true});
+var SignatureView,
+  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
+  __hasProp = {}.hasOwnProperty;
+
+SignatureView = (function(_super) {
+  __extends(SignatureView, _super);
+
+  function SignatureView() {
+    return SignatureView.__super__.constructor.apply(this, arguments);
+  }
+
+  SignatureView.prototype.events = {
+    'click a.description-link': 'switchToDescription',
+    'click a.snippet-link': 'switchToSnippet',
+    'mousedown .snippet': 'snippetToTextArea'
+  };
+
+  SignatureView.prototype.initialize = function() {};
+
+  SignatureView.prototype.render = function() {
+    var template;
+    template = this.template();
+    $(this.el).html(template(this.model));
+    this.switchToSnippet();
+    this.isParam = this.model.isParam;
+    if (this.isParam) {
+      $('.notice', $(this.el)).text('Click to set as parameter value');
+    }
+    return this;
+  };
+
+  SignatureView.prototype.template = function() {
+    return Handlebars.templates.signature;
+  };
+
+  SignatureView.prototype.switchToDescription = function(e) {
+    if (e != null) {
+      e.preventDefault();
+    }
+    $(".snippet", $(this.el)).hide();
+    $(".description", $(this.el)).show();
+    $('.description-link', $(this.el)).addClass('selected');
+    return $('.snippet-link', $(this.el)).removeClass('selected');
+  };
+
+  SignatureView.prototype.switchToSnippet = function(e) {
+    if (e != null) {
+      e.preventDefault();
+    }
+    $(".description", $(this.el)).hide();
+    $(".snippet", $(this.el)).show();
+    $('.snippet-link', $(this.el)).addClass('selected');
+    return $('.description-link', $(this.el)).removeClass('selected');
+  };
+
+  SignatureView.prototype.snippetToTextArea = function(e) {
+    var textArea;
+    if (this.isParam) {
+      if (e != null) {
+        e.preventDefault();
+      }
+      textArea = $('textarea', $(this.el.parentNode.parentNode.parentNode));
+      if ($.trim(textArea.val()) === '') {
+        return textArea.val(this.model.sampleJSON);
+      }
+    }
+  };
+
+  return SignatureView;
+
+})(Backbone.View);
+
+this["Handlebars"]["templates"]["signature"] = Handlebars.template({"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+  var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "<div>\n<ul class=\"signature-nav\">\n  <li><a class=\"description-link\" href=\"#\">Model</a></li>\n  <li><a class=\"snippet-link\" href=\"#\">Model Schema</a></li>\n</ul>\n<div>\n\n<div class=\"signature-container\">\n  <div class=\"description\">\n    ";
+  stack1 = ((helper = (helper = helpers.signature || (depth0 != null ? depth0.signature : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"signature","hash":{},"data":data}) : helper));
+  if (stack1 != null) { buffer += stack1; }
+  return buffer + "\n  </div>\n\n  <div class=\"snippet\">\n    <pre><code>"
+    + escapeExpression(((helper = (helper = helpers.sampleJSON || (depth0 != null ? depth0.sampleJSON : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"sampleJSON","hash":{},"data":data}) : helper)))
+    + "</code></pre>\n    <small class=\"notice\"></small>\n  </div>\n</div>\n\n";
+},"useData":true});
+var StatusCodeView,
+  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
+  __hasProp = {}.hasOwnProperty;
+
+StatusCodeView = (function(_super) {
+  __extends(StatusCodeView, _super);
+
+  function StatusCodeView() {
+    return StatusCodeView.__super__.constructor.apply(this, arguments);
+  }
+
+  StatusCodeView.prototype.initialize = function() {};
+
+  StatusCodeView.prototype.render = function() {
+    var responseModel, responseModelView, template;
+    template = this.template();
+    $(this.el).html(template(this.model));
+    if (swaggerUi.api.models.hasOwnProperty(this.model.responseModel)) {
+      responseModel = {
+        sampleJSON: JSON.stringify(swaggerUi.api.models[this.model.responseModel].createJSONSample(), null, 2),
+        isParam: false,
+        signature: swaggerUi.api.models[this.model.responseModel].getMockSignature()
+      };
+      responseModelView = new SignatureView({
+        model: responseModel,
+        tagName: 'div'
+      });
+      $('.model-signature', this.$el).append(responseModelView.render().el);
+    } else {
+      $('.model-signature', this.$el).html('');
+    }
+    return this;
+  };
+
+  StatusCodeView.prototype.template = function() {
+    return Handlebars.templates.status_code;
+  };
+
+  return StatusCodeView;
+
+})(Backbone.View);
+
+this["Handlebars"]["templates"]["status_code"] = Handlebars.template({"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
+  var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "<td width='15%' class='code'>"
+    + escapeExpression(((helper = (helper = helpers.code || (depth0 != null ? depth0.code : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"code","hash":{},"data":data}) : helper)))
+    + "</td>\n<td>";
+  stack1 = ((helper = (helper = helpers.message || (depth0 != null ? depth0.message : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"message","hash":{},"data":data}) : helper));
+  if (stack1 != null) { buffer += stack1; }
+  return buffer + "</td>\n<td width='50%'><span class=\"model-signature\" /></td>";
+},"useData":true});
+`)
+
+func third_partySwaggerUiSwaggerUiJsBytes() ([]byte, error) {
+	return _third_partySwaggerUiSwaggerUiJs, nil
+}
+
+func third_partySwaggerUiSwaggerUiJs() (*asset, error) {
+	bytes, err := third_partySwaggerUiSwaggerUiJsBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/swagger-ui.js", size: 110246, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+var _third_partySwaggerUiSwaggerUiMinJs = []byte(`function clippyCopiedCallback(){$("#api_key_copied").fadeIn().delay(1e3).fadeOut()}$(function(){$.fn.vAlign=function(){return this.each(function(){var e=$(this).height(),t=$(this).parent().height(),n=(t-e)/2;$(this).css("margin-top",n)})},$.fn.stretchFormtasticInputWidthToParent=function(){return this.each(function(){var e=$(this).closest("form").innerWidth(),t=parseInt($(this).closest("form").css("padding-left"),10)+parseInt($(this).closest("form").css("padding-right"),10),n=parseInt($(this).css("padding-left"),10)+parseInt($(this).css("padding-right"),10);$(this).css("width",e-t-n)})},$("form.formtastic li.string input, form.formtastic textarea").stretchFormtasticInputWidthToParent(),$("ul.downplayed li div.content p").vAlign(),$("form.sandbox").submit(function(){var e=!0;return $(this).find("input.required").each(function(){$(this).removeClass("error"),""==$(this).val()&&($(this).addClass("error"),$(this).wiggle(),e=!1)}),e})}),log=function(){log.history=log.history||[],log.history.push(arguments),this.console&&console.log(Array.prototype.slice.call(arguments)[0])},Function.prototype.bind&&console&&"object"==typeof console.log&&["log","info","warn","error","assert","dir","clear","profile","profileEnd"].forEach(function(e){console[e]=this.bind(console[e],console)},Function.prototype.call);var Docs={shebang:function(){var e=$.param.fragment().split("/");switch(e.shift(),e.length){case 1:var t="resource_"+e[0];Docs.expandEndpointListForResource(e[0]),$("#"+t).slideto({highlight:!1});break;case 2:Docs.expandEndpointListForResource(e[0]),$("#"+t).slideto({highlight:!1});var n=e.join("_"),a=n+"_content";Docs.expandOperation($("#"+a)),$("#"+n).slideto({highlight:!1})}},toggleEndpointListForResource:function(e){var t=$("li#resource_"+Docs.escapeResourceName(e)+" ul.endpoints");t.is(":visible")?Docs.collapseEndpointListForResource(e):Docs.expandEndpointListForResource(e)},expandEndpointListForResource:function(e){var e=Docs.escapeResourceName(e);if(""==e)return void $(".resource ul.endpoints").slideDown();$("li#resource_"+e).addClass("active");var t=$("li#resource_"+e+" ul.endpoints");t.slideDown()},collapseEndpointListForResource:function(e){var e=Docs.escapeResourceName(e);if(""==e)return void $(".resource ul.endpoints").slideUp();$("li#resource_"+e).removeClass("active");var t=$("li#resource_"+e+" ul.endpoints");t.slideUp()},expandOperationsForResource:function(e){return Docs.expandEndpointListForResource(e),""==e?void $(".resource ul.endpoints li.operation div.content").slideDown():void $("li#resource_"+Docs.escapeResourceName(e)+" li.operation div.content").each(function(){Docs.expandOperation($(this))})},collapseOperationsForResource:function(e){return Docs.expandEndpointListForResource(e),""==e?void $(".resource ul.endpoints li.operation div.content").slideUp():void $("li#resource_"+Docs.escapeResourceName(e)+" li.operation div.content").each(function(){Docs.collapseOperation($(this))})},escapeResourceName:function(e){return e.replace(/[!"#$%&'()*+,.\/:;<=>?@\[\\\]\^` + "`" + `{|}~]/g,"\\$&")},expandOperation:function(e){e.slideDown()},collapseOperation:function(e){e.slideUp()}},SwaggerUi,__extends=function(e,t){function n(){this.constructor=e}for(var a in t)__hasProp.call(t,a)&&(e[a]=t[a]);return n.prototype=t.prototype,e.prototype=new n,e.__super__=t.prototype,e},__hasProp={}.hasOwnProperty;SwaggerUi=function(e){function t(){return t.__super__.constructor.apply(this,arguments)}return __extends(t,e),t.prototype.dom_id="swagger_ui",t.prototype.options=null,t.prototype.api=null,t.prototype.headerView=null,t.prototype.mainView=null,t.prototype.initialize=function(e){return null==e&&(e={}),null!=e.dom_id&&(this.dom_id=e.dom_id,delete e.dom_id),null==e.supportedSubmitMethods&&(e.supportedSubmitMethods=["get","put","post","delete","head","options","patch"]),null==$("#"+this.dom_id)&&$("body").append('<div id="'+this.dom_id+'"></div>'),this.options=e,this.options.success=function(e){return function(){return e.render()}}(this),this.options.progress=function(e){return function(t){return e.showMessage(t)}}(this),this.options.failure=function(e){return function(t){return e.onLoadFailure(t)}}(this),this.headerView=new HeaderView({el:$("#header")}),this.headerView.on("update-swagger-ui",function(e){return function(t){return e.updateSwaggerUi(t)}}(this))},t.prototype.setOption=function(e,t){return this.options[e]=t},t.prototype.getOption=function(e){return this.options[e]},t.prototype.updateSwaggerUi=function(e){return this.options.url=e.url,this.load()},t.prototype.load=function(){var e,t;return null!=(t=this.mainView)&&t.clear(),e=this.options.url,e&&0!==e.indexOf("http")&&(e=this.buildUrl(window.location.href.toString(),e)),this.options.url=e,this.headerView.update(e),this.api=new SwaggerClient(this.options),this.api.build()},t.prototype.collapseAll=function(){return Docs.collapseEndpointListForResource("")},t.prototype.listAll=function(){return Docs.collapseOperationsForResource("")},t.prototype.expandAll=function(){return Docs.expandOperationsForResource("")},t.prototype.render=function(){switch(this.showMessage("Finished Loading Resource Information. Rendering Swagger UI..."),this.mainView=new MainView({model:this.api,el:$("#"+this.dom_id),swaggerOptions:this.options}).render(),this.showMessage(),this.options.docExpansion){case"full":this.expandAll();break;case"list":this.listAll()}return this.renderGFM(),this.options.onComplete&&this.options.onComplete(this.api,this),setTimeout(function(){return function(){return Docs.shebang()}}(this),400)},t.prototype.buildUrl=function(e,t){var n,a;return 0===t.indexOf("/")?(a=e.split("/"),e=a[0]+"//"+a[2],e+t):(n=e.length,e.indexOf("?")>-1&&(n=Math.min(n,e.indexOf("?"))),e.indexOf("#")>-1&&(n=Math.min(n,e.indexOf("#"))),e=e.substring(0,n),-1!==e.indexOf("/",e.length-1)?e+t:e+"/"+t)},t.prototype.showMessage=function(e){return null==e&&(e=""),$("#message-bar").removeClass("message-fail"),$("#message-bar").addClass("message-success"),$("#message-bar").html(e)},t.prototype.onLoadFailure=function(e){var t;return null==e&&(e=""),$("#message-bar").removeClass("message-success"),$("#message-bar").addClass("message-fail"),t=$("#message-bar").html(e),null!=this.options.onFailure&&this.options.onFailure(e),t},t.prototype.renderGFM=function(e){return null==e&&(e=""),$(".markdown").each(function(){return $(this).html(marked($(this).html()))})},t}(Backbone.Router),window.SwaggerUi=SwaggerUi,this.Handlebars=this.Handlebars||{},this.Handlebars.templates=this.Handlebars.templates||{},this.Handlebars.templates.apikey_button_view=Handlebars.template({compiler:[6,">= 2.0.0-beta.1"],main:function(e,t,n,a){var s,i="function",r=t.helperMissing,l=this.escapeExpression;return"<!--div class='auth_button' id='apikey_button'><img class='auth_icon' alt='apply api key' src='images/apikey.jpeg'></div-->\n<div class='auth_container' id='apikey_container'>\n  <div class='key_input_container'>\n    <div class='auth_label'>"+l((s=null!=(s=t.keyName||(null!=e?e.keyName:e))?s:r,typeof s===i?s.call(e,{name:"keyName",hash:{},data:a}):s))+'</div>\n    <input placeholder="api_key" class="auth_input" id="input_apiKey_entry" name="apiKey" type="text"/>\n    <div class=\'auth_submit\'><a class=\'auth_submit_button\' id="apply_api_key" href="#">apply</a></div>\n  </div>\n</div>\n\n'},useData:!0}),Handlebars.registerHelper("sanitize",function(e){return e=e.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,""),new Handlebars.SafeString(e)}),this.Handlebars.templates.basic_auth_button_view=Handlebars.template({compiler:[6,">= 2.0.0-beta.1"],main:function(){return'<div class=\'auth_button\' id=\'basic_auth_button\'><img class=\'auth_icon\' src=\'images/password.jpeg\'></div>\n<div class=\'auth_container\' id=\'basic_auth_container\'>\n  <div class=\'key_input_container\'>\n    <div class="auth_label">Username</div>\n    <input placeholder="username" class="auth_input" id="input_username" name="username" type="text"/>\n    <div class="auth_label">Password</div>\n    <input placeholder="password" class="auth_input" id="input_password" name="password" type="password"/>\n    <div class=\'auth_submit\'><a class=\'auth_submit_button\' id="apply_basic_auth" href="#">apply</a></div>\n  </div>\n</div>\n\n'},useData:!0});var ApiKeyButton,__extends=function(e,t){function n(){this.constructor=e}for(var a in t)__hasProp.call(t,a)&&(e[a]=t[a]);return n.prototype=t.prototype,e.prototype=new n,e.__super__=t.prototype,e},__hasProp={}.hasOwnProperty;ApiKeyButton=function(e){function t(){return t.__super__.constructor.apply(this,arguments)}return __extends(t,e),t.prototype.initialize=function(){},t.prototype.render=function(){var e;return e=this.template(),$(this.el).html(e(this.model)),this},t.prototype.events={"click #apikey_button":"toggleApiKeyContainer","click #apply_api_key":"applyApiKey"},t.prototype.applyApiKey=function(){var e;return window.authorizations.add(this.model.name,new ApiKeyAuthorization(this.model.name,$("#input_apiKey_entry").val(),this.model["in"])),window.swaggerUi.load(),e=$("#apikey_container").show()},t.prototype.toggleApiKeyContainer=function(){var e;return $("#apikey_container").length>0?(e=$("#apikey_container").first(),e.is(":visible")?e.hide():($(".auth_container").hide(),e.show())):void 0},t.prototype.template=function(){return Handlebars.templates.apikey_button_view},t}(Backbone.View),this.Handlebars.templates.content_type=Handlebars.template({1:function(e,t,n,a){var s,i="";return s=t.each.call(e,null!=e?e.produces:e,{name:"each",hash:{},fn:this.program(2,a),inverse:this.noop,data:a}),null!=s&&(i+=s),i},2:function(e){var t,n=this.lambda,a='	<option value="';return t=n(e,e),null!=t&&(a+=t),a+='">',t=n(e,e),null!=t&&(a+=t),a+"</option>\n"},4:function(){return'  <option value="application/json">application/json</option>\n'},compiler:[6,">= 2.0.0-beta.1"],main:function(e,t,n,a){var s,i='<label for="contentType"></label>\n<select name="contentType">\n';return s=t["if"].call(e,null!=e?e.produces:e,{name:"if",hash:{},fn:this.program(1,a),inverse:this.program(4,a),data:a}),null!=s&&(i+=s),i+"</select>\n"},useData:!0});var BasicAuthButton,__extends=function(e,t){function n(){this.constructor=e}for(var a in t)__hasProp.call(t,a)&&(e[a]=t[a]);return n.prototype=t.prototype,e.prototype=new n,e.__super__=t.prototype,e},__hasProp={}.hasOwnProperty;BasicAuthButton=function(e){function t(){return t.__super__.constructor.apply(this,arguments)}return __extends(t,e),t.prototype.initialize=function(){},t.prototype.render=function(){var e;return e=this.template(),$(this.el).html(e(this.model)),this},t.prototype.events={"click #basic_auth_button":"togglePasswordContainer","click #apply_basic_auth":"applyPassword"},t.prototype.applyPassword=function(){var e,t,n;return n=$(".input_username").val(),t=$(".input_password").val(),window.authorizations.add(this.model.type,new PasswordAuthorization("basic",n,t)),window.swaggerUi.load(),e=$("#basic_auth_container").hide()},t.prototype.togglePasswordContainer=function(){var e;return $("#basic_auth_container").length>0?(e=$("#basic_auth_container").show(),e.is(":visible")?e.slideUp():($(".auth_container").hide(),e.show())):void 0},t.prototype.template=function(){return Handlebars.templates.basic_auth_button_view},t}(Backbone.View),this.Handlebars.templates.main=Handlebars.template({1:function(e,t,n,a){var s,i=this.lambda,r=this.escapeExpression,l='  <div class="info_title">'+r(i(null!=(s=null!=e?e.info:e)?s.title:s,e))+'</div>\n  <div class="info_description markdown">';return s=i(null!=(s=null!=e?e.info:e)?s.description:s,e),null!=s&&(l+=s),l+="</div>\n  ",s=t["if"].call(e,null!=(s=null!=e?e.info:e)?s.termsOfServiceUrl:s,{name:"if",hash:{},fn:this.program(2,a),inverse:this.noop,data:a}),null!=s&&(l+=s),l+="\n  ",s=t["if"].call(e,null!=(s=null!=(s=null!=e?e.info:e)?s.contact:s)?s.name:s,{name:"if",hash:{},fn:this.program(4,a),inverse:this.noop,data:a}),null!=s&&(l+=s),l+="\n  ",s=t["if"].call(e,null!=(s=null!=(s=null!=e?e.info:e)?s.contact:s)?s.url:s,{name:"if",hash:{},fn:this.program(6,a),inverse:this.noop,data:a}),null!=s&&(l+=s),l+="\n  ",s=t["if"].call(e,null!=(s=null!=(s=null!=e?e.info:e)?s.contact:s)?s.email:s,{name:"if",hash:{},fn:this.program(8,a),inverse:this.noop,data:a}),null!=s&&(l+=s),l+="\n  ",s=t["if"].call(e,null!=(s=null!=e?e.info:e)?s.license:s,{name:"if",hash:{},fn:this.program(10,a),inverse:this.noop,data:a}),null!=s&&(l+=s),l+"\n"},2:function(e){var t,n=this.lambda,a=this.escapeExpression;return'<div class="info_tos"><a href="'+a(n(null!=(t=null!=e?e.info:e)?t.termsOfServiceUrl:t,e))+'">Terms of service</a></div>'},4:function(e){var t,n=this.lambda,a=this.escapeExpression;return"<div class='info_name'>Created by "+a(n(null!=(t=null!=(t=null!=e?e.info:e)?t.contact:t)?t.name:t,e))+"</div>"},6:function(e){var t,n=this.lambda,a=this.escapeExpression;return"<div class='info_url'>See more at <a href=\""+a(n(null!=(t=null!=(t=null!=e?e.info:e)?t.contact:t)?t.url:t,e))+'">'+a(n(null!=(t=null!=(t=null!=e?e.info:e)?t.contact:t)?t.url:t,e))+"</a></div>"},8:function(e){var t,n=this.lambda,a=this.escapeExpression;return"<div class='info_email'><a href=\"mailto:"+a(n(null!=(t=null!=(t=null!=e?e.info:e)?t.contact:t)?t.email:t,e))+"?subject="+a(n(null!=(t=null!=e?e.info:e)?t.title:t,e))+'">Contact the developer</a></div>'},10:function(e){var t,n=this.lambda,a=this.escapeExpression;return"<div class='info_license'><a href='"+a(n(null!=(t=null!=(t=null!=e?e.info:e)?t.license:t)?t.url:t,e))+"'>"+a(n(null!=(t=null!=(t=null!=e?e.info:e)?t.license:t)?t.name:t,e))+"</a></div>"},12:function(e){var t,n=this.lambda,a=this.escapeExpression;return'    , <span style="font-variant: small-caps">api version</span>: '+a(n(null!=(t=null!=e?e.info:e)?t.version:t,e))+"\n    "},14:function(e,t,n,a){var s,i="function",r=t.helperMissing,l=this.escapeExpression;return'    <span style="float:right"><a href="'+l((s=null!=(s=t.validatorUrl||(null!=e?e.validatorUrl:e))?s:r,typeof s===i?s.call(e,{name:"validatorUrl",hash:{},data:a}):s))+"/debug?url="+l((s=null!=(s=t.url||(null!=e?e.url:e))?s:r,typeof s===i?s.call(e,{name:"url",hash:{},data:a}):s))+'"><img id="validator" src="'+l((s=null!=(s=t.validatorUrl||(null!=e?e.validatorUrl:e))?s:r,typeof s===i?s.call(e,{name:"validatorUrl",hash:{},data:a}):s))+"?url="+l((s=null!=(s=t.url||(null!=e?e.url:e))?s:r,typeof s===i?s.call(e,{name:"url",hash:{},data:a}):s))+'"></a>\n    </span>\n'},compiler:[6,">= 2.0.0-beta.1"],main:function(e,t,n,a){var s,i,r="function",l=t.helperMissing,o=this.escapeExpression,p="<div class='info' id='api_info'>\n";return s=t["if"].call(e,null!=e?e.info:e,{name:"if",hash:{},fn:this.program(1,a),inverse:this.noop,data:a}),null!=s&&(p+=s),p+="</div>\n<div class='container' id='resources_container'>\n  <ul id='resources'></ul>\n\n  <div class=\"footer\">\n    <br>\n    <br>\n    <h4 style=\"color: #999\">[ <span style=\"font-variant: small-caps\">base url</span>: "+o((i=null!=(i=t.basePath||(null!=e?e.basePath:e))?i:l,typeof i===r?i.call(e,{name:"basePath",hash:{},data:a}):i))+"\n",s=t["if"].call(e,null!=(s=null!=e?e.info:e)?s.version:s,{name:"if",hash:{},fn:this.program(12,a),inverse:this.noop,data:a}),null!=s&&(p+=s),p+="]\n",s=t["if"].call(e,null!=e?e.validatorUrl:e,{name:"if",hash:{},fn:this.program(14,a),inverse:this.noop,data:a}),null!=s&&(p+=s),p+"    </h4>\n    </div>\n</div>\n"},useData:!0}),this.Handlebars.templates.operation=Handlebars.template({1:function(){return"deprecated"},3:function(){return"            <h4>Warning: Deprecated</h4>\n"},5:function(e,t,n,a){var s,i,r="function",l=t.helperMissing,o='        <h4>Implementation Notes</h4>\n        <p class="markdown">';return i=null!=(i=t.description||(null!=e?e.description:e))?i:l,s=typeof i===r?i.call(e,{name:"description",hash:{},data:a}):i,null!=s&&(o+=s),o+"</p>\n"},7:function(){return'        <div class="auth">\n        <span class="api-ic ic-error"></span>'},9:function(e,t,n,a){var s,i='          <div id="api_information_panel" style="top: 526px; left: 776px; display: none;">\n';return s=t.each.call(e,e,{name:"each",hash:{},fn:this.program(10,a),inverse:this.noop,data:a}),null!=s&&(i+=s),i+"          </div>\n"},10:function(e){var t,n=this.lambda,a=this.escapeExpression,s="            <div title='";return t=n(null!=e?e.description:e,e),null!=t&&(s+=t),s+"'>"+a(n(null!=e?e.scope:e,e))+"</div>\n"},12:function(){return"</div>"},14:function(){return'        <div class=\'access\'>\n          <span class="api-ic ic-off" title="click to authenticate"></span>\n        </div>\n'},16:function(e,t,n,a){var s,i="function",r=t.helperMissing,l=this.escapeExpression;return"          <h4>Response Class (Status "+l((s=null!=(s=t.successCode||(null!=e?e.successCode:e))?s:r,typeof s===i?s.call(e,{name:"successCode",hash:{},data:a}):s))+')</h4>\n          <p><span class="model-signature" /></p>\n          <br/>\n          <div class="response-content-type" />\n'},18:function(){return'          <h4>Parameters</h4>\n          <table class=\'fullwidth\'>\n          <thead>\n            <tr>\n            <th style="width: 100px; max-width: 100px">Parameter</th>\n            <th style="width: 310px; max-width: 310px">Value</th>\n            <th style="width: 200px; max-width: 200px">Description</th>\n            <th style="width: 100px; max-width: 100px">Parameter Type</th>\n            <th style="width: 220px; max-width: 230px">Data Type</th>\n            </tr>\n          </thead>\n          <tbody class="operation-params">\n\n          </tbody>\n          </table>\n'},20:function(){return"          <div style='margin:0;padding:0;display:inline'></div>\n          <h4>Response Messages</h4>\n          <table class='fullwidth'>\n            <thead>\n            <tr>\n              <th>HTTP Status Code</th>\n              <th>Reason</th>\n              <th>Response Model</th>\n            </tr>\n            </thead>\n            <tbody class=\"operation-status\">\n            \n            </tbody>\n          </table>\n"},22:function(){return""},24:function(){return"          <div class='sandbox_header'>\n            <input class='submit' name='commit' type='button' value='Try it out!' />\n            <a href='#' class='response_hider' style='display:none'>Hide Response</a>\n            <span class='response_throbber' style='display:none'></span>\n          </div>\n"},compiler:[6,">= 2.0.0-beta.1"],main:function(e,t,n,a){var s,i,r,l="function",o=t.helperMissing,p=this.escapeExpression,u=t.blockHelperMissing,h="\n  <ul class='operations' >\n    <li class='"+p((i=null!=(i=t.method||(null!=e?e.method:e))?i:o,typeof i===l?i.call(e,{name:"method",hash:{},data:a}):i))+" operation' id='"+p((i=null!=(i=t.parentId||(null!=e?e.parentId:e))?i:o,typeof i===l?i.call(e,{name:"parentId",hash:{},data:a}):i))+"_"+p((i=null!=(i=t.nickname||(null!=e?e.nickname:e))?i:o,typeof i===l?i.call(e,{name:"nickname",hash:{},data:a}):i))+"'>\n      <div class='heading'>\n        <h3>\n          <span class='http_method'>\n          <a href='#!/"+p((i=null!=(i=t.parentId||(null!=e?e.parentId:e))?i:o,typeof i===l?i.call(e,{name:"parentId",hash:{},data:a}):i))+"/"+p((i=null!=(i=t.nickname||(null!=e?e.nickname:e))?i:o,typeof i===l?i.call(e,{name:"nickname",hash:{},data:a}):i))+'\' class="toggleOperation">'+p((i=null!=(i=t.method||(null!=e?e.method:e))?i:o,typeof i===l?i.call(e,{name:"method",hash:{},data:a}):i))+"</a>\n          </span>\n          <span class='path'>\n          <a href='#!/"+p((i=null!=(i=t.parentId||(null!=e?e.parentId:e))?i:o,typeof i===l?i.call(e,{name:"parentId",hash:{},data:a}):i))+"/"+p((i=null!=(i=t.nickname||(null!=e?e.nickname:e))?i:o,typeof i===l?i.call(e,{name:"nickname",hash:{},data:a}):i))+"' class=\"toggleOperation ";return s=t["if"].call(e,null!=e?e.deprecated:e,{name:"if",hash:{},fn:this.program(1,a),inverse:this.noop,data:a}),null!=s&&(h+=s),h+='">'+p((i=null!=(i=t.path||(null!=e?e.path:e))?i:o,typeof i===l?i.call(e,{name:"path",hash:{},data:a}):i))+"</a>\n          </span>\n        </h3>\n        <ul class='options'>\n          <li>\n          <a href='#!/"+p((i=null!=(i=t.parentId||(null!=e?e.parentId:e))?i:o,typeof i===l?i.call(e,{name:"parentId",hash:{},data:a}):i))+"/"+p((i=null!=(i=t.nickname||(null!=e?e.nickname:e))?i:o,typeof i===l?i.call(e,{name:"nickname",hash:{},data:a}):i))+'\' class="toggleOperation">',i=null!=(i=t.summary||(null!=e?e.summary:e))?i:o,s=typeof i===l?i.call(e,{name:"summary",hash:{},data:a}):i,null!=s&&(h+=s),h+="</a>\n          </li>\n        </ul>\n      </div>\n      <div class='content' id='"+p((i=null!=(i=t.parentId||(null!=e?e.parentId:e))?i:o,typeof i===l?i.call(e,{name:"parentId",hash:{},data:a}):i))+"_"+p((i=null!=(i=t.nickname||(null!=e?e.nickname:e))?i:o,typeof i===l?i.call(e,{name:"nickname",hash:{},data:a}):i))+"_content' style='display:none'>\n",s=t["if"].call(e,null!=e?e.deprecated:e,{name:"if",hash:{},fn:this.program(3,a),inverse:this.noop,data:a}),null!=s&&(h+=s),s=t["if"].call(e,null!=e?e.description:e,{name:"if",hash:{},fn:this.program(5,a),inverse:this.noop,data:a}),null!=s&&(h+=s),i=null!=(i=t.oauth||(null!=e?e.oauth:e))?i:o,r={name:"oauth",hash:{},fn:this.program(7,a),inverse:this.noop,data:a},s=typeof i===l?i.call(e,r):i,t.oauth||(s=u.call(e,s,r)),null!=s&&(h+=s),h+="\n",s=t.each.call(e,null!=e?e.oauth:e,{name:"each",hash:{},fn:this.program(9,a),inverse:this.noop,data:a}),null!=s&&(h+=s),h+="        ",i=null!=(i=t.oauth||(null!=e?e.oauth:e))?i:o,r={name:"oauth",hash:{},fn:this.program(12,a),inverse:this.noop,data:a},s=typeof i===l?i.call(e,r):i,t.oauth||(s=u.call(e,s,r)),null!=s&&(h+=s),h+="\n",i=null!=(i=t.oauth||(null!=e?e.oauth:e))?i:o,r={name:"oauth",hash:{},fn:this.program(14,a),inverse:this.noop,data:a},s=typeof i===l?i.call(e,r):i,t.oauth||(s=u.call(e,s,r)),null!=s&&(h+=s),s=t["if"].call(e,null!=e?e.type:e,{name:"if",hash:{},fn:this.program(16,a),inverse:this.noop,data:a}),null!=s&&(h+=s),h+="        <form accept-charset='UTF-8' class='sandbox'>\n          <div style='margin:0;padding:0;display:inline'></div>\n",s=t["if"].call(e,null!=e?e.parameters:e,{name:"if",hash:{},fn:this.program(18,a),inverse:this.noop,data:a}),null!=s&&(h+=s),s=t["if"].call(e,null!=e?e.responseMessages:e,{name:"if",hash:{},fn:this.program(20,a),inverse:this.noop,data:a}),null!=s&&(h+=s),s=t["if"].call(e,null!=e?e.isReadOnly:e,{name:"if",hash:{},fn:this.program(22,a),inverse:this.program(24,a),data:a}),null!=s&&(h+=s),h+"        </form>\n        <div class='response' style='display:none'>\n          <h4>Request URL</h4>\n          <div class='block request_url'></div>\n          <h4>Response Body</h4>\n          <div class='block response_body'></div>\n          <h4>Response Code</h4>\n          <div class='block response_code'></div>\n          <h4>Response Headers</h4>\n          <div class='block response_headers'></div>\n        </div>\n      </div>\n    </li>\n  </ul>\n"},useData:!0});var ContentTypeView,__extends=function(e,t){function n(){this.constructor=e}for(var a in t)__hasProp.call(t,a)&&(e[a]=t[a]);return n.prototype=t.prototype,e.prototype=new n,e.__super__=t.prototype,e},__hasProp={}.hasOwnProperty;ContentTypeView=function(e){function t(){return t.__super__.constructor.apply(this,arguments)}return __extends(t,e),t.prototype.initialize=function(){},t.prototype.render=function(){var e;return e=this.template(),$(this.el).html(e(this.model)),$("label[for=contentType]",$(this.el)).text("Response Content Type"),this},t.prototype.template=function(){return Handlebars.templates.content_type},t}(Backbone.View),this.Handlebars.templates.param=Handlebars.template({1:function(e,t,n,a){var s,i="";return s=t["if"].call(e,null!=e?e.isFile:e,{name:"if",hash:{},fn:this.program(2,a),inverse:this.program(4,a),data:a}),null!=s&&(i+=s),i},2:function(e,t,n,a){var s,i="function",r=t.helperMissing,l=this.escapeExpression;return'			<input type="file" name=\''+l((s=null!=(s=t.name||(null!=e?e.name:e))?s:r,typeof s===i?s.call(e,{name:"name",hash:{},data:a}):s))+'\'/>\n			<div class="parameter-content-type" />\n'},4:function(e,t,n,a){var s,i="";return s=t["if"].call(e,null!=e?e["default"]:e,{name:"if",hash:{},fn:this.program(5,a),inverse:this.program(7,a),data:a}),null!=s&&(i+=s),i},5:function(e,t,n,a){var s,i="function",r=t.helperMissing,l=this.escapeExpression;return"				<textarea class='body-textarea' name='"+l((s=null!=(s=t.name||(null!=e?e.name:e))?s:r,typeof s===i?s.call(e,{name:"name",hash:{},data:a}):s))+"'>"+l((s=null!=(s=t["default"]||(null!=e?e["default"]:e))?s:r,typeof s===i?s.call(e,{name:"default",hash:{},data:a}):s))+'</textarea>\n        <br />\n        <div class="parameter-content-type" />\n'},7:function(e,t,n,a){var s,i="function",r=t.helperMissing,l=this.escapeExpression;return"				<textarea class='body-textarea' name='"+l((s=null!=(s=t.name||(null!=e?e.name:e))?s:r,typeof s===i?s.call(e,{name:"name",hash:{},data:a}):s))+'\'></textarea>\n				<br />\n				<div class="parameter-content-type" />\n'},9:function(e,t,n,a){var s,i="";return s=t["if"].call(e,null!=e?e.isFile:e,{name:"if",hash:{},fn:this.program(2,a),inverse:this.program(10,a),data:a}),null!=s&&(i+=s),i},10:function(e,t,n,a){var s,i="";return s=t["if"].call(e,null!=e?e["default"]:e,{name:"if",hash:{},fn:this.program(11,a),inverse:this.program(13,a),data:a}),null!=s&&(i+=s),i},11:function(e,t,n,a){var s,i="function",r=t.helperMissing,l=this.escapeExpression;return"				<input class='parameter' minlength='0' name='"+l((s=null!=(s=t.name||(null!=e?e.name:e))?s:r,typeof s===i?s.call(e,{name:"name",hash:{},data:a}):s))+"' placeholder='' type='text' value='"+l((s=null!=(s=t["default"]||(null!=e?e["default"]:e))?s:r,typeof s===i?s.call(e,{name:"default",hash:{},data:a}):s))+"'/>\n"},13:function(e,t,n,a){var s,i="function",r=t.helperMissing,l=this.escapeExpression;return"				<input class='parameter' minlength='0' name='"+l((s=null!=(s=t.name||(null!=e?e.name:e))?s:r,typeof s===i?s.call(e,{name:"name",hash:{},data:a}):s))+"' placeholder='' type='text' value=''/>\n"},compiler:[6,">= 2.0.0-beta.1"],main:function(e,t,n,a){var s,i,r="function",l=t.helperMissing,o=this.escapeExpression,p="<td class='code'>"+o((i=null!=(i=t.name||(null!=e?e.name:e))?i:l,typeof i===r?i.call(e,{name:"name",hash:{},data:a}):i))+"</td>\n<td>\n\n";return s=t["if"].call(e,null!=e?e.isBody:e,{name:"if",hash:{},fn:this.program(1,a),inverse:this.program(9,a),data:a}),null!=s&&(p+=s),p+='\n</td>\n<td class="markdown">',i=null!=(i=t.description||(null!=e?e.description:e))?i:l,s=typeof i===r?i.call(e,{name:"description",hash:{},data:a}):i,null!=s&&(p+=s),p+="</td>\n<td>",i=null!=(i=t.paramType||(null!=e?e.paramType:e))?i:l,s=typeof i===r?i.call(e,{name:"paramType",hash:{},data:a}):i,null!=s&&(p+=s),p+'</td>\n<td>\n	<span class="model-signature"></span>\n</td>\n'},useData:!0});var HeaderView,__extends=function(e,t){function n(){this.constructor=e}for(var a in t)__hasProp.call(t,a)&&(e[a]=t[a]);return n.prototype=t.prototype,e.prototype=new n,e.__super__=t.prototype,e},__hasProp={}.hasOwnProperty;HeaderView=function(e){function t(){return t.__super__.constructor.apply(this,arguments)}return __extends(t,e),t.prototype.events={"click #show-pet-store-icon":"showPetStore","click #show-wordnik-dev-icon":"showWordnikDev","click #explore":"showCustom","keyup #input_baseUrl":"showCustomOnKeyup","keyup #input_apiKey":"showCustomOnKeyup"},t.prototype.initialize=function(){},t.prototype.showPetStore=function(){return this.trigger("update-swagger-ui",{url:"http://petstore.swagger.wordnik.com/api/api-docs"})},t.prototype.showWordnikDev=function(){return this.trigger("update-swagger-ui",{url:"http://api.wordnik.com/v4/resources.json"})},t.prototype.showCustomOnKeyup=function(e){return 13===e.keyCode?this.showCustom():void 0},t.prototype.showCustom=function(e){return null!=e&&e.preventDefault(),this.trigger("update-swagger-ui",{url:$("#input_baseUrl").val(),apiKey:$("#input_apiKey").val()})},t.prototype.update=function(e,t,n){return null==n&&(n=!1),$("#input_baseUrl").val(e),n?this.trigger("update-swagger-ui",{url:e}):void 0},t}(Backbone.View),this.Handlebars.templates.param_list=Handlebars.template({1:function(){return" multiple='multiple'"},3:function(){return""},5:function(e,t,n,a){var s,i="";return s=t["if"].call(e,null!=e?e["default"]:e,{name:"if",hash:{},fn:this.program(3,a),inverse:this.program(6,a),data:a}),null!=s&&(i+=s),i},6:function(e,t,n,a){var s,i=t.helperMissing,r="";return s=(t.isArray||e&&e.isArray||i).call(e,e,{name:"isArray",hash:{},fn:this.program(3,a),inverse:this.program(7,a),data:a}),null!=s&&(r+=s),r},7:function(){return"          <option selected=\"\" value=''></option>\n"},9:function(e,t,n,a){var s,i="";return s=t["if"].call(e,null!=e?e.isDefault:e,{name:"if",hash:{},fn:this.program(10,a),inverse:this.program(12,a),data:a}),null!=s&&(i+=s),i},10:function(e,t,n,a){var s,i="function",r=t.helperMissing,l=this.escapeExpression;return'        <option selected="" value=\''+l((s=null!=(s=t.value||(null!=e?e.value:e))?s:r,typeof s===i?s.call(e,{name:"value",hash:{},data:a}):s))+"'>"+l((s=null!=(s=t.value||(null!=e?e.value:e))?s:r,typeof s===i?s.call(e,{name:"value",hash:{},data:a}):s))+" (default)</option>\n"},12:function(e,t,n,a){var s,i="function",r=t.helperMissing,l=this.escapeExpression;return"        <option value='"+l((s=null!=(s=t.value||(null!=e?e.value:e))?s:r,typeof s===i?s.call(e,{name:"value",hash:{},data:a}):s))+"'>"+l((s=null!=(s=t.value||(null!=e?e.value:e))?s:r,typeof s===i?s.call(e,{name:"value",hash:{},data:a}):s))+"</option>\n"},compiler:[6,">= 2.0.0-beta.1"],main:function(e,t,n,a){var s,i,r="function",l=t.helperMissing,o=this.escapeExpression,p="<td class='code'>"+o((i=null!=(i=t.name||(null!=e?e.name:e))?i:l,typeof i===r?i.call(e,{name:"name",hash:{},data:a}):i))+"</td>\n<td>\n  <select ";return s=(t.isArray||e&&e.isArray||l).call(e,e,{name:"isArray",hash:{},fn:this.program(1,a),inverse:this.noop,data:a}),null!=s&&(p+=s),p+=" class='parameter' name='"+o((i=null!=(i=t.name||(null!=e?e.name:e))?i:l,typeof i===r?i.call(e,{name:"name",hash:{},data:a}):i))+"'>\n",s=t["if"].call(e,null!=e?e.required:e,{name:"if",hash:{},fn:this.program(3,a),inverse:this.program(5,a),data:a}),null!=s&&(p+=s),s=t.each.call(e,null!=(s=null!=e?e.allowableValues:e)?s.descriptiveValues:s,{name:"each",hash:{},fn:this.program(9,a),inverse:this.noop,data:a}),null!=s&&(p+=s),p+='  </select>\n</td>\n<td class="markdown">',i=null!=(i=t.description||(null!=e?e.description:e))?i:l,s=typeof i===r?i.call(e,{name:"description",hash:{},data:a}):i,null!=s&&(p+=s),p+="</td>\n<td>",i=null!=(i=t.paramType||(null!=e?e.paramType:e))?i:l,s=typeof i===r?i.call(e,{name:"paramType",hash:{},data:a}):i,null!=s&&(p+=s),p+'</td>\n<td><span class="model-signature"></span></td>'},useData:!0});var MainView,__extends=function(e,t){function n(){this.constructor=e}for(var a in t)__hasProp.call(t,a)&&(e[a]=t[a]);return n.prototype=t.prototype,e.prototype=new n,e.__super__=t.prototype,e},__hasProp={}.hasOwnProperty;MainView=function(e){function t(){return t.__super__.constructor.apply(this,arguments)}var n;return __extends(t,e),n={alpha:function(e,t){return e.path.localeCompare(t.path)},method:function(e,t){return e.method.localeCompare(t.method)}},t.prototype.initialize=function(e){var t,n,a,s;null==e&&(e={}),this.model.auths=[],s=this.model.securityDefinitions;for(n in s)a=s[n],t={name:n,type:a.type,value:a},this.model.auths.push(t);return"2.0"===this.model.swaggerVersion?this.model.validatorUrl="validatorUrl"in e.swaggerOptions?e.swaggerOptions.validatorUrl:this.model.url.indexOf("localhost")>0?null:"http://online.swagger.io/validator":void 0},t.prototype.render=function(){var e,t,n,a,s,i,r,l,o,p;if(this.model.securityDefinitions)for(s in this.model.securityDefinitions)e=this.model.securityDefinitions[s],"apiKey"===e.type&&0===$("#apikey_button").length&&(t=new ApiKeyButton({model:e}).render().el,$(".auth_main_container").append(t)),"basicAuth"===e.type&&0===$("#basic_auth_button").length&&(t=new BasicAuthButton({model:e}).render().el,$(".auth_main_container").append(t));
+for($(this.el).html(Handlebars.templates.main(this.model)),r={},n=0,p=this.model.apisArray,l=0,o=p.length;o>l;l++){for(i=p[l],a=i.name;"undefined"!=typeof r[a];)a=a+"_"+n,n+=1;i.id=a,r[a]=i,this.addResource(i,this.model.auths)}return $(".propWrap").hover(function(){return $(".optionsWrapper",$(this)).show()},function(){return $(".optionsWrapper",$(this)).hide()}),this},t.prototype.addResource=function(e,t){var n;return e.id=e.id.replace(/\s/g,"_"),n=new ResourceView({model:e,tagName:"li",id:"resource_"+e.id,className:"resource",auths:t,swaggerOptions:this.options.swaggerOptions}),$("#resources").append(n.render().el)},t.prototype.clear=function(){return $(this.el).html("")},t}(Backbone.View),this.Handlebars.templates.param_readonly=Handlebars.template({1:function(e,t,n,a){var s,i="function",r=t.helperMissing,l=this.escapeExpression;return"        <textarea class='body-textarea' readonly='readonly' name='"+l((s=null!=(s=t.name||(null!=e?e.name:e))?s:r,typeof s===i?s.call(e,{name:"name",hash:{},data:a}):s))+"'>"+l((s=null!=(s=t["default"]||(null!=e?e["default"]:e))?s:r,typeof s===i?s.call(e,{name:"default",hash:{},data:a}):s))+"</textarea>\n"},3:function(e,t,n,a){var s,i="";return s=t["if"].call(e,null!=e?e["default"]:e,{name:"if",hash:{},fn:this.program(4,a),inverse:this.program(6,a),data:a}),null!=s&&(i+=s),i},4:function(e,t,n,a){var s,i="function",r=t.helperMissing,l=this.escapeExpression;return"            "+l((s=null!=(s=t["default"]||(null!=e?e["default"]:e))?s:r,typeof s===i?s.call(e,{name:"default",hash:{},data:a}):s))+"\n"},6:function(){return"            (empty)\n"},compiler:[6,">= 2.0.0-beta.1"],main:function(e,t,n,a){var s,i,r="function",l=t.helperMissing,o=this.escapeExpression,p="<td class='code'>"+o((i=null!=(i=t.name||(null!=e?e.name:e))?i:l,typeof i===r?i.call(e,{name:"name",hash:{},data:a}):i))+"</td>\n<td>\n";return s=t["if"].call(e,null!=e?e.isBody:e,{name:"if",hash:{},fn:this.program(1,a),inverse:this.program(3,a),data:a}),null!=s&&(p+=s),p+='</td>\n<td class="markdown">',i=null!=(i=t.description||(null!=e?e.description:e))?i:l,s=typeof i===r?i.call(e,{name:"description",hash:{},data:a}):i,null!=s&&(p+=s),p+="</td>\n<td>",i=null!=(i=t.paramType||(null!=e?e.paramType:e))?i:l,s=typeof i===r?i.call(e,{name:"paramType",hash:{},data:a}):i,null!=s&&(p+=s),p+'</td>\n<td><span class="model-signature"></span></td>\n'},useData:!0});var OperationView,__extends=function(e,t){function n(){this.constructor=e}for(var a in t)__hasProp.call(t,a)&&(e[a]=t[a]);return n.prototype=t.prototype,e.prototype=new n,e.__super__=t.prototype,e},__hasProp={}.hasOwnProperty;OperationView=function(e){function t(){return t.__super__.constructor.apply(this,arguments)}return __extends(t,e),t.prototype.invocationUrl=null,t.prototype.events={"submit .sandbox":"submitOperation","click .submit":"submitOperation","click .response_hider":"hideResponse","click .toggleOperation":"toggleOperationContent","mouseenter .api-ic":"mouseEnter","mouseout .api-ic":"mouseExit"},t.prototype.initialize=function(e){return null==e&&(e={}),this.auths=e.auths,this},t.prototype.mouseEnter=function(e){var t,n,a,s,i,r,l,o,p,u;return t=$(this.el).find(".content"),p=e.pageX,u=e.pageY,r=$(window).scrollLeft(),l=$(window).scrollTop(),s=r+$(window).width(),i=l+$(window).height(),o=t.width(),n=t.height(),p+o>s&&(p=s-o),r>p&&(p=r),u+n>i&&(u=i-n),l>u&&(u=l),a={},a.top=u,a.left=p,t.css(a),$(e.currentTarget.parentNode).find("#api_information_panel").show()},t.prototype.mouseExit=function(e){return $(e.currentTarget.parentNode).find("#api_information_panel").hide()},t.prototype.render=function(){var e,t,n,a,s,i,r,l,o,p,u,h,c,d,m,f,y,g,v,_,w,b,x,k,O,C,S,P,T,D,H,M,E,R,V,N,U,A;if(i=jQuery.inArray(this.model.method,this.model.supportedSubmitMethods())>=0,i||(this.model.isReadOnly=!0),this.model.description=this.model.description||this.model.notes,this.model.description&&(this.model.description=this.model.description.replace(/(?:\r\n|\r|\n)/g,"<br />")),this.model.oauth=null,o=this.model.authorizations||this.model.security)if(Array.isArray(o))for(k=0,P=o.length;P>k;k++){n=o[k];for(l in n){t=n[l];for(e in this.auths)if(t=this.auths[e],"oauth2"===t.type){this.model.oauth={},this.model.oauth.scopes=[],R=t.value.scopes;for(r in R)b=R[r],y=n[l].indexOf(r),y>=0&&(p={scope:r,description:b},this.model.oauth.scopes.push(p))}}}else for(r in o)if(b=o[r],"oauth2"===r)for(null===this.model.oauth&&(this.model.oauth={}),void 0===this.model.oauth.scopes&&(this.model.oauth.scopes=[]),O=0,T=b.length;T>O;O++)p=b[O],this.model.oauth.scopes.push(p);if("undefined"!=typeof this.model.responses){this.model.responseMessages=[],V=this.model.responses;for(a in V)x=V[a],m=null,f=this.model.responses[a].schema,f&&f.$ref&&(m=f.$ref,0===m.indexOf("#/definitions/")&&(m=m.substring("#/definitions/".length))),this.model.responseMessages.push({code:a,message:x.description,responseModel:m})}if("undefined"==typeof this.model.responseMessages&&(this.model.responseMessages=[]),g=null,this.model.successResponse){_=this.model.successResponse;for(l in _)x=_[l],this.model.successCode=l,"object"==typeof x&&"function"==typeof x.createJSONSample&&(g={sampleJSON:JSON.stringify(x.createJSONSample(),void 0,2),isParam:!1,signature:x.getMockSignature()})}else this.model.responseClassSignature&&"string"!==this.model.responseClassSignature&&(g={sampleJSON:this.model.responseSampleJSON,isParam:!1,signature:this.model.responseClassSignature});for($(this.el).html(Handlebars.templates.operation(this.model)),g?(d=new SignatureView({model:g,tagName:"div"}),$(".model-signature",$(this.el)).append(d.render().el)):(this.model.responseClassSignature="string",$(".model-signature",$(this.el)).html(this.model.type)),s={isParam:!1},s.consumes=this.model.consumes,s.produces=this.model.produces,N=this.model.parameters,C=0,D=N.length;D>C;C++)u=N[C],w=u.type||u.dataType||"","undefined"==typeof w&&(m=u.schema,m&&m.$ref&&(h=m.$ref,w=0===h.indexOf("#/definitions/")?h.substring("#/definitions/".length):h)),w&&"file"===w.toLowerCase()&&(s.consumes||(s.consumes="multipart/form-data")),u.type=w;for(c=new ResponseContentTypeView({model:s}),$(".response-content-type",$(this.el)).append(c.render().el),U=this.model.parameters,S=0,H=U.length;H>S;S++)u=U[S],this.addParameter(u,s.consumes);for(A=this.model.responseMessages,E=0,M=A.length;M>E;E++)v=A[E],this.addStatusCode(v);return this},t.prototype.addParameter=function(e,t){var n;return e.consumes=t,n=new ParameterView({model:e,tagName:"tr",readOnly:this.model.isReadOnly}),$(".operation-params",$(this.el)).append(n.render().el)},t.prototype.addStatusCode=function(e){var t;return t=new StatusCodeView({model:e,tagName:"tr"}),$(".operation-status",$(this.el)).append(t.render().el)},t.prototype.submitOperation=function(e){var t,n,a,s,i,r,l,o,p,u,h,c,d,m,f,y;if(null!=e&&e.preventDefault(),n=$(".sandbox",$(this.el)),t=!0,n.find("input.required").each(function(){return $(this).removeClass("error"),""===jQuery.trim($(this).val())?($(this).addClass("error"),$(this).wiggle({callback:function(e){return function(){return $(e).focus()}}(this)}),t=!1):void 0}),n.find("textarea.required").each(function(){return $(this).removeClass("error"),""===jQuery.trim($(this).val())?($(this).addClass("error"),$(this).wiggle({callback:function(e){return function(){return $(e).focus()}}(this)}),t=!1):void 0}),t){for(s={},r={parent:this},a=!1,m=n.find("input"),o=0,h=m.length;h>o;o++)i=m[o],null!=i.value&&jQuery.trim(i.value).length>0&&(s[i.name]=i.value),"file"===i.type&&(a=!0);for(f=n.find("textarea"),p=0,c=f.length;c>p;p++)i=f[p],null!=i.value&&jQuery.trim(i.value).length>0&&(s[i.name]=i.value);for(y=n.find("select"),u=0,d=y.length;d>u;u++)i=y[u],l=this.getSelectedValue(i),null!=l&&jQuery.trim(l).length>0&&(s[i.name]=l);return r.responseContentType=$("div select[name=responseContentType]",$(this.el)).val(),r.requestContentType=$("div select[name=parameterContentType]",$(this.el)).val(),$(".response_throbber",$(this.el)).show(),a?this.handleFileUpload(s,n):this.model["do"](s,r,this.showCompleteStatus,this.showErrorStatus,this)}},t.prototype.success=function(e,t){return t.showCompleteStatus(e)},t.prototype.handleFileUpload=function(e,t){var n,a,s,i,r,l,o,p,u,h,c,d,m,f,y,g,v,_,w;for(g=t.serializeArray(),p=0,d=g.length;d>p;p++)i=g[p],null!=i.value&&jQuery.trim(i.value).length>0&&(e[i.name]=i.value);for(n=new FormData,o=0,v=this.model.parameters,u=0,m=v.length;m>u;u++)l=v[u],"form"===l.paramType&&"file"!==l.type.toLowerCase()&&void 0!==e[l.name]&&n.append(l.name,e[l.name]);for(s={},_=this.model.parameters,h=0,f=_.length;f>h;h++)l=_[h],"header"===l.paramType&&(s[l.name]=e[l.name]);for(w=t.find('input[type~="file"]'),c=0,y=w.length;y>c;c++)a=w[c],"undefined"!=typeof a.files[0]&&(n.append($(a).attr("name"),a.files[0]),o+=1);return this.invocationUrl=this.model.supportHeaderParams()?(s=this.model.getHeaderParams(e),delete s["Content-Type"],this.model.urlify(e,!1)):this.model.urlify(e,!0),$(".request_url",$(this.el)).html("<pre></pre>"),$(".request_url pre",$(this.el)).text(this.invocationUrl),r={type:this.model.method,url:this.invocationUrl,headers:s,data:n,dataType:"json",contentType:!1,processData:!1,error:function(e){return function(t){return e.showErrorStatus(e.wrap(t),e)}}(this),success:function(e){return function(t){return e.showResponse(t,e)}}(this),complete:function(e){return function(t){return e.showCompleteStatus(e.wrap(t),e)}}(this)},window.authorizations&&window.authorizations.apply(r),0===o&&r.data.append("fake","true"),jQuery.ajax(r),!1},t.prototype.wrap=function(e){var t,n,a,s,i,r,l;for(a={},n=e.getAllResponseHeaders().split("\r"),r=0,l=n.length;l>r;r++)s=n[r],t=s.match(/^([^:]*?):(.*)$/),t||(t=[]),t.shift(),void 0!==t[0]&&void 0!==t[1]&&(a[t[0].trim()]=t[1].trim());return i={},i.content={},i.content.data=e.responseText,i.headers=a,i.request={},i.request.url=this.invocationUrl,i.status=e.status,i},t.prototype.getSelectedValue=function(e){var t,n,a,s,i;if(e.multiple){for(n=[],i=e.options,a=0,s=i.length;s>a;a++)t=i[a],t.selected&&n.push(t.value);return n.length>0?n:null}return e.value},t.prototype.hideResponse=function(e){return null!=e&&e.preventDefault(),$(".response",$(this.el)).slideUp(),$(".response_hider",$(this.el)).fadeOut()},t.prototype.showResponse=function(e){var t;return t=JSON.stringify(e,null,"	").replace(/\n/g,"<br>"),$(".response_body",$(this.el)).html(escape(t))},t.prototype.showErrorStatus=function(e,t){return t.showStatus(e)},t.prototype.showCompleteStatus=function(e,t){return t.showStatus(e)},t.prototype.formatXml=function(e){var t,n,a,s,i,r,l,o,p,u,h,c,d;for(o=/(>)(<)(\/*)/g,u=/[ ]*(.*)[ ]+\n/g,t=/(<.+>)(.+\n)/g,e=e.replace(o,"$1\n$2$3").replace(u,"$1\n").replace(t,"$1\n$2"),l=0,n="",i=e.split("\n"),a=0,s="other",p={"single->single":0,"single->closing":-1,"single->opening":0,"single->other":0,"closing->single":0,"closing->closing":-1,"closing->opening":0,"closing->other":0,"opening->single":1,"opening->closing":0,"opening->opening":1,"opening->other":1,"other->single":0,"other->closing":-1,"other->opening":0,"other->other":0},h=function(e){var t,i,r,l,o,u,h;return u={single:Boolean(e.match(/<.+\/>/)),closing:Boolean(e.match(/<\/.+>/)),opening:Boolean(e.match(/<[^!?].*>/))},o=function(){var e;e=[];for(r in u)h=u[r],h&&e.push(r);return e}()[0],o=void 0===o?"other":o,t=s+"->"+o,s=o,l="",a+=p[t],l=function(){var e,t,n;for(n=[],i=e=0,t=a;t>=0?t>e:e>t;i=t>=0?++e:--e)n.push("  ");return n}().join(""),"opening->closing"===t?n=n.substr(0,n.length-1)+e+"\n":n+=l+e+"\n"},c=0,d=i.length;d>c;c++)r=i[c],h(r);return n},t.prototype.showStatus=function(e){var t,n,a,s,i,r,l,o,p,u,h;if(void 0===e.content?(n=e.data,h=e.url):(n=e.content.data,h=e.request.url),i=e.headers,a=null,i&&(a=i["Content-Type"]||i["content-type"],a&&(a=a.split(";")[0].trim())),$(".response_body",$(this.el)).removeClass("json"),$(".response_body",$(this.el)).removeClass("xml"),n)if("application/json"===a||/\+json$/.test(a)){r=null;try{r=JSON.stringify(JSON.parse(n),null,"  ")}catch(c){s=c,r="can't parse JSON.  Raw result:\n\n"+n}t=$("<code />").text(r),o=$('<pre class="json" />').append(t)}else"application/xml"===a||/\+xml$/.test(a)?(t=$("<code />").text(this.formatXml(n)),o=$('<pre class="xml" />').append(t)):"text/html"===a?(t=$("<code />").html(_.escape(n)),o=$('<pre class="xml" />').append(t)):/^image\//.test(a)?o=$("<img>").attr("src",h):(t=$("<code />").text(n),o=$('<pre class="json" />').append(t));else t=$("<code />").text("no content"),o=$('<pre class="json" />').append(t);return p=o,$(".request_url",$(this.el)).html("<pre></pre>"),$(".request_url pre",$(this.el)).text(h),$(".response_code",$(this.el)).html("<pre>"+e.status+"</pre>"),$(".response_body",$(this.el)).html(p),$(".response_headers",$(this.el)).html("<pre>"+_.escape(JSON.stringify(e.headers,null,"  ")).replace(/\n/g,"<br>")+"</pre>"),$(".response",$(this.el)).slideDown(),$(".response_hider",$(this.el)).show(),$(".response_throbber",$(this.el)).hide(),u=$(".response_body",$(this.el))[0],l=this.options.swaggerOptions,l.highlightSizeThreshold&&e.data.length>l.highlightSizeThreshold?u:hljs.highlightBlock(u)},t.prototype.toggleOperationContent=function(){var e;return e=$("#"+Docs.escapeResourceName(this.model.parentId+"_"+this.model.nickname+"_content")),e.is(":visible")?Docs.collapseOperation(e):Docs.expandOperation(e)},t}(Backbone.View),this.Handlebars.templates.param_readonly_required=Handlebars.template({1:function(e,t,n,a){var s,i="function",r=t.helperMissing,l=this.escapeExpression;return"        <textarea class='body-textarea'  readonly='readonly' placeholder='(required)' name='"+l((s=null!=(s=t.name||(null!=e?e.name:e))?s:r,typeof s===i?s.call(e,{name:"name",hash:{},data:a}):s))+"'>"+l((s=null!=(s=t["default"]||(null!=e?e["default"]:e))?s:r,typeof s===i?s.call(e,{name:"default",hash:{},data:a}):s))+"</textarea>\n"},3:function(e,t,n,a){var s,i="";return s=t["if"].call(e,null!=e?e["default"]:e,{name:"if",hash:{},fn:this.program(4,a),inverse:this.program(6,a),data:a}),null!=s&&(i+=s),i},4:function(e,t,n,a){var s,i="function",r=t.helperMissing,l=this.escapeExpression;return"            "+l((s=null!=(s=t["default"]||(null!=e?e["default"]:e))?s:r,typeof s===i?s.call(e,{name:"default",hash:{},data:a}):s))+"\n"},6:function(){return"            (empty)\n"},compiler:[6,">= 2.0.0-beta.1"],main:function(e,t,n,a){var s,i,r="function",l=t.helperMissing,o=this.escapeExpression,p="<td class='code required'>"+o((i=null!=(i=t.name||(null!=e?e.name:e))?i:l,typeof i===r?i.call(e,{name:"name",hash:{},data:a}):i))+"</td>\n<td>\n";return s=t["if"].call(e,null!=e?e.isBody:e,{name:"if",hash:{},fn:this.program(1,a),inverse:this.program(3,a),data:a}),null!=s&&(p+=s),p+='</td>\n<td class="markdown">',i=null!=(i=t.description||(null!=e?e.description:e))?i:l,s=typeof i===r?i.call(e,{name:"description",hash:{},data:a}):i,null!=s&&(p+=s),p+="</td>\n<td>",i=null!=(i=t.paramType||(null!=e?e.paramType:e))?i:l,s=typeof i===r?i.call(e,{name:"paramType",hash:{},data:a}):i,null!=s&&(p+=s),p+'</td>\n<td><span class="model-signature"></span></td>\n'},useData:!0});var ParameterContentTypeView,__extends=function(e,t){function n(){this.constructor=e}for(var a in t)__hasProp.call(t,a)&&(e[a]=t[a]);return n.prototype=t.prototype,e.prototype=new n,e.__super__=t.prototype,e},__hasProp={}.hasOwnProperty;ParameterContentTypeView=function(e){function t(){return t.__super__.constructor.apply(this,arguments)}return __extends(t,e),t.prototype.initialize=function(){},t.prototype.render=function(){var e;return e=this.template(),$(this.el).html(e(this.model)),$("label[for=parameterContentType]",$(this.el)).text("Parameter content type:"),this},t.prototype.template=function(){return Handlebars.templates.parameter_content_type},t}(Backbone.View),this.Handlebars.templates.param_required=Handlebars.template({1:function(e,t,n,a){var s,i="";return s=t["if"].call(e,null!=e?e.isFile:e,{name:"if",hash:{},fn:this.program(2,a),inverse:this.program(4,a),data:a}),null!=s&&(i+=s),i},2:function(e,t,n,a){var s,i="function",r=t.helperMissing,l=this.escapeExpression;return'			<input type="file" name=\''+l((s=null!=(s=t.name||(null!=e?e.name:e))?s:r,typeof s===i?s.call(e,{name:"name",hash:{},data:a}):s))+"'/>\n"},4:function(e,t,n,a){var s,i="";return s=t["if"].call(e,null!=e?e["default"]:e,{name:"if",hash:{},fn:this.program(5,a),inverse:this.program(7,a),data:a}),null!=s&&(i+=s),i},5:function(e,t,n,a){var s,i="function",r=t.helperMissing,l=this.escapeExpression;return"				<textarea class='body-textarea required' placeholder='(required)' name='"+l((s=null!=(s=t.name||(null!=e?e.name:e))?s:r,typeof s===i?s.call(e,{name:"name",hash:{},data:a}):s))+"'>"+l((s=null!=(s=t["default"]||(null!=e?e["default"]:e))?s:r,typeof s===i?s.call(e,{name:"default",hash:{},data:a}):s))+'</textarea>\n        <br />\n        <div class="parameter-content-type" />\n'},7:function(e,t,n,a){var s,i="function",r=t.helperMissing,l=this.escapeExpression;return"				<textarea class='body-textarea required' placeholder='(required)' name='"+l((s=null!=(s=t.name||(null!=e?e.name:e))?s:r,typeof s===i?s.call(e,{name:"name",hash:{},data:a}):s))+'\'></textarea>\n				<br />\n				<div class="parameter-content-type" />\n'},9:function(e,t,n,a){var s,i="";return s=t["if"].call(e,null!=e?e.isFile:e,{name:"if",hash:{},fn:this.program(10,a),inverse:this.program(12,a),data:a}),null!=s&&(i+=s),i},10:function(e,t,n,a){var s,i="function",r=t.helperMissing,l=this.escapeExpression;return"			<input class='parameter' class='required' type='file' name='"+l((s=null!=(s=t.name||(null!=e?e.name:e))?s:r,typeof s===i?s.call(e,{name:"name",hash:{},data:a}):s))+"'/>\n"},12:function(e,t,n,a){var s,i="";return s=t["if"].call(e,null!=e?e["default"]:e,{name:"if",hash:{},fn:this.program(13,a),inverse:this.program(15,a),data:a}),null!=s&&(i+=s),i},13:function(e,t,n,a){var s,i="function",r=t.helperMissing,l=this.escapeExpression;return"				<input class='parameter required' minlength='1' name='"+l((s=null!=(s=t.name||(null!=e?e.name:e))?s:r,typeof s===i?s.call(e,{name:"name",hash:{},data:a}):s))+"' placeholder='(required)' type='text' value='"+l((s=null!=(s=t["default"]||(null!=e?e["default"]:e))?s:r,typeof s===i?s.call(e,{name:"default",hash:{},data:a}):s))+"'/>\n"},15:function(e,t,n,a){var s,i="function",r=t.helperMissing,l=this.escapeExpression;return"				<input class='parameter required' minlength='1' name='"+l((s=null!=(s=t.name||(null!=e?e.name:e))?s:r,typeof s===i?s.call(e,{name:"name",hash:{},data:a}):s))+"' placeholder='(required)' type='text' value=''/>\n"},compiler:[6,">= 2.0.0-beta.1"],main:function(e,t,n,a){var s,i,r="function",l=t.helperMissing,o=this.escapeExpression,p="<td class='code required'>"+o((i=null!=(i=t.name||(null!=e?e.name:e))?i:l,typeof i===r?i.call(e,{name:"name",hash:{},data:a}):i))+"</td>\n<td>\n";return s=t["if"].call(e,null!=e?e.isBody:e,{name:"if",hash:{},fn:this.program(1,a),inverse:this.program(9,a),data:a}),null!=s&&(p+=s),p+='</td>\n<td>\n	<strong><span class="markdown">',i=null!=(i=t.description||(null!=e?e.description:e))?i:l,s=typeof i===r?i.call(e,{name:"description",hash:{},data:a}):i,null!=s&&(p+=s),p+="</span></strong>\n</td>\n<td>",i=null!=(i=t.paramType||(null!=e?e.paramType:e))?i:l,s=typeof i===r?i.call(e,{name:"paramType",hash:{},data:a}):i,null!=s&&(p+=s),p+'</td>\n<td><span class="model-signature"></span></td>\n'},useData:!0});var ParameterView,__extends=function(e,t){function n(){this.constructor=e}for(var a in t)__hasProp.call(t,a)&&(e[a]=t[a]);return n.prototype=t.prototype,e.prototype=new n,e.__super__=t.prototype,e},__hasProp={}.hasOwnProperty;ParameterView=function(e){function t(){return t.__super__.constructor.apply(this,arguments)}return __extends(t,e),t.prototype.initialize=function(){return Handlebars.registerHelper("isArray",function(e,t){return"array"===e.type.toLowerCase()||e.allowMultiple?t.fn(this):t.inverse(this)})},t.prototype.render=function(){var e,t,n,a,s,i,r,l,o,p;return p=this.model.type||this.model.dataType,"undefined"==typeof p&&(i=this.model.schema,i&&i.$ref&&(a=i.$ref,p=0===a.indexOf("#/definitions/")?a.substring("#/definitions/".length):a)),this.model.type=p,this.model.paramType=this.model["in"]||this.model.paramType,("body"===this.model.paramType||"body"===this.model["in"])&&(this.model.isBody=!0),p&&"file"===p.toLowerCase()&&(this.model.isFile=!0),this.model["default"]=this.model["default"]||this.model.defaultValue,this.model.allowableValues&&(this.model.isList=!0),o=this.template(),$(this.el).html(o(this.model)),r={sampleJSON:this.model.sampleJSON,isParam:!0,signature:this.model.signature},this.model.sampleJSON?(l=new SignatureView({model:r,tagName:"div"}),$(".model-signature",$(this.el)).append(l.render().el)):$(".model-signature",$(this.el)).html(this.model.signature),t=!1,this.model.isBody&&(t=!0),e={isParam:t},e.consumes=this.model.consumes,t?(n=new ParameterContentTypeView({model:e}),$(".parameter-content-type",$(this.el)).append(n.render().el)):(s=new ResponseContentTypeView({model:e}),$(".response-content-type",$(this.el)).append(s.render().el)),this},t.prototype.template=function(){return this.model.isList?Handlebars.templates.param_list:this.options.readOnly?this.model.required?Handlebars.templates.param_readonly_required:Handlebars.templates.param_readonly:this.model.required?Handlebars.templates.param_required:Handlebars.templates.param},t}(Backbone.View),this.Handlebars.templates.parameter_content_type=Handlebars.template({1:function(e,t,n,a){var s,i="";return s=t.each.call(e,null!=e?e.consumes:e,{name:"each",hash:{},fn:this.program(2,a),inverse:this.noop,data:a}),null!=s&&(i+=s),i},2:function(e){var t,n=this.lambda,a='  <option value="';return t=n(e,e),null!=t&&(a+=t),a+='">',t=n(e,e),null!=t&&(a+=t),a+"</option>\n"},4:function(){return'  <option value="application/json">application/json</option>\n'},compiler:[6,">= 2.0.0-beta.1"],main:function(e,t,n,a){var s,i='<label for="parameterContentType"></label>\n<select name="parameterContentType">\n';return s=t["if"].call(e,null!=e?e.consumes:e,{name:"if",hash:{},fn:this.program(1,a),inverse:this.program(4,a),data:a}),null!=s&&(i+=s),i+"</select>\n"},useData:!0});var ResourceView,__extends=function(e,t){function n(){this.constructor=e}for(var a in t)__hasProp.call(t,a)&&(e[a]=t[a]);return n.prototype=t.prototype,e.prototype=new n,e.__super__=t.prototype,e},__hasProp={}.hasOwnProperty;ResourceView=function(e){function t(){return t.__super__.constructor.apply(this,arguments)}return __extends(t,e),t.prototype.initialize=function(e){return null==e&&(e={}),this.auths=e.auths,""===this.model.description?this.model.description=null:void 0},t.prototype.render=function(){var e,t,n,a,s,i,r;for($(this.el).html(Handlebars.templates.resource(this.model)),n={},this.model.description&&(this.model.summary=this.model.description),r=this.model.operationsArray,s=0,i=r.length;i>s;s++){for(a=r[s],e=0,t=a.nickname;"undefined"!=typeof n[t];)t=t+"_"+e,e+=1;n[t]=a,a.nickname=t,a.parentId=this.model.id,this.addOperation(a)}return $(".toggleEndpointList",this.el).click(this.callDocs.bind(this,"toggleEndpointListForResource")),$(".collapseResource",this.el).click(this.callDocs.bind(this,"collapseOperationsForResource")),$(".expandResource",this.el).click(this.callDocs.bind(this,"expandOperationsForResource")),this},t.prototype.addOperation=function(e){var t;return e.number=this.number,t=new OperationView({model:e,tagName:"li",className:"endpoint",swaggerOptions:this.options.swaggerOptions,auths:this.auths}),$(".endpoints",$(this.el)).append(t.render().el),this.number++},t.prototype.callDocs=function(e,t){return t.preventDefault(),Docs[e](t.currentTarget.getAttribute("data-id"))},t}(Backbone.View),this.Handlebars.templates.resource=Handlebars.template({1:function(){return" : "},3:function(e,t,n,a){var s,i="function",r=t.helperMissing,l=this.escapeExpression;return"<li>\n      <a href='"+l((s=null!=(s=t.url||(null!=e?e.url:e))?s:r,typeof s===i?s.call(e,{name:"url",hash:{},data:a}):s))+"'>Raw</a>\n    </li>"},compiler:[6,">= 2.0.0-beta.1"],main:function(e,t,n,a){var s,i,r,l="function",o=t.helperMissing,p=this.escapeExpression,u=t.blockHelperMissing,h="<div class='heading'>\n  <h2>\n    <a href='#!/"+p((i=null!=(i=t.id||(null!=e?e.id:e))?i:o,typeof i===l?i.call(e,{name:"id",hash:{},data:a}):i))+'\' class="toggleEndpointList" data-id="'+p((i=null!=(i=t.id||(null!=e?e.id:e))?i:o,typeof i===l?i.call(e,{name:"id",hash:{},data:a}):i))+'">'+p((i=null!=(i=t.name||(null!=e?e.name:e))?i:o,typeof i===l?i.call(e,{name:"name",hash:{},data:a}):i))+"</a> ";return i=null!=(i=t.summary||(null!=e?e.summary:e))?i:o,r={name:"summary",hash:{},fn:this.program(1,a),inverse:this.noop,data:a},s=typeof i===l?i.call(e,r):i,t.summary||(s=u.call(e,s,r)),null!=s&&(h+=s),i=null!=(i=t.summary||(null!=e?e.summary:e))?i:o,s=typeof i===l?i.call(e,{name:"summary",hash:{},data:a}):i,null!=s&&(h+=s),h+="\n  </h2>\n  <ul class='options'>\n    <li>\n      <a href='#!/"+p((i=null!=(i=t.id||(null!=e?e.id:e))?i:o,typeof i===l?i.call(e,{name:"id",hash:{},data:a}):i))+"' id='endpointListTogger_"+p((i=null!=(i=t.id||(null!=e?e.id:e))?i:o,typeof i===l?i.call(e,{name:"id",hash:{},data:a}):i))+'\' class="toggleEndpointList" data-id="'+p((i=null!=(i=t.id||(null!=e?e.id:e))?i:o,typeof i===l?i.call(e,{name:"id",hash:{},data:a}):i))+'">Show/Hide</a>\n    </li>\n    <li>\n      <a href=\'#\' class="collapseResource" data-id="'+p((i=null!=(i=t.id||(null!=e?e.id:e))?i:o,typeof i===l?i.call(e,{name:"id",hash:{},data:a}):i))+'">\n        List Operations\n      </a>\n    </li>\n    <li>\n      <a href=\'#\' class="expandResource" data-id="'+p((i=null!=(i=t.id||(null!=e?e.id:e))?i:o,typeof i===l?i.call(e,{name:"id",hash:{},data:a}):i))+'">\n        Expand Operations\n      </a>\n    </li>\n    ',i=null!=(i=t.url||(null!=e?e.url:e))?i:o,r={name:"url",hash:{},fn:this.program(3,a),inverse:this.noop,data:a},s=typeof i===l?i.call(e,r):i,t.url||(s=u.call(e,s,r)),null!=s&&(h+=s),h+"\n  </ul>\n</div>\n<ul class='endpoints' id='"+p((i=null!=(i=t.id||(null!=e?e.id:e))?i:o,typeof i===l?i.call(e,{name:"id",hash:{},data:a}):i))+"_endpoint_list' style='display:none'>\n\n</ul>\n"},useData:!0});var ResponseContentTypeView,__extends=function(e,t){function n(){this.constructor=e}for(var a in t)__hasProp.call(t,a)&&(e[a]=t[a]);return n.prototype=t.prototype,e.prototype=new n,e.__super__=t.prototype,e},__hasProp={}.hasOwnProperty;ResponseContentTypeView=function(e){function t(){return t.__super__.constructor.apply(this,arguments)}return __extends(t,e),t.prototype.initialize=function(){},t.prototype.render=function(){var e;return e=this.template(),$(this.el).html(e(this.model)),$("label[for=responseContentType]",$(this.el)).text("Response Content Type"),this},t.prototype.template=function(){return Handlebars.templates.response_content_type},t}(Backbone.View),this.Handlebars.templates.response_content_type=Handlebars.template({1:function(e,t,n,a){var s,i="";return s=t.each.call(e,null!=e?e.produces:e,{name:"each",hash:{},fn:this.program(2,a),inverse:this.noop,data:a}),null!=s&&(i+=s),i},2:function(e){var t,n=this.lambda,a='  <option value="';return t=n(e,e),null!=t&&(a+=t),a+='">',t=n(e,e),null!=t&&(a+=t),a+"</option>\n"},4:function(){return'  <option value="application/json">application/json</option>\n'},compiler:[6,">= 2.0.0-beta.1"],main:function(e,t,n,a){var s,i='<label for="responseContentType"></label>\n<select name="responseContentType">\n';return s=t["if"].call(e,null!=e?e.produces:e,{name:"if",hash:{},fn:this.program(1,a),inverse:this.program(4,a),data:a}),null!=s&&(i+=s),i+"</select>\n"},useData:!0});var SignatureView,__extends=function(e,t){function n(){this.constructor=e}for(var a in t)__hasProp.call(t,a)&&(e[a]=t[a]);return n.prototype=t.prototype,e.prototype=new n,e.__super__=t.prototype,e},__hasProp={}.hasOwnProperty;SignatureView=function(e){function t(){return t.__super__.constructor.apply(this,arguments)}return __extends(t,e),t.prototype.events={"click a.description-link":"switchToDescription","click a.snippet-link":"switchToSnippet","mousedown .snippet":"snippetToTextArea"},t.prototype.initialize=function(){},t.prototype.render=function(){var e;return e=this.template(),$(this.el).html(e(this.model)),this.switchToSnippet(),this.isParam=this.model.isParam,this.isParam&&$(".notice",$(this.el)).text("Click to set as parameter value"),this},t.prototype.template=function(){return Handlebars.templates.signature},t.prototype.switchToDescription=function(e){return null!=e&&e.preventDefault(),$(".snippet",$(this.el)).hide(),$(".description",$(this.el)).show(),$(".description-link",$(this.el)).addClass("selected"),$(".snippet-link",$(this.el)).removeClass("selected")},t.prototype.switchToSnippet=function(e){return null!=e&&e.preventDefault(),$(".description",$(this.el)).hide(),$(".snippet",$(this.el)).show(),$(".snippet-link",$(this.el)).addClass("selected"),$(".description-link",$(this.el)).removeClass("selected")},t.prototype.snippetToTextArea=function(e){var t;return this.isParam&&(null!=e&&e.preventDefault(),t=$("textarea",$(this.el.parentNode.parentNode.parentNode)),""===$.trim(t.val()))?t.val(this.model.sampleJSON):void 0},t}(Backbone.View),this.Handlebars.templates.signature=Handlebars.template({compiler:[6,">= 2.0.0-beta.1"],main:function(e,t,n,a){var s,i,r="function",l=t.helperMissing,o=this.escapeExpression,p='<div>\n<ul class="signature-nav">\n  <li><a class="description-link" href="#">Model</a></li>\n  <li><a class="snippet-link" href="#">Model Schema</a></li>\n</ul>\n<div>\n\n<div class="signature-container">\n  <div class="description">\n    ';return i=null!=(i=t.signature||(null!=e?e.signature:e))?i:l,s=typeof i===r?i.call(e,{name:"signature",hash:{},data:a}):i,null!=s&&(p+=s),p+'\n  </div>\n\n  <div class="snippet">\n    <pre><code>'+o((i=null!=(i=t.sampleJSON||(null!=e?e.sampleJSON:e))?i:l,typeof i===r?i.call(e,{name:"sampleJSON",hash:{},data:a}):i))+'</code></pre>\n    <small class="notice"></small>\n  </div>\n</div>\n\n'},useData:!0});var StatusCodeView,__extends=function(e,t){function n(){this.constructor=e}for(var a in t)__hasProp.call(t,a)&&(e[a]=t[a]);return n.prototype=t.prototype,e.prototype=new n,e.__super__=t.prototype,e},__hasProp={}.hasOwnProperty;StatusCodeView=function(e){function t(){return t.__super__.constructor.apply(this,arguments)}return __extends(t,e),t.prototype.initialize=function(){},t.prototype.render=function(){var e,t,n;return n=this.template(),$(this.el).html(n(this.model)),swaggerUi.api.models.hasOwnProperty(this.model.responseModel)?(e={sampleJSON:JSON.stringify(swaggerUi.api.models[this.model.responseModel].createJSONSample(),null,2),isParam:!1,signature:swaggerUi.api.models[this.model.responseModel].getMockSignature()},t=new SignatureView({model:e,tagName:"div"}),$(".model-signature",this.$el).append(t.render().el)):$(".model-signature",this.$el).html(""),this},t.prototype.template=function(){return Handlebars.templates.status_code},t}(Backbone.View),this.Handlebars.templates.status_code=Handlebars.template({compiler:[6,">= 2.0.0-beta.1"],main:function(e,t,n,a){var s,i,r="function",l=t.helperMissing,o=this.escapeExpression,p="<td width='15%' class='code'>"+o((i=null!=(i=t.code||(null!=e?e.code:e))?i:l,typeof i===r?i.call(e,{name:"code",hash:{},data:a}):i))+"</td>\n<td>";return i=null!=(i=t.message||(null!=e?e.message:e))?i:l,s=typeof i===r?i.call(e,{name:"message",hash:{},data:a}):i,null!=s&&(p+=s),p+"</td>\n<td width='50%'><span class=\"model-signature\" /></td>"},useData:!0});`)
+
+func third_partySwaggerUiSwaggerUiMinJsBytes() ([]byte, error) {
+	return _third_partySwaggerUiSwaggerUiMinJs, nil
+}
+
+func third_partySwaggerUiSwaggerUiMinJs() (*asset, error) {
+	bytes, err := third_partySwaggerUiSwaggerUiMinJsBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "third_party/swagger-ui/swagger-ui.min.js", size: 63466, mode: os.FileMode(420), modTime: time.Unix(1503320355, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+// Asset loads and returns the asset for the given name.
+// It returns an error if the asset could not be found or
+// could not be loaded.
+func Asset(name string) ([]byte, error) {
+	cannonicalName := strings.Replace(name, "\\", "/", -1)
+	if f, ok := _bindata[cannonicalName]; ok {
+		a, err := f()
+		if err != nil {
+			return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err)
+		}
+		return a.bytes, nil
+	}
+	return nil, fmt.Errorf("Asset %s not found", name)
+}
+
+// MustAsset is like Asset but panics when Asset would return an error.
+// It simplifies safe initialization of global variables.
+func MustAsset(name string) []byte {
+	a, err := Asset(name)
+	if err != nil {
+		panic("asset: Asset(" + name + "): " + err.Error())
+	}
+
+	return a
+}
+
+// AssetInfo loads and returns the asset info for the given name.
+// It returns an error if the asset could not be found or
+// could not be loaded.
+func AssetInfo(name string) (os.FileInfo, error) {
+	cannonicalName := strings.Replace(name, "\\", "/", -1)
+	if f, ok := _bindata[cannonicalName]; ok {
+		a, err := f()
+		if err != nil {
+			return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err)
+		}
+		return a.info, nil
+	}
+	return nil, fmt.Errorf("AssetInfo %s not found", name)
+}
+
+// AssetNames returns the names of the assets.
+func AssetNames() []string {
+	names := make([]string, 0, len(_bindata))
+	for name := range _bindata {
+		names = append(names, name)
+	}
+	return names
+}
+
+// _bindata is a table, holding each asset generator, mapped to its name.
+var _bindata = map[string]func() (*asset, error){
+	"third_party/swagger-ui/LICENSE":                                 third_partySwaggerUiLicense,
+	"third_party/swagger-ui/README.md":                               third_partySwaggerUiReadmeMd,
+	"third_party/swagger-ui/css/reset.css":                           third_partySwaggerUiCssResetCss,
+	"third_party/swagger-ui/css/screen.css":                          third_partySwaggerUiCssScreenCss,
+	"third_party/swagger-ui/css/typography.css":                      third_partySwaggerUiCssTypographyCss,
+	"third_party/swagger-ui/fonts/droid-sans-v6-latin-700.eot":       third_partySwaggerUiFontsDroidSansV6Latin700Eot,
+	"third_party/swagger-ui/fonts/droid-sans-v6-latin-700.svg":       third_partySwaggerUiFontsDroidSansV6Latin700Svg,
+	"third_party/swagger-ui/fonts/droid-sans-v6-latin-700.ttf":       third_partySwaggerUiFontsDroidSansV6Latin700Ttf,
+	"third_party/swagger-ui/fonts/droid-sans-v6-latin-700.woff":      third_partySwaggerUiFontsDroidSansV6Latin700Woff,
+	"third_party/swagger-ui/fonts/droid-sans-v6-latin-700.woff2":     third_partySwaggerUiFontsDroidSansV6Latin700Woff2,
+	"third_party/swagger-ui/fonts/droid-sans-v6-latin-regular.eot":   third_partySwaggerUiFontsDroidSansV6LatinRegularEot,
+	"third_party/swagger-ui/fonts/droid-sans-v6-latin-regular.svg":   third_partySwaggerUiFontsDroidSansV6LatinRegularSvg,
+	"third_party/swagger-ui/fonts/droid-sans-v6-latin-regular.ttf":   third_partySwaggerUiFontsDroidSansV6LatinRegularTtf,
+	"third_party/swagger-ui/fonts/droid-sans-v6-latin-regular.woff":  third_partySwaggerUiFontsDroidSansV6LatinRegularWoff,
+	"third_party/swagger-ui/fonts/droid-sans-v6-latin-regular.woff2": third_partySwaggerUiFontsDroidSansV6LatinRegularWoff2,
+	"third_party/swagger-ui/images/explorer_icons.png":               third_partySwaggerUiImagesExplorer_iconsPng,
+	"third_party/swagger-ui/images/logo_small.png":                   third_partySwaggerUiImagesLogo_smallPng,
+	"third_party/swagger-ui/images/pet_store_api.png":                third_partySwaggerUiImagesPet_store_apiPng,
+	"third_party/swagger-ui/images/throbber.gif":                     third_partySwaggerUiImagesThrobberGif,
+	"third_party/swagger-ui/images/wordnik_api.png":                  third_partySwaggerUiImagesWordnik_apiPng,
+	"third_party/swagger-ui/index.html":                              third_partySwaggerUiIndexHtml,
+	"third_party/swagger-ui/lib/backbone-min.js":                     third_partySwaggerUiLibBackboneMinJs,
+	"third_party/swagger-ui/lib/handlebars-1.0.0.js":                 third_partySwaggerUiLibHandlebars100Js,
+	"third_party/swagger-ui/lib/handlebars-2.0.0.js":                 third_partySwaggerUiLibHandlebars200Js,
+	"third_party/swagger-ui/lib/highlight.7.3.pack.js":               third_partySwaggerUiLibHighlight73PackJs,
+	"third_party/swagger-ui/lib/jquery-1.8.0.min.js":                 third_partySwaggerUiLibJquery180MinJs,
+	"third_party/swagger-ui/lib/jquery.ba-bbq.min.js":                third_partySwaggerUiLibJqueryBaBbqMinJs,
+	"third_party/swagger-ui/lib/jquery.slideto.min.js":               third_partySwaggerUiLibJquerySlidetoMinJs,
+	"third_party/swagger-ui/lib/jquery.wiggle.min.js":                third_partySwaggerUiLibJqueryWiggleMinJs,
+	"third_party/swagger-ui/lib/marked.js":                           third_partySwaggerUiLibMarkedJs,
+	"third_party/swagger-ui/lib/shred/content.js":                    third_partySwaggerUiLibShredContentJs,
+	"third_party/swagger-ui/lib/shred.bundle.js":                     third_partySwaggerUiLibShredBundleJs,
+	"third_party/swagger-ui/lib/swagger-client.js":                   third_partySwaggerUiLibSwaggerClientJs,
+	"third_party/swagger-ui/lib/swagger-oauth.js":                    third_partySwaggerUiLibSwaggerOauthJs,
+	"third_party/swagger-ui/lib/swagger.js":                          third_partySwaggerUiLibSwaggerJs,
+	"third_party/swagger-ui/lib/underscore-min.js":                   third_partySwaggerUiLibUnderscoreMinJs,
+	"third_party/swagger-ui/o2c.html":                                third_partySwaggerUiO2cHtml,
+	"third_party/swagger-ui/swagger-ui.js":                           third_partySwaggerUiSwaggerUiJs,
+	"third_party/swagger-ui/swagger-ui.min.js":                       third_partySwaggerUiSwaggerUiMinJs,
+}
+
+// AssetDir returns the file names below a certain
+// directory embedded in the file by go-bindata.
+// For example if you run go-bindata on data/... and data contains the
+// following hierarchy:
+//     data/
+//       foo.txt
+//       img/
+//         a.png
+//         b.png
+// then AssetDir("data") would return []string{"foo.txt", "img"}
+// AssetDir("data/img") would return []string{"a.png", "b.png"}
+// AssetDir("foo.txt") and AssetDir("notexist") would return an error
+// AssetDir("") will return []string{"data"}.
+func AssetDir(name string) ([]string, error) {
+	node := _bintree
+	if len(name) != 0 {
+		cannonicalName := strings.Replace(name, "\\", "/", -1)
+		pathList := strings.Split(cannonicalName, "/")
+		for _, p := range pathList {
+			node = node.Children[p]
+			if node == nil {
+				return nil, fmt.Errorf("Asset %s not found", name)
+			}
+		}
+	}
+	if node.Func != nil {
+		return nil, fmt.Errorf("Asset %s not found", name)
+	}
+	rv := make([]string, 0, len(node.Children))
+	for childName := range node.Children {
+		rv = append(rv, childName)
+	}
+	return rv, nil
+}
+
+type bintree struct {
+	Func     func() (*asset, error)
+	Children map[string]*bintree
+}
+
+var _bintree = &bintree{nil, map[string]*bintree{
+	"third_party": {nil, map[string]*bintree{
+		"swagger-ui": {nil, map[string]*bintree{
+			"LICENSE":   {third_partySwaggerUiLicense, map[string]*bintree{}},
+			"README.md": {third_partySwaggerUiReadmeMd, map[string]*bintree{}},
+			"css": {nil, map[string]*bintree{
+				"reset.css":      {third_partySwaggerUiCssResetCss, map[string]*bintree{}},
+				"screen.css":     {third_partySwaggerUiCssScreenCss, map[string]*bintree{}},
+				"typography.css": {third_partySwaggerUiCssTypographyCss, map[string]*bintree{}},
+			}},
+			"fonts": {nil, map[string]*bintree{
+				"droid-sans-v6-latin-700.eot":       {third_partySwaggerUiFontsDroidSansV6Latin700Eot, map[string]*bintree{}},
+				"droid-sans-v6-latin-700.svg":       {third_partySwaggerUiFontsDroidSansV6Latin700Svg, map[string]*bintree{}},
+				"droid-sans-v6-latin-700.ttf":       {third_partySwaggerUiFontsDroidSansV6Latin700Ttf, map[string]*bintree{}},
+				"droid-sans-v6-latin-700.woff":      {third_partySwaggerUiFontsDroidSansV6Latin700Woff, map[string]*bintree{}},
+				"droid-sans-v6-latin-700.woff2":     {third_partySwaggerUiFontsDroidSansV6Latin700Woff2, map[string]*bintree{}},
+				"droid-sans-v6-latin-regular.eot":   {third_partySwaggerUiFontsDroidSansV6LatinRegularEot, map[string]*bintree{}},
+				"droid-sans-v6-latin-regular.svg":   {third_partySwaggerUiFontsDroidSansV6LatinRegularSvg, map[string]*bintree{}},
+				"droid-sans-v6-latin-regular.ttf":   {third_partySwaggerUiFontsDroidSansV6LatinRegularTtf, map[string]*bintree{}},
+				"droid-sans-v6-latin-regular.woff":  {third_partySwaggerUiFontsDroidSansV6LatinRegularWoff, map[string]*bintree{}},
+				"droid-sans-v6-latin-regular.woff2": {third_partySwaggerUiFontsDroidSansV6LatinRegularWoff2, map[string]*bintree{}},
+			}},
+			"images": {nil, map[string]*bintree{
+				"explorer_icons.png": {third_partySwaggerUiImagesExplorer_iconsPng, map[string]*bintree{}},
+				"logo_small.png":     {third_partySwaggerUiImagesLogo_smallPng, map[string]*bintree{}},
+				"pet_store_api.png":  {third_partySwaggerUiImagesPet_store_apiPng, map[string]*bintree{}},
+				"throbber.gif":       {third_partySwaggerUiImagesThrobberGif, map[string]*bintree{}},
+				"wordnik_api.png":    {third_partySwaggerUiImagesWordnik_apiPng, map[string]*bintree{}},
+			}},
+			"index.html": {third_partySwaggerUiIndexHtml, map[string]*bintree{}},
+			"lib": {nil, map[string]*bintree{
+				"backbone-min.js":       {third_partySwaggerUiLibBackboneMinJs, map[string]*bintree{}},
+				"handlebars-1.0.0.js":   {third_partySwaggerUiLibHandlebars100Js, map[string]*bintree{}},
+				"handlebars-2.0.0.js":   {third_partySwaggerUiLibHandlebars200Js, map[string]*bintree{}},
+				"highlight.7.3.pack.js": {third_partySwaggerUiLibHighlight73PackJs, map[string]*bintree{}},
+				"jquery-1.8.0.min.js":   {third_partySwaggerUiLibJquery180MinJs, map[string]*bintree{}},
+				"jquery.ba-bbq.min.js":  {third_partySwaggerUiLibJqueryBaBbqMinJs, map[string]*bintree{}},
+				"jquery.slideto.min.js": {third_partySwaggerUiLibJquerySlidetoMinJs, map[string]*bintree{}},
+				"jquery.wiggle.min.js":  {third_partySwaggerUiLibJqueryWiggleMinJs, map[string]*bintree{}},
+				"marked.js":             {third_partySwaggerUiLibMarkedJs, map[string]*bintree{}},
+				"shred": {nil, map[string]*bintree{
+					"content.js": {third_partySwaggerUiLibShredContentJs, map[string]*bintree{}},
+				}},
+				"shred.bundle.js":   {third_partySwaggerUiLibShredBundleJs, map[string]*bintree{}},
+				"swagger-client.js": {third_partySwaggerUiLibSwaggerClientJs, map[string]*bintree{}},
+				"swagger-oauth.js":  {third_partySwaggerUiLibSwaggerOauthJs, map[string]*bintree{}},
+				"swagger.js":        {third_partySwaggerUiLibSwaggerJs, map[string]*bintree{}},
+				"underscore-min.js": {third_partySwaggerUiLibUnderscoreMinJs, map[string]*bintree{}},
+			}},
+			"o2c.html":          {third_partySwaggerUiO2cHtml, map[string]*bintree{}},
+			"swagger-ui.js":     {third_partySwaggerUiSwaggerUiJs, map[string]*bintree{}},
+			"swagger-ui.min.js": {third_partySwaggerUiSwaggerUiMinJs, map[string]*bintree{}},
+		}},
+	}},
+}}
+
+// RestoreAsset restores an asset under the given directory
+func RestoreAsset(dir, name string) error {
+	data, err := Asset(name)
+	if err != nil {
+		return err
+	}
+	info, err := AssetInfo(name)
+	if err != nil {
+		return err
+	}
+	err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755))
+	if err != nil {
+		return err
+	}
+	err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode())
+	if err != nil {
+		return err
+	}
+	err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime())
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// RestoreAssets restores an asset under the given directory recursively
+func RestoreAssets(dir, name string) error {
+	children, err := AssetDir(name)
+	// File
+	if err != nil {
+		return RestoreAsset(dir, name)
+	}
+	// Dir
+	for _, child := range children {
+		err = RestoreAssets(dir, filepath.Join(name, child))
+		if err != nil {
+			return err
+		}
+	}
+	return nil
+}
+
+func _filePath(dir, name string) string {
+	cannonicalName := strings.Replace(name, "\\", "/", -1)
+	return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/routes/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/routes/doc.go
new file mode 100644
index 0000000..adefbd3
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/routes/doc.go
@@ -0,0 +1,18 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+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.
+*/
+
+// Package routes holds a collection of optional genericapiserver http handlers.
+package routes
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/routes/flags.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/routes/flags.go
new file mode 100644
index 0000000..d40f114
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/routes/flags.go
@@ -0,0 +1,126 @@
+/*
+Copyright 2018 The Kubernetes Authors.
+
+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.
+*/
+
+package routes
+
+import (
+	"fmt"
+	"html/template"
+	"io/ioutil"
+	"net/http"
+	"path"
+	"sync"
+
+	"github.com/golang/glog"
+
+	"k8s.io/apiserver/pkg/server/mux"
+)
+
+var (
+	lock            = &sync.RWMutex{}
+	registeredFlags = map[string]debugFlag{}
+)
+
+// DebugFlags adds handlers for flags under /debug/flags.
+type DebugFlags struct {
+}
+
+// Install registers the APIServer's flags handler.
+func (f DebugFlags) Install(c *mux.PathRecorderMux, flag string, handler func(http.ResponseWriter, *http.Request)) {
+	c.UnlistedHandle("/debug/flags", http.HandlerFunc(f.Index))
+	c.UnlistedHandlePrefix("/debug/flags/", http.HandlerFunc(f.Index))
+
+	url := path.Join("/debug/flags", flag)
+	c.UnlistedHandleFunc(url, handler)
+
+	f.addFlag(flag)
+}
+
+// Index responds with the `/debug/flags` request.
+// For example, "/debug/flags/v" serves the "--v" flag.
+// Index responds to a request for "/debug/flags/" with an HTML page
+// listing the available flags.
+func (f DebugFlags) Index(w http.ResponseWriter, r *http.Request) {
+	lock.RLock()
+	defer lock.RUnlock()
+	if err := indexTmpl.Execute(w, registeredFlags); err != nil {
+		glog.Error(err)
+	}
+}
+
+var indexTmpl = template.Must(template.New("index").Parse(`<html>
+<head>
+<title>/debug/flags/</title>
+</head>
+<body>
+/debug/flags/<br>
+<br>
+flags:<br>
+<table>
+{{range .}}
+<tr>{{.Flag}}<br>
+{{end}}
+</table>
+<br>
+full flags configurable<br>
+</body>
+</html>
+`))
+
+type debugFlag struct {
+	Flag string
+}
+
+func (f DebugFlags) addFlag(flag string) {
+	lock.Lock()
+	defer lock.Unlock()
+	registeredFlags[flag] = debugFlag{flag}
+}
+
+// StringFlagSetterFunc is a func used for setting string type flag.
+type StringFlagSetterFunc func(string) (string, error)
+
+// StringFlagPutHandler wraps an http Handler to set string type flag.
+func StringFlagPutHandler(setter StringFlagSetterFunc) http.HandlerFunc {
+	return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
+		switch {
+		case req.Method == "PUT":
+			body, err := ioutil.ReadAll(req.Body)
+			if err != nil {
+				writePlainText(http.StatusBadRequest, "error reading request body: "+err.Error(), w)
+				return
+			}
+			defer req.Body.Close()
+			response, err := setter(string(body))
+			if err != nil {
+				writePlainText(http.StatusBadRequest, err.Error(), w)
+				return
+			}
+			writePlainText(http.StatusOK, response, w)
+			return
+		default:
+			writePlainText(http.StatusNotAcceptable, "unsupported http method", w)
+			return
+		}
+	})
+}
+
+// writePlainText renders a simple string response.
+func writePlainText(statusCode int, text string, w http.ResponseWriter) {
+	w.Header().Set("Content-Type", "text/plain")
+	w.WriteHeader(statusCode)
+	fmt.Fprintln(w, text)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/routes/index.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/routes/index.go
new file mode 100644
index 0000000..1407579
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/routes/index.go
@@ -0,0 +1,69 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package routes
+
+import (
+	"net/http"
+
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/util/sets"
+	"k8s.io/apiserver/pkg/endpoints/handlers/responsewriters"
+	"k8s.io/apiserver/pkg/server/mux"
+)
+
+// ListedPathProvider is an interface for providing paths that should be reported at /.
+type ListedPathProvider interface {
+	// ListedPaths is an alphabetically sorted list of paths to be reported at /.
+	ListedPaths() []string
+}
+
+// ListedPathProviders is a convenient way to combine multiple ListedPathProviders
+type ListedPathProviders []ListedPathProvider
+
+// ListedPaths unions and sorts the included paths.
+func (p ListedPathProviders) ListedPaths() []string {
+	ret := sets.String{}
+	for _, provider := range p {
+		for _, path := range provider.ListedPaths() {
+			ret.Insert(path)
+		}
+	}
+
+	return ret.List()
+}
+
+// Index provides a webservice for the http root / listing all known paths.
+type Index struct{}
+
+// Install adds the Index webservice to the given mux.
+func (i Index) Install(pathProvider ListedPathProvider, mux *mux.PathRecorderMux) {
+	handler := IndexLister{StatusCode: http.StatusOK, PathProvider: pathProvider}
+
+	mux.UnlistedHandle("/", handler)
+	mux.UnlistedHandle("/index.html", handler)
+}
+
+// IndexLister lists the available indexes with the status code provided
+type IndexLister struct {
+	StatusCode   int
+	PathProvider ListedPathProvider
+}
+
+// ServeHTTP serves the available paths.
+func (i IndexLister) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+	responsewriters.WriteRawJSON(i.StatusCode, metav1.RootPaths{Paths: i.PathProvider.ListedPaths()}, w)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/routes/metrics.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/routes/metrics.go
new file mode 100644
index 0000000..ee158c2
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/routes/metrics.go
@@ -0,0 +1,62 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package routes
+
+import (
+	"io"
+	"net/http"
+
+	apimetrics "k8s.io/apiserver/pkg/endpoints/metrics"
+	"k8s.io/apiserver/pkg/server/mux"
+	etcdmetrics "k8s.io/apiserver/pkg/storage/etcd/metrics"
+
+	"github.com/prometheus/client_golang/prometheus"
+)
+
+// DefaultMetrics installs the default prometheus metrics handler
+type DefaultMetrics struct{}
+
+// Install adds the DefaultMetrics handler
+func (m DefaultMetrics) Install(c *mux.PathRecorderMux) {
+	register()
+	c.Handle("/metrics", prometheus.Handler())
+}
+
+// MetricsWithReset install the prometheus metrics handler extended with support for the DELETE method
+// which resets the metrics.
+type MetricsWithReset struct{}
+
+// Install adds the MetricsWithReset handler
+func (m MetricsWithReset) Install(c *mux.PathRecorderMux) {
+	register()
+	defaultMetricsHandler := prometheus.Handler().ServeHTTP
+	c.HandleFunc("/metrics", func(w http.ResponseWriter, req *http.Request) {
+		if req.Method == "DELETE" {
+			apimetrics.Reset()
+			etcdmetrics.Reset()
+			io.WriteString(w, "metrics reset\n")
+			return
+		}
+		defaultMetricsHandler(w, req)
+	})
+}
+
+// register apiserver and etcd metrics
+func register() {
+	apimetrics.Register()
+	etcdmetrics.Register()
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/routes/openapi.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/routes/openapi.go
new file mode 100644
index 0000000..06c723d
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/routes/openapi.go
@@ -0,0 +1,46 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package routes
+
+import (
+	restful "github.com/emicklei/go-restful"
+	"github.com/golang/glog"
+
+	"k8s.io/apiserver/pkg/server/mux"
+	"k8s.io/kube-openapi/pkg/common"
+	"k8s.io/kube-openapi/pkg/handler"
+)
+
+// OpenAPI installs spec endpoints for each web service.
+type OpenAPI struct {
+	Config *common.Config
+}
+
+// Install adds the SwaggerUI webservice to the given mux.
+func (oa OpenAPI) Install(c *restful.Container, mux *mux.PathRecorderMux) {
+	// NOTE: [DEPRECATION] We will announce deprecation for format-separated endpoints for OpenAPI spec,
+	// and switch to a single /openapi/v2 endpoint in Kubernetes 1.10. The design doc and deprecation process
+	// are tracked at: https://docs.google.com/document/d/19lEqE9lc4yHJ3WJAJxS_G7TcORIJXGHyq3wpwcH28nU.
+	_, err := handler.BuildAndRegisterOpenAPIService("/swagger.json", c.RegisteredWebServices(), oa.Config, mux)
+	if err != nil {
+		glog.Fatalf("Failed to register open api spec for root: %v", err)
+	}
+	_, err = handler.BuildAndRegisterOpenAPIVersionedService("/openapi/v2", c.RegisteredWebServices(), oa.Config, mux)
+	if err != nil {
+		glog.Fatalf("Failed to register versioned open api spec for root: %v", err)
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/routes/profiling.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/routes/profiling.go
new file mode 100644
index 0000000..f09a966
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/routes/profiling.go
@@ -0,0 +1,36 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package routes
+
+import (
+	"net/http"
+	"net/http/pprof"
+
+	"k8s.io/apiserver/pkg/server/mux"
+)
+
+// Profiling adds handlers for pprof under /debug/pprof.
+type Profiling struct{}
+
+// Install adds the Profiling webservice to the given mux.
+func (d Profiling) Install(c *mux.PathRecorderMux) {
+	c.UnlistedHandle("/debug/pprof", http.HandlerFunc(pprof.Index))
+	c.UnlistedHandlePrefix("/debug/pprof/", http.HandlerFunc(pprof.Index))
+	c.UnlistedHandleFunc("/debug/pprof/profile", pprof.Profile)
+	c.UnlistedHandleFunc("/debug/pprof/symbol", pprof.Symbol)
+	c.UnlistedHandleFunc("/debug/pprof/trace", pprof.Trace)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/routes/swagger.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/routes/swagger.go
new file mode 100644
index 0000000..08e342e
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/routes/swagger.go
@@ -0,0 +1,36 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package routes
+
+import (
+	"github.com/emicklei/go-restful"
+	"github.com/emicklei/go-restful-swagger12"
+)
+
+// Swagger installs the /swaggerapi/ endpoint to allow schema discovery
+// and traversal. It is optional to allow consumers of the Kubernetes GenericAPIServer to
+// register their own web services into the Kubernetes mux prior to initialization
+// of swagger, so that other resource types show up in the documentation.
+type Swagger struct {
+	Config *swagger.Config
+}
+
+// Install adds the SwaggerUI webservice to the given mux.
+func (s Swagger) Install(c *restful.Container) {
+	s.Config.WebServices = c.RegisteredWebServices()
+	swagger.RegisterSwaggerService(*s.Config, c)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/routes/swaggerui.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/routes/swaggerui.go
new file mode 100644
index 0000000..637356f
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/routes/swaggerui.go
@@ -0,0 +1,40 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package routes
+
+import (
+	"net/http"
+
+	assetfs "github.com/elazarl/go-bindata-assetfs"
+
+	"k8s.io/apiserver/pkg/server/mux"
+	"k8s.io/apiserver/pkg/server/routes/data/swagger"
+)
+
+// SwaggerUI exposes files in third_party/swagger-ui/ under /swagger-ui.
+type SwaggerUI struct{}
+
+// Install adds the SwaggerUI webservice to the given mux.
+func (l SwaggerUI) Install(c *mux.PathRecorderMux) {
+	fileServer := http.FileServer(&assetfs.AssetFS{
+		Asset:    swagger.Asset,
+		AssetDir: swagger.AssetDir,
+		Prefix:   "third_party/swagger-ui",
+	})
+	prefix := "/swagger-ui/"
+	c.HandlePrefix(prefix, http.StripPrefix(prefix, fileServer))
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/routes/version.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/routes/version.go
new file mode 100644
index 0000000..dd9ab0d
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/routes/version.go
@@ -0,0 +1,57 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package routes
+
+import (
+	"net/http"
+
+	"github.com/emicklei/go-restful"
+
+	"k8s.io/apimachinery/pkg/version"
+	"k8s.io/apiserver/pkg/endpoints/handlers/responsewriters"
+)
+
+// Version provides a webservice with version information.
+type Version struct {
+	Version *version.Info
+}
+
+// Install registers the APIServer's `/version` handler.
+func (v Version) Install(c *restful.Container) {
+	if v.Version == nil {
+		return
+	}
+
+	// Set up a service to return the git code version.
+	versionWS := new(restful.WebService)
+	versionWS.Path("/version")
+	versionWS.Doc("git code version from which this is built")
+	versionWS.Route(
+		versionWS.GET("/").To(v.handleVersion).
+			Doc("get the code version").
+			Operation("getCodeVersion").
+			Produces(restful.MIME_JSON).
+			Consumes(restful.MIME_JSON).
+			Writes(version.Info{}))
+
+	c.Add(versionWS)
+}
+
+// handleVersion writes the server's version information.
+func (v Version) handleVersion(req *restful.Request, resp *restful.Response) {
+	responsewriters.WriteRawJSON(http.StatusOK, *v.Version, resp.ResponseWriter)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/serve.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/serve.go
new file mode 100644
index 0000000..7cfc103
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/serve.go
@@ -0,0 +1,214 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package server
+
+import (
+	"context"
+	"crypto/tls"
+	"crypto/x509"
+	"fmt"
+	"net"
+	"net/http"
+	"strings"
+	"time"
+
+	"github.com/golang/glog"
+	"golang.org/x/net/http2"
+
+	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
+	"k8s.io/apimachinery/pkg/util/validation"
+)
+
+const (
+	defaultKeepAlivePeriod = 3 * time.Minute
+)
+
+// serveSecurely runs the secure http server. It fails only if certificates cannot
+// be loaded or the initial listen call fails. The actual server loop (stoppable by closing
+// stopCh) runs in a go routine, i.e. serveSecurely does not block.
+func (s *SecureServingInfo) Serve(handler http.Handler, shutdownTimeout time.Duration, stopCh <-chan struct{}) error {
+	if s.Listener == nil {
+		return fmt.Errorf("listener must not be nil")
+	}
+
+	secureServer := &http.Server{
+		Addr:           s.Listener.Addr().String(),
+		Handler:        handler,
+		MaxHeaderBytes: 1 << 20,
+		TLSConfig: &tls.Config{
+			NameToCertificate: s.SNICerts,
+			// Can't use SSLv3 because of POODLE and BEAST
+			// Can't use TLSv1.0 because of POODLE and BEAST using CBC cipher
+			// Can't use TLSv1.1 because of RC4 cipher usage
+			MinVersion: tls.VersionTLS12,
+			// enable HTTP2 for go's 1.7 HTTP Server
+			NextProtos: []string{"h2", "http/1.1"},
+		},
+	}
+
+	if s.MinTLSVersion > 0 {
+		secureServer.TLSConfig.MinVersion = s.MinTLSVersion
+	}
+	if len(s.CipherSuites) > 0 {
+		secureServer.TLSConfig.CipherSuites = s.CipherSuites
+	}
+
+	if s.Cert != nil {
+		secureServer.TLSConfig.Certificates = []tls.Certificate{*s.Cert}
+	}
+
+	// append all named certs. Otherwise, the go tls stack will think no SNI processing
+	// is necessary because there is only one cert anyway.
+	// Moreover, if ServerCert.CertFile/ServerCert.KeyFile are not set, the first SNI
+	// cert will become the default cert. That's what we expect anyway.
+	for _, c := range s.SNICerts {
+		secureServer.TLSConfig.Certificates = append(secureServer.TLSConfig.Certificates, *c)
+	}
+
+	if s.ClientCA != nil {
+		// Populate PeerCertificates in requests, but don't reject connections without certificates
+		// This allows certificates to be validated by authenticators, while still allowing other auth types
+		secureServer.TLSConfig.ClientAuth = tls.RequestClientCert
+		// Specify allowed CAs for client certificates
+		secureServer.TLSConfig.ClientCAs = s.ClientCA
+	}
+
+	if s.HTTP2MaxStreamsPerConnection > 0 {
+		http2.ConfigureServer(secureServer, &http2.Server{
+			MaxConcurrentStreams: uint32(s.HTTP2MaxStreamsPerConnection),
+		})
+	}
+
+	glog.Infof("Serving securely on %s", secureServer.Addr)
+	return RunServer(secureServer, s.Listener, shutdownTimeout, stopCh)
+}
+
+// RunServer listens on the given port if listener is not given,
+// then spawns a go-routine continuously serving
+// until the stopCh is closed. This function does not block.
+// TODO: make private when insecure serving is gone from the kube-apiserver
+func RunServer(
+	server *http.Server,
+	ln net.Listener,
+	shutDownTimeout time.Duration,
+	stopCh <-chan struct{},
+) error {
+	if ln == nil {
+		return fmt.Errorf("listener must not be nil")
+	}
+
+	// Shutdown server gracefully.
+	go func() {
+		<-stopCh
+		ctx, cancel := context.WithTimeout(context.Background(), shutDownTimeout)
+		server.Shutdown(ctx)
+		cancel()
+	}()
+
+	go func() {
+		defer utilruntime.HandleCrash()
+
+		var listener net.Listener
+		listener = tcpKeepAliveListener{ln.(*net.TCPListener)}
+		if server.TLSConfig != nil {
+			listener = tls.NewListener(listener, server.TLSConfig)
+		}
+
+		err := server.Serve(listener)
+
+		msg := fmt.Sprintf("Stopped listening on %s", ln.Addr().String())
+		select {
+		case <-stopCh:
+			glog.Info(msg)
+		default:
+			panic(fmt.Sprintf("%s due to error: %v", msg, err))
+		}
+	}()
+
+	return nil
+}
+
+type NamedTLSCert struct {
+	TLSCert tls.Certificate
+
+	// names is a list of domain patterns: fully qualified domain names, possibly prefixed with
+	// wildcard segments.
+	Names []string
+}
+
+// getNamedCertificateMap returns a map of *tls.Certificate by name. It's is
+// suitable for use in tls.Config#NamedCertificates. Returns an error if any of the certs
+// cannot be loaded. Returns nil if len(certs) == 0
+func GetNamedCertificateMap(certs []NamedTLSCert) (map[string]*tls.Certificate, error) {
+	// register certs with implicit names first, reverse order such that earlier trump over the later
+	byName := map[string]*tls.Certificate{}
+	for i := len(certs) - 1; i >= 0; i-- {
+		if len(certs[i].Names) > 0 {
+			continue
+		}
+		cert := &certs[i].TLSCert
+
+		// read names from certificate common names and DNS names
+		if len(cert.Certificate) == 0 {
+			return nil, fmt.Errorf("empty SNI certificate, skipping")
+		}
+		x509Cert, err := x509.ParseCertificate(cert.Certificate[0])
+		if err != nil {
+			return nil, fmt.Errorf("parse error for SNI certificate: %v", err)
+		}
+		cn := x509Cert.Subject.CommonName
+		if cn == "*" || len(validation.IsDNS1123Subdomain(strings.TrimPrefix(cn, "*."))) == 0 {
+			byName[cn] = cert
+		}
+		for _, san := range x509Cert.DNSNames {
+			byName[san] = cert
+		}
+		// intentionally all IPs in the cert are ignored as SNI forbids passing IPs
+		// to select a cert. Before go 1.6 the tls happily passed IPs as SNI values.
+	}
+
+	// register certs with explicit names last, overwriting every of the implicit ones,
+	// again in reverse order.
+	for i := len(certs) - 1; i >= 0; i-- {
+		namedCert := &certs[i]
+		for _, name := range namedCert.Names {
+			byName[name] = &certs[i].TLSCert
+		}
+	}
+
+	return byName, nil
+}
+
+// tcpKeepAliveListener sets TCP keep-alive timeouts on accepted
+// connections. It's used by ListenAndServe and ListenAndServeTLS so
+// dead TCP connections (e.g. closing laptop mid-download) eventually
+// go away.
+//
+// Copied from Go 1.7.2 net/http/server.go
+type tcpKeepAliveListener struct {
+	*net.TCPListener
+}
+
+func (ln tcpKeepAliveListener) Accept() (net.Conn, error) {
+	tc, err := ln.AcceptTCP()
+	if err != nil {
+		return nil, err
+	}
+	tc.SetKeepAlive(true)
+	tc.SetKeepAlivePeriod(defaultKeepAlivePeriod)
+	return tc, nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/signal.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/signal.go
new file mode 100644
index 0000000..1cd8cef
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/signal.go
@@ -0,0 +1,43 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package server
+
+import (
+	"os"
+	"os/signal"
+)
+
+var onlyOneSignalHandler = make(chan struct{})
+
+// SetupSignalHandler registered for SIGTERM and SIGINT. A stop channel is returned
+// which is closed on one of these signals. If a second signal is caught, the program
+// is terminated with exit code 1.
+func SetupSignalHandler() (stopCh <-chan struct{}) {
+	close(onlyOneSignalHandler) // panics when called twice
+
+	stop := make(chan struct{})
+	c := make(chan os.Signal, 2)
+	signal.Notify(c, shutdownSignals...)
+	go func() {
+		<-c
+		close(stop)
+		<-c
+		os.Exit(1) // second signal. Exit directly.
+	}()
+
+	return stop
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/signal_posix.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/signal_posix.go
new file mode 100644
index 0000000..11b3bba
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/signal_posix.go
@@ -0,0 +1,26 @@
+// +build !windows
+
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package server
+
+import (
+	"os"
+	"syscall"
+)
+
+var shutdownSignals = []os.Signal{os.Interrupt, syscall.SIGTERM}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/signal_windows.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/signal_windows.go
new file mode 100644
index 0000000..e7645a2
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/signal_windows.go
@@ -0,0 +1,23 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package server
+
+import (
+	"os"
+)
+
+var shutdownSignals = []os.Signal{os.Interrupt}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/storage/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/storage/doc.go
new file mode 100644
index 0000000..71d4e2b
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/storage/doc.go
@@ -0,0 +1,18 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+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.
+*/
+
+// Package storage contains the plumbing to setup the etcd storage of the apiserver.
+package storage
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/storage/resource_config.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/storage/resource_config.go
new file mode 100644
index 0000000..d16be42
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/storage/resource_config.go
@@ -0,0 +1,83 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package storage
+
+import (
+	"k8s.io/apimachinery/pkg/runtime/schema"
+)
+
+// APIResourceConfigSource is the interface to determine which groups and versions are enabled
+type APIResourceConfigSource interface {
+	VersionEnabled(version schema.GroupVersion) bool
+	AnyVersionForGroupEnabled(group string) bool
+}
+
+var _ APIResourceConfigSource = &ResourceConfig{}
+
+type ResourceConfig struct {
+	GroupVersionConfigs map[schema.GroupVersion]bool
+}
+
+func NewResourceConfig() *ResourceConfig {
+	return &ResourceConfig{GroupVersionConfigs: map[schema.GroupVersion]bool{}}
+}
+
+func (o *ResourceConfig) DisableAll() {
+	for k := range o.GroupVersionConfigs {
+		o.GroupVersionConfigs[k] = false
+	}
+}
+
+func (o *ResourceConfig) EnableAll() {
+	for k := range o.GroupVersionConfigs {
+		o.GroupVersionConfigs[k] = true
+	}
+}
+
+// DisableVersions disables the versions entirely.
+func (o *ResourceConfig) DisableVersions(versions ...schema.GroupVersion) {
+	for _, version := range versions {
+		o.GroupVersionConfigs[version] = false
+	}
+}
+
+func (o *ResourceConfig) EnableVersions(versions ...schema.GroupVersion) {
+	for _, version := range versions {
+		o.GroupVersionConfigs[version] = true
+	}
+}
+
+func (o *ResourceConfig) VersionEnabled(version schema.GroupVersion) bool {
+	enabled, _ := o.GroupVersionConfigs[version]
+	if enabled {
+		return true
+	}
+
+	return false
+}
+
+func (o *ResourceConfig) AnyVersionForGroupEnabled(group string) bool {
+	for version := range o.GroupVersionConfigs {
+		if version.Group == group {
+			if o.VersionEnabled(version) {
+				return true
+			}
+		}
+	}
+
+	return false
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/storage/resource_encoding_config.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/storage/resource_encoding_config.go
new file mode 100644
index 0000000..eff1fe8
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/storage/resource_encoding_config.go
@@ -0,0 +1,119 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package storage
+
+import (
+	"fmt"
+
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+)
+
+type ResourceEncodingConfig interface {
+	// StorageEncoding returns the serialization format for the resource.
+	// TODO this should actually return a GroupVersionKind since you can logically have multiple "matching" Kinds
+	// For now, it returns just the GroupVersion for consistency with old behavior
+	StorageEncodingFor(schema.GroupResource) (schema.GroupVersion, error)
+
+	// InMemoryEncodingFor returns the groupVersion for the in memory representation the storage should convert to.
+	InMemoryEncodingFor(schema.GroupResource) (schema.GroupVersion, error)
+}
+
+type DefaultResourceEncodingConfig struct {
+	groups map[string]*GroupResourceEncodingConfig
+	scheme *runtime.Scheme
+}
+
+type GroupResourceEncodingConfig struct {
+	DefaultExternalEncoding   schema.GroupVersion
+	ExternalResourceEncodings map[string]schema.GroupVersion
+
+	DefaultInternalEncoding   schema.GroupVersion
+	InternalResourceEncodings map[string]schema.GroupVersion
+}
+
+var _ ResourceEncodingConfig = &DefaultResourceEncodingConfig{}
+
+func NewDefaultResourceEncodingConfig(scheme *runtime.Scheme) *DefaultResourceEncodingConfig {
+	return &DefaultResourceEncodingConfig{groups: map[string]*GroupResourceEncodingConfig{}, scheme: scheme}
+}
+
+func newGroupResourceEncodingConfig(defaultEncoding, defaultInternalVersion schema.GroupVersion) *GroupResourceEncodingConfig {
+	return &GroupResourceEncodingConfig{
+		DefaultExternalEncoding: defaultEncoding, ExternalResourceEncodings: map[string]schema.GroupVersion{},
+		DefaultInternalEncoding: defaultInternalVersion, InternalResourceEncodings: map[string]schema.GroupVersion{},
+	}
+}
+
+func (o *DefaultResourceEncodingConfig) SetVersionEncoding(group string, externalEncodingVersion, internalVersion schema.GroupVersion) {
+	_, groupExists := o.groups[group]
+	if !groupExists {
+		o.groups[group] = newGroupResourceEncodingConfig(externalEncodingVersion, internalVersion)
+	}
+
+	o.groups[group].DefaultExternalEncoding = externalEncodingVersion
+	o.groups[group].DefaultInternalEncoding = internalVersion
+}
+
+func (o *DefaultResourceEncodingConfig) SetResourceEncoding(resourceBeingStored schema.GroupResource, externalEncodingVersion, internalVersion schema.GroupVersion) {
+	group := resourceBeingStored.Group
+	_, groupExists := o.groups[group]
+	if !groupExists {
+		o.groups[group] = newGroupResourceEncodingConfig(externalEncodingVersion, internalVersion)
+	}
+
+	o.groups[group].ExternalResourceEncodings[resourceBeingStored.Resource] = externalEncodingVersion
+	o.groups[group].InternalResourceEncodings[resourceBeingStored.Resource] = internalVersion
+}
+
+func (o *DefaultResourceEncodingConfig) StorageEncodingFor(resource schema.GroupResource) (schema.GroupVersion, error) {
+	if !o.scheme.IsGroupRegistered(resource.Group) {
+		return schema.GroupVersion{}, fmt.Errorf("group %q is not registered in scheme", resource.Group)
+	}
+
+	groupEncoding, groupExists := o.groups[resource.Group]
+
+	if !groupExists {
+		// return the most preferred external version for the group
+		return o.scheme.PrioritizedVersionsForGroup(resource.Group)[0], nil
+	}
+
+	resourceOverride, resourceExists := groupEncoding.ExternalResourceEncodings[resource.Resource]
+	if !resourceExists {
+		return groupEncoding.DefaultExternalEncoding, nil
+	}
+
+	return resourceOverride, nil
+}
+
+func (o *DefaultResourceEncodingConfig) InMemoryEncodingFor(resource schema.GroupResource) (schema.GroupVersion, error) {
+	if !o.scheme.IsGroupRegistered(resource.Group) {
+		return schema.GroupVersion{}, fmt.Errorf("group %q is not registered in scheme", resource.Group)
+	}
+
+	groupEncoding, groupExists := o.groups[resource.Group]
+	if !groupExists {
+		return schema.GroupVersion{Group: resource.Group, Version: runtime.APIVersionInternal}, nil
+	}
+
+	resourceOverride, resourceExists := groupEncoding.InternalResourceEncodings[resource.Resource]
+	if !resourceExists {
+		return groupEncoding.DefaultInternalEncoding, nil
+	}
+
+	return resourceOverride, nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/storage/storage_codec.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/storage/storage_codec.go
new file mode 100644
index 0000000..bbdc4b9
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/storage/storage_codec.go
@@ -0,0 +1,108 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package storage
+
+import (
+	"fmt"
+	"mime"
+
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apimachinery/pkg/runtime/serializer/recognizer"
+	"k8s.io/apiserver/pkg/storage/storagebackend"
+
+	"github.com/golang/glog"
+)
+
+// StorageCodecConfig are the arguments passed to newStorageCodecFn
+type StorageCodecConfig struct {
+	StorageMediaType  string
+	StorageSerializer runtime.StorageSerializer
+	StorageVersion    schema.GroupVersion
+	MemoryVersion     schema.GroupVersion
+	Config            storagebackend.Config
+
+	EncoderDecoratorFn func(runtime.Encoder) runtime.Encoder
+	DecoderDecoratorFn func([]runtime.Decoder) []runtime.Decoder
+}
+
+// NewStorageCodec assembles a storage codec for the provided storage media type, the provided serializer, and the requested
+// storage and memory versions.
+func NewStorageCodec(opts StorageCodecConfig) (runtime.Codec, error) {
+	mediaType, _, err := mime.ParseMediaType(opts.StorageMediaType)
+	if err != nil {
+		return nil, fmt.Errorf("%q is not a valid mime-type", opts.StorageMediaType)
+	}
+
+	if opts.Config.Type == storagebackend.StorageTypeETCD2 && mediaType != "application/json" {
+		glog.Warningf(`storage type %q does not support media type %q, using "application/json"`, storagebackend.StorageTypeETCD2, mediaType)
+		mediaType = "application/json"
+	}
+
+	serializer, ok := runtime.SerializerInfoForMediaType(opts.StorageSerializer.SupportedMediaTypes(), mediaType)
+	if !ok {
+		return nil, fmt.Errorf("unable to find serializer for %q", mediaType)
+	}
+
+	s := serializer.Serializer
+
+	// make sure the selected encoder supports string data
+	if !serializer.EncodesAsText && opts.Config.Type == storagebackend.StorageTypeETCD2 {
+		return nil, fmt.Errorf("storage type %q does not support binary media type %q", storagebackend.StorageTypeETCD2, mediaType)
+	}
+
+	// Give callers the opportunity to wrap encoders and decoders.  For decoders, each returned decoder will
+	// be passed to the recognizer so that multiple decoders are available.
+	var encoder runtime.Encoder = s
+	if opts.EncoderDecoratorFn != nil {
+		encoder = opts.EncoderDecoratorFn(encoder)
+	}
+	decoders := []runtime.Decoder{
+		// selected decoder as the primary
+		s,
+		// universal deserializer as a fallback
+		opts.StorageSerializer.UniversalDeserializer(),
+		// base64-wrapped universal deserializer as a last resort.
+		// this allows reading base64-encoded protobuf, which should only exist if etcd2+protobuf was used at some point.
+		// data written that way could exist in etcd2, or could have been migrated to etcd3.
+		// TODO: flag this type of data if we encounter it, require migration (read to decode, write to persist using a supported encoder), and remove in 1.8
+		runtime.NewBase64Serializer(nil, opts.StorageSerializer.UniversalDeserializer()),
+	}
+	if opts.DecoderDecoratorFn != nil {
+		decoders = opts.DecoderDecoratorFn(decoders)
+	}
+
+	// Ensure the storage receives the correct version.
+	encoder = opts.StorageSerializer.EncoderForVersion(
+		encoder,
+		runtime.NewMultiGroupVersioner(
+			opts.StorageVersion,
+			schema.GroupKind{Group: opts.StorageVersion.Group},
+			schema.GroupKind{Group: opts.MemoryVersion.Group},
+		),
+	)
+	decoder := opts.StorageSerializer.DecoderToVersion(
+		recognizer.NewDecoder(decoders...),
+		runtime.NewMultiGroupVersioner(
+			opts.MemoryVersion,
+			schema.GroupKind{Group: opts.MemoryVersion.Group},
+			schema.GroupKind{Group: opts.StorageVersion.Group},
+		),
+	)
+
+	return runtime.NewCodec(encoder, decoder), nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/server/storage/storage_factory.go b/metrics-server/vendor/k8s.io/apiserver/pkg/server/storage/storage_factory.go
new file mode 100644
index 0000000..50c0682
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/server/storage/storage_factory.go
@@ -0,0 +1,350 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package storage
+
+import (
+	"crypto/tls"
+	"crypto/x509"
+	"io/ioutil"
+	"strings"
+
+	"github.com/golang/glog"
+
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apimachinery/pkg/util/sets"
+	"k8s.io/apiserver/pkg/features"
+	"k8s.io/apiserver/pkg/storage/storagebackend"
+	"k8s.io/apiserver/pkg/storage/value"
+	utilfeature "k8s.io/apiserver/pkg/util/feature"
+)
+
+// Backend describes the storage servers, the information here should be enough
+// for health validations.
+type Backend struct {
+	// the url of storage backend like: https://etcd.domain:2379
+	Server string
+	// the required tls config
+	TLSConfig *tls.Config
+}
+
+// StorageFactory is the interface to locate the storage for a given GroupResource
+type StorageFactory interface {
+	// New finds the storage destination for the given group and resource. It will
+	// return an error if the group has no storage destination configured.
+	NewConfig(groupResource schema.GroupResource) (*storagebackend.Config, error)
+
+	// ResourcePrefix returns the overridden resource prefix for the GroupResource
+	// This allows for cohabitation of resources with different native types and provides
+	// centralized control over the shape of etcd directories
+	ResourcePrefix(groupResource schema.GroupResource) string
+
+	// Backends gets all backends for all registered storage destinations.
+	// Used for getting all instances for health validations.
+	Backends() []Backend
+}
+
+// DefaultStorageFactory takes a GroupResource and returns back its storage interface.  This result includes:
+// 1. Merged etcd config, including: auth, server locations, prefixes
+// 2. Resource encodings for storage: group,version,kind to store as
+// 3. Cohabitating default: some resources like hpa are exposed through multiple APIs.  They must agree on 1 and 2
+type DefaultStorageFactory struct {
+	// StorageConfig describes how to create a storage backend in general.
+	// Its authentication information will be used for every storage.Interface returned.
+	StorageConfig storagebackend.Config
+
+	Overrides map[schema.GroupResource]groupResourceOverrides
+
+	DefaultResourcePrefixes map[schema.GroupResource]string
+
+	// DefaultMediaType is the media type used to store resources. If it is not set, "application/json" is used.
+	DefaultMediaType string
+
+	// DefaultSerializer is used to create encoders and decoders for the storage.Interface.
+	DefaultSerializer runtime.StorageSerializer
+
+	// ResourceEncodingConfig describes how to encode a particular GroupVersionResource
+	ResourceEncodingConfig ResourceEncodingConfig
+
+	// APIResourceConfigSource indicates whether the *storage* is enabled, NOT the API
+	// This is discrete from resource enablement because those are separate concerns.  How this source is configured
+	// is left to the caller.
+	APIResourceConfigSource APIResourceConfigSource
+
+	// newStorageCodecFn exists to be overwritten for unit testing.
+	newStorageCodecFn func(opts StorageCodecConfig) (codec runtime.Codec, err error)
+}
+
+type groupResourceOverrides struct {
+	// etcdLocation contains the list of "special" locations that are used for particular GroupResources
+	// These are merged on top of the StorageConfig when requesting the storage.Interface for a given GroupResource
+	etcdLocation []string
+	// etcdPrefix is the base location for a GroupResource.
+	etcdPrefix string
+	// etcdResourcePrefix is the location to use to store a particular type under the `etcdPrefix` location
+	// If empty, the default mapping is used.  If the default mapping doesn't contain an entry, it will use
+	// the ToLowered name of the resource, not including the group.
+	etcdResourcePrefix string
+	// mediaType is the desired serializer to choose. If empty, the default is chosen.
+	mediaType string
+	// serializer contains the list of "special" serializers for a GroupResource.  Resource=* means for the entire group
+	serializer runtime.StorageSerializer
+	// cohabitatingResources keeps track of which resources must be stored together.  This happens when we have multiple ways
+	// of exposing one set of concepts.  autoscaling.HPA and extensions.HPA as a for instance
+	// The order of the slice matters!  It is the priority order of lookup for finding a storage location
+	cohabitatingResources []schema.GroupResource
+	// encoderDecoratorFn is optional and may wrap the provided encoder prior to being serialized.
+	encoderDecoratorFn func(runtime.Encoder) runtime.Encoder
+	// decoderDecoratorFn is optional and may wrap the provided decoders (can add new decoders). The order of
+	// returned decoders will be priority for attempt to decode.
+	decoderDecoratorFn func([]runtime.Decoder) []runtime.Decoder
+	// transformer is optional and shall encrypt that resource at rest.
+	transformer value.Transformer
+	// disablePaging will prevent paging on the provided resource.
+	disablePaging bool
+}
+
+// Apply overrides the provided config and options if the override has a value in that position
+func (o groupResourceOverrides) Apply(config *storagebackend.Config, options *StorageCodecConfig) {
+	if len(o.etcdLocation) > 0 {
+		config.ServerList = o.etcdLocation
+	}
+	if len(o.etcdPrefix) > 0 {
+		config.Prefix = o.etcdPrefix
+	}
+
+	if len(o.mediaType) > 0 {
+		options.StorageMediaType = o.mediaType
+	}
+	if o.serializer != nil {
+		options.StorageSerializer = o.serializer
+	}
+	if o.encoderDecoratorFn != nil {
+		options.EncoderDecoratorFn = o.encoderDecoratorFn
+	}
+	if o.decoderDecoratorFn != nil {
+		options.DecoderDecoratorFn = o.decoderDecoratorFn
+	}
+	if o.transformer != nil {
+		config.Transformer = o.transformer
+	}
+	if o.disablePaging {
+		config.Paging = false
+	}
+}
+
+var _ StorageFactory = &DefaultStorageFactory{}
+
+const AllResources = "*"
+
+func NewDefaultStorageFactory(
+	config storagebackend.Config,
+	defaultMediaType string,
+	defaultSerializer runtime.StorageSerializer,
+	resourceEncodingConfig ResourceEncodingConfig,
+	resourceConfig APIResourceConfigSource,
+	specialDefaultResourcePrefixes map[schema.GroupResource]string,
+) *DefaultStorageFactory {
+	config.Paging = utilfeature.DefaultFeatureGate.Enabled(features.APIListChunking)
+	if len(defaultMediaType) == 0 {
+		defaultMediaType = runtime.ContentTypeJSON
+	}
+	return &DefaultStorageFactory{
+		StorageConfig:           config,
+		Overrides:               map[schema.GroupResource]groupResourceOverrides{},
+		DefaultMediaType:        defaultMediaType,
+		DefaultSerializer:       defaultSerializer,
+		ResourceEncodingConfig:  resourceEncodingConfig,
+		APIResourceConfigSource: resourceConfig,
+		DefaultResourcePrefixes: specialDefaultResourcePrefixes,
+
+		newStorageCodecFn: NewStorageCodec,
+	}
+}
+
+func (s *DefaultStorageFactory) SetEtcdLocation(groupResource schema.GroupResource, location []string) {
+	overrides := s.Overrides[groupResource]
+	overrides.etcdLocation = location
+	s.Overrides[groupResource] = overrides
+}
+
+func (s *DefaultStorageFactory) SetEtcdPrefix(groupResource schema.GroupResource, prefix string) {
+	overrides := s.Overrides[groupResource]
+	overrides.etcdPrefix = prefix
+	s.Overrides[groupResource] = overrides
+}
+
+// SetDisableAPIListChunking allows a specific resource to disable paging at the storage layer, to prevent
+// exposure of key names in continuations. This may be overridden by feature gates.
+func (s *DefaultStorageFactory) SetDisableAPIListChunking(groupResource schema.GroupResource) {
+	overrides := s.Overrides[groupResource]
+	overrides.disablePaging = true
+	s.Overrides[groupResource] = overrides
+}
+
+// SetResourceEtcdPrefix sets the prefix for a resource, but not the base-dir.  You'll end up in `etcdPrefix/resourceEtcdPrefix`.
+func (s *DefaultStorageFactory) SetResourceEtcdPrefix(groupResource schema.GroupResource, prefix string) {
+	overrides := s.Overrides[groupResource]
+	overrides.etcdResourcePrefix = prefix
+	s.Overrides[groupResource] = overrides
+}
+
+func (s *DefaultStorageFactory) SetSerializer(groupResource schema.GroupResource, mediaType string, serializer runtime.StorageSerializer) {
+	overrides := s.Overrides[groupResource]
+	overrides.mediaType = mediaType
+	overrides.serializer = serializer
+	s.Overrides[groupResource] = overrides
+}
+
+func (s *DefaultStorageFactory) SetTransformer(groupResource schema.GroupResource, transformer value.Transformer) {
+	overrides := s.Overrides[groupResource]
+	overrides.transformer = transformer
+	s.Overrides[groupResource] = overrides
+}
+
+// AddCohabitatingResources links resources together the order of the slice matters!  its the priority order of lookup for finding a storage location
+func (s *DefaultStorageFactory) AddCohabitatingResources(groupResources ...schema.GroupResource) {
+	for _, groupResource := range groupResources {
+		overrides := s.Overrides[groupResource]
+		overrides.cohabitatingResources = groupResources
+		s.Overrides[groupResource] = overrides
+	}
+}
+
+func (s *DefaultStorageFactory) AddSerializationChains(encoderDecoratorFn func(runtime.Encoder) runtime.Encoder, decoderDecoratorFn func([]runtime.Decoder) []runtime.Decoder, groupResources ...schema.GroupResource) {
+	for _, groupResource := range groupResources {
+		overrides := s.Overrides[groupResource]
+		overrides.encoderDecoratorFn = encoderDecoratorFn
+		overrides.decoderDecoratorFn = decoderDecoratorFn
+		s.Overrides[groupResource] = overrides
+	}
+}
+
+func getAllResourcesAlias(resource schema.GroupResource) schema.GroupResource {
+	return schema.GroupResource{Group: resource.Group, Resource: AllResources}
+}
+
+func (s *DefaultStorageFactory) getStorageGroupResource(groupResource schema.GroupResource) schema.GroupResource {
+	for _, potentialStorageResource := range s.Overrides[groupResource].cohabitatingResources {
+		if s.APIResourceConfigSource.AnyVersionForGroupEnabled(potentialStorageResource.Group) {
+			return potentialStorageResource
+		}
+	}
+
+	return groupResource
+}
+
+// New finds the storage destination for the given group and resource. It will
+// return an error if the group has no storage destination configured.
+func (s *DefaultStorageFactory) NewConfig(groupResource schema.GroupResource) (*storagebackend.Config, error) {
+	chosenStorageResource := s.getStorageGroupResource(groupResource)
+
+	// operate on copy
+	storageConfig := s.StorageConfig
+	codecConfig := StorageCodecConfig{
+		StorageMediaType:  s.DefaultMediaType,
+		StorageSerializer: s.DefaultSerializer,
+	}
+
+	if override, ok := s.Overrides[getAllResourcesAlias(chosenStorageResource)]; ok {
+		override.Apply(&storageConfig, &codecConfig)
+	}
+	if override, ok := s.Overrides[chosenStorageResource]; ok {
+		override.Apply(&storageConfig, &codecConfig)
+	}
+
+	var err error
+	codecConfig.StorageVersion, err = s.ResourceEncodingConfig.StorageEncodingFor(chosenStorageResource)
+	if err != nil {
+		return nil, err
+	}
+	codecConfig.MemoryVersion, err = s.ResourceEncodingConfig.InMemoryEncodingFor(groupResource)
+	if err != nil {
+		return nil, err
+	}
+	codecConfig.Config = storageConfig
+
+	storageConfig.Codec, err = s.newStorageCodecFn(codecConfig)
+	if err != nil {
+		return nil, err
+	}
+	glog.V(3).Infof("storing %v in %v, reading as %v from %#v", groupResource, codecConfig.StorageVersion, codecConfig.MemoryVersion, codecConfig.Config)
+
+	return &storageConfig, nil
+}
+
+// Backends returns all backends for all registered storage destinations.
+// Used for getting all instances for health validations.
+func (s *DefaultStorageFactory) Backends() []Backend {
+	servers := sets.NewString(s.StorageConfig.ServerList...)
+
+	for _, overrides := range s.Overrides {
+		servers.Insert(overrides.etcdLocation...)
+	}
+
+	tlsConfig := &tls.Config{
+		InsecureSkipVerify: true,
+	}
+	if len(s.StorageConfig.CertFile) > 0 && len(s.StorageConfig.KeyFile) > 0 {
+		cert, err := tls.LoadX509KeyPair(s.StorageConfig.CertFile, s.StorageConfig.KeyFile)
+		if err != nil {
+			glog.Errorf("failed to load key pair while getting backends: %s", err)
+		} else {
+			tlsConfig.Certificates = []tls.Certificate{cert}
+		}
+	}
+	if len(s.StorageConfig.CAFile) > 0 {
+		if caCert, err := ioutil.ReadFile(s.StorageConfig.CAFile); err != nil {
+			glog.Errorf("failed to read ca file while getting backends: %s", err)
+		} else {
+			caPool := x509.NewCertPool()
+			caPool.AppendCertsFromPEM(caCert)
+			tlsConfig.RootCAs = caPool
+			tlsConfig.InsecureSkipVerify = false
+		}
+	}
+
+	backends := []Backend{}
+	for server := range servers {
+		backends = append(backends, Backend{
+			Server: server,
+			// We can't share TLSConfig across different backends to avoid races.
+			// For more details see: http://pr.k8s.io/59338
+			TLSConfig: tlsConfig.Clone(),
+		})
+	}
+	return backends
+}
+
+func (s *DefaultStorageFactory) ResourcePrefix(groupResource schema.GroupResource) string {
+	chosenStorageResource := s.getStorageGroupResource(groupResource)
+	groupOverride := s.Overrides[getAllResourcesAlias(chosenStorageResource)]
+	exactResourceOverride := s.Overrides[chosenStorageResource]
+
+	etcdResourcePrefix := s.DefaultResourcePrefixes[chosenStorageResource]
+	if len(groupOverride.etcdResourcePrefix) > 0 {
+		etcdResourcePrefix = groupOverride.etcdResourcePrefix
+	}
+	if len(exactResourceOverride.etcdResourcePrefix) > 0 {
+		etcdResourcePrefix = exactResourceOverride.etcdResourcePrefix
+	}
+	if len(etcdResourcePrefix) == 0 {
+		etcdResourcePrefix = strings.ToLower(chosenStorageResource.Resource)
+	}
+
+	return etcdResourcePrefix
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/OWNERS b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/OWNERS
new file mode 100644
index 0000000..b7bff4f
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/OWNERS
@@ -0,0 +1,30 @@
+approvers:
+- lavalamp
+- liggitt
+- timothysc
+- wojtek-t
+- xiang90
+reviewers:
+- lavalamp
+- smarterclayton
+- wojtek-t
+- deads2k
+- caesarxuchao
+- mikedanese
+- liggitt
+- ncdc
+- tallclair
+- timothysc
+- hongchaodeng
+- krousey
+- fgrzadkowski
+- xiang90
+- mml
+- ingvagabund
+- resouer
+- mbohlool
+- lixiaobing10051267
+- mqliang
+- feihujiang
+- rrati
+- enj
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/cacher.go b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/cacher.go
new file mode 100644
index 0000000..ab4ab04
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/cacher.go
@@ -0,0 +1,989 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+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.
+*/
+
+package storage
+
+import (
+	"context"
+	"fmt"
+	"net/http"
+	"reflect"
+	"sync"
+	"time"
+
+	"github.com/golang/glog"
+
+	"k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/api/meta"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/conversion"
+	"k8s.io/apimachinery/pkg/fields"
+	"k8s.io/apimachinery/pkg/labels"
+	"k8s.io/apimachinery/pkg/runtime"
+	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
+	"k8s.io/apimachinery/pkg/util/wait"
+	"k8s.io/apimachinery/pkg/watch"
+	"k8s.io/apiserver/pkg/features"
+	utilfeature "k8s.io/apiserver/pkg/util/feature"
+	utiltrace "k8s.io/apiserver/pkg/util/trace"
+	"k8s.io/client-go/tools/cache"
+)
+
+// CacherConfig contains the configuration for a given Cache.
+type CacherConfig struct {
+	// Maximum size of the history cached in memory.
+	CacheCapacity int
+
+	// An underlying storage.Interface.
+	Storage Interface
+
+	// An underlying storage.Versioner.
+	Versioner Versioner
+
+	// The Cache will be caching objects of a given Type and assumes that they
+	// are all stored under ResourcePrefix directory in the underlying database.
+	Type           interface{}
+	ResourcePrefix string
+
+	// KeyFunc is used to get a key in the underlying storage for a given object.
+	KeyFunc func(runtime.Object) (string, error)
+
+	// GetAttrsFunc is used to get object labels, fields, and the uninitialized bool
+	GetAttrsFunc func(runtime.Object) (label labels.Set, field fields.Set, uninitialized bool, err error)
+
+	// TriggerPublisherFunc is used for optimizing amount of watchers that
+	// needs to process an incoming event.
+	TriggerPublisherFunc TriggerPublisherFunc
+
+	// NewList is a function that creates new empty object storing a list of
+	// objects of type Type.
+	NewListFunc func() runtime.Object
+
+	Codec runtime.Codec
+}
+
+type watchersMap map[int]*cacheWatcher
+
+func (wm watchersMap) addWatcher(w *cacheWatcher, number int) {
+	wm[number] = w
+}
+
+func (wm watchersMap) deleteWatcher(number int) {
+	delete(wm, number)
+}
+
+func (wm watchersMap) terminateAll() {
+	for key, watcher := range wm {
+		delete(wm, key)
+		watcher.stop()
+	}
+}
+
+type indexedWatchers struct {
+	allWatchers   watchersMap
+	valueWatchers map[string]watchersMap
+}
+
+func (i *indexedWatchers) addWatcher(w *cacheWatcher, number int, value string, supported bool) {
+	if supported {
+		if _, ok := i.valueWatchers[value]; !ok {
+			i.valueWatchers[value] = watchersMap{}
+		}
+		i.valueWatchers[value].addWatcher(w, number)
+	} else {
+		i.allWatchers.addWatcher(w, number)
+	}
+}
+
+func (i *indexedWatchers) deleteWatcher(number int, value string, supported bool) {
+	if supported {
+		i.valueWatchers[value].deleteWatcher(number)
+		if len(i.valueWatchers[value]) == 0 {
+			delete(i.valueWatchers, value)
+		}
+	} else {
+		i.allWatchers.deleteWatcher(number)
+	}
+}
+
+func (i *indexedWatchers) terminateAll(objectType reflect.Type) {
+	if len(i.allWatchers) > 0 || len(i.valueWatchers) > 0 {
+		glog.Warningf("Terminating all watchers from cacher %v", objectType)
+	}
+	i.allWatchers.terminateAll()
+	for index, watchers := range i.valueWatchers {
+		watchers.terminateAll()
+		delete(i.valueWatchers, index)
+	}
+}
+
+type filterWithAttrsFunc func(key string, l labels.Set, f fields.Set, uninitialized bool) bool
+
+// Cacher is responsible for serving WATCH and LIST requests for a given
+// resource from its internal cache and updating its cache in the background
+// based on the underlying storage contents.
+// Cacher implements storage.Interface (although most of the calls are just
+// delegated to the underlying storage).
+type Cacher struct {
+	// HighWaterMarks for performance debugging.
+	// Important: Since HighWaterMark is using sync/atomic, it has to be at the top of the struct due to a bug on 32-bit platforms
+	// See: https://golang.org/pkg/sync/atomic/ for more information
+	incomingHWM HighWaterMark
+	// Incoming events that should be dispatched to watchers.
+	incoming chan watchCacheEvent
+
+	sync.RWMutex
+
+	// Before accessing the cacher's cache, wait for the ready to be ok.
+	// This is necessary to prevent users from accessing structures that are
+	// uninitialized or are being repopulated right now.
+	// ready needs to be set to false when the cacher is paused or stopped.
+	// ready needs to be set to true when the cacher is ready to use after
+	// initialization.
+	ready *ready
+
+	// Underlying storage.Interface.
+	storage Interface
+
+	// Expected type of objects in the underlying cache.
+	objectType reflect.Type
+
+	// "sliding window" of recent changes of objects and the current state.
+	watchCache *watchCache
+	reflector  *cache.Reflector
+
+	// Versioner is used to handle resource versions.
+	versioner Versioner
+
+	// triggerFunc is used for optimizing amount of watchers that needs to process
+	// an incoming event.
+	triggerFunc TriggerPublisherFunc
+	// watchers is mapping from the value of trigger function that a
+	// watcher is interested into the watchers
+	watcherIdx int
+	watchers   indexedWatchers
+
+	// Defines a time budget that can be spend on waiting for not-ready watchers
+	// while dispatching event before shutting them down.
+	dispatchTimeoutBudget *timeBudget
+
+	// Handling graceful termination.
+	stopLock sync.RWMutex
+	stopped  bool
+	stopCh   chan struct{}
+	stopWg   sync.WaitGroup
+}
+
+// Create a new Cacher responsible for servicing WATCH and LIST requests from
+// its internal cache and updating its cache in the background based on the
+// given configuration.
+func NewCacherFromConfig(config CacherConfig) *Cacher {
+	watchCache := newWatchCache(config.CacheCapacity, config.KeyFunc, config.GetAttrsFunc)
+	listerWatcher := newCacherListerWatcher(config.Storage, config.ResourcePrefix, config.NewListFunc)
+	reflectorName := "storage/cacher.go:" + config.ResourcePrefix
+
+	// Give this error when it is constructed rather than when you get the
+	// first watch item, because it's much easier to track down that way.
+	if obj, ok := config.Type.(runtime.Object); ok {
+		if err := runtime.CheckCodec(config.Codec, obj); err != nil {
+			panic("storage codec doesn't seem to match given type: " + err.Error())
+		}
+	}
+
+	stopCh := make(chan struct{})
+	cacher := &Cacher{
+		ready:       newReady(),
+		storage:     config.Storage,
+		objectType:  reflect.TypeOf(config.Type),
+		watchCache:  watchCache,
+		reflector:   cache.NewNamedReflector(reflectorName, listerWatcher, config.Type, watchCache, 0),
+		versioner:   config.Versioner,
+		triggerFunc: config.TriggerPublisherFunc,
+		watcherIdx:  0,
+		watchers: indexedWatchers{
+			allWatchers:   make(map[int]*cacheWatcher),
+			valueWatchers: make(map[string]watchersMap),
+		},
+		// TODO: Figure out the correct value for the buffer size.
+		incoming:              make(chan watchCacheEvent, 100),
+		dispatchTimeoutBudget: newTimeBudget(stopCh),
+		// We need to (potentially) stop both:
+		// - wait.Until go-routine
+		// - reflector.ListAndWatch
+		// and there are no guarantees on the order that they will stop.
+		// So we will be simply closing the channel, and synchronizing on the WaitGroup.
+		stopCh: stopCh,
+	}
+	watchCache.SetOnEvent(cacher.processEvent)
+	go cacher.dispatchEvents()
+
+	cacher.stopWg.Add(1)
+	go func() {
+		defer cacher.stopWg.Done()
+		wait.Until(
+			func() {
+				if !cacher.isStopped() {
+					cacher.startCaching(stopCh)
+				}
+			}, time.Second, stopCh,
+		)
+	}()
+	return cacher
+}
+
+func (c *Cacher) startCaching(stopChannel <-chan struct{}) {
+	// The 'usable' lock is always 'RLock'able when it is safe to use the cache.
+	// It is safe to use the cache after a successful list until a disconnection.
+	// We start with usable (write) locked. The below OnReplace function will
+	// unlock it after a successful list. The below defer will then re-lock
+	// it when this function exits (always due to disconnection), only if
+	// we actually got a successful list. This cycle will repeat as needed.
+	successfulList := false
+	c.watchCache.SetOnReplace(func() {
+		successfulList = true
+		c.ready.set(true)
+	})
+	defer func() {
+		if successfulList {
+			c.ready.set(false)
+		}
+	}()
+
+	c.terminateAllWatchers()
+	// Note that since onReplace may be not called due to errors, we explicitly
+	// need to retry it on errors under lock.
+	// Also note that startCaching is called in a loop, so there's no need
+	// to have another loop here.
+	if err := c.reflector.ListAndWatch(stopChannel); err != nil {
+		glog.Errorf("unexpected ListAndWatch error: %v", err)
+	}
+}
+
+// Implements storage.Interface.
+func (c *Cacher) Versioner() Versioner {
+	return c.storage.Versioner()
+}
+
+// Implements storage.Interface.
+func (c *Cacher) Create(ctx context.Context, key string, obj, out runtime.Object, ttl uint64) error {
+	return c.storage.Create(ctx, key, obj, out, ttl)
+}
+
+// Implements storage.Interface.
+func (c *Cacher) Delete(ctx context.Context, key string, out runtime.Object, preconditions *Preconditions) error {
+	return c.storage.Delete(ctx, key, out, preconditions)
+}
+
+// Implements storage.Interface.
+func (c *Cacher) Watch(ctx context.Context, key string, resourceVersion string, pred SelectionPredicate) (watch.Interface, error) {
+	watchRV, err := c.versioner.ParseWatchResourceVersion(resourceVersion)
+	if err != nil {
+		return nil, err
+	}
+
+	c.ready.wait()
+
+	// We explicitly use thread unsafe version and do locking ourself to ensure that
+	// no new events will be processed in the meantime. The watchCache will be unlocked
+	// on return from this function.
+	// Note that we cannot do it under Cacher lock, to avoid a deadlock, since the
+	// underlying watchCache is calling processEvent under its lock.
+	c.watchCache.RLock()
+	defer c.watchCache.RUnlock()
+	initEvents, err := c.watchCache.GetAllEventsSinceThreadUnsafe(watchRV)
+	if err != nil {
+		// To match the uncached watch implementation, once we have passed authn/authz/admission,
+		// and successfully parsed a resource version, other errors must fail with a watch event of type ERROR,
+		// rather than a directly returned error.
+		return newErrWatcher(err), nil
+	}
+
+	triggerValue, triggerSupported := "", false
+	// TODO: Currently we assume that in a given Cacher object, any <predicate> that is
+	// passed here is aware of exactly the same trigger (at most one).
+	// Thus, either 0 or 1 values will be returned.
+	if matchValues := pred.MatcherIndex(); len(matchValues) > 0 {
+		triggerValue, triggerSupported = matchValues[0].Value, true
+	}
+
+	// If there is triggerFunc defined, but triggerSupported is false,
+	// we can't narrow the amount of events significantly at this point.
+	//
+	// That said, currently triggerFunc is defined only for Pods and Nodes,
+	// and there is only constant number of watchers for which triggerSupported
+	// is false (excluding those issues explicitly by users).
+	// Thus, to reduce the risk of those watchers blocking all watchers of a
+	// given resource in the system, we increase the sizes of buffers for them.
+	chanSize := 10
+	if c.triggerFunc != nil && !triggerSupported {
+		// TODO: We should tune this value and ideally make it dependent on the
+		// number of objects of a given type and/or their churn.
+		chanSize = 1000
+	}
+
+	c.Lock()
+	defer c.Unlock()
+	forget := forgetWatcher(c, c.watcherIdx, triggerValue, triggerSupported)
+	watcher := newCacheWatcher(watchRV, chanSize, initEvents, filterWithAttrsFunction(key, pred), forget, c.versioner)
+
+	c.watchers.addWatcher(watcher, c.watcherIdx, triggerValue, triggerSupported)
+	c.watcherIdx++
+	return watcher, nil
+}
+
+// Implements storage.Interface.
+func (c *Cacher) WatchList(ctx context.Context, key string, resourceVersion string, pred SelectionPredicate) (watch.Interface, error) {
+	return c.Watch(ctx, key, resourceVersion, pred)
+}
+
+// Implements storage.Interface.
+func (c *Cacher) Get(ctx context.Context, key string, resourceVersion string, objPtr runtime.Object, ignoreNotFound bool) error {
+	if resourceVersion == "" {
+		// If resourceVersion is not specified, serve it from underlying
+		// storage (for backward compatibility).
+		return c.storage.Get(ctx, key, resourceVersion, objPtr, ignoreNotFound)
+	}
+
+	// If resourceVersion is specified, serve it from cache.
+	// It's guaranteed that the returned value is at least that
+	// fresh as the given resourceVersion.
+	getRV, err := c.versioner.ParseListResourceVersion(resourceVersion)
+	if err != nil {
+		return err
+	}
+
+	if getRV == 0 && !c.ready.check() {
+		// If Cacher is not yet initialized and we don't require any specific
+		// minimal resource version, simply forward the request to storage.
+		return c.storage.Get(ctx, key, resourceVersion, objPtr, ignoreNotFound)
+	}
+
+	// Do not create a trace - it's not for free and there are tons
+	// of Get requests. We can add it if it will be really needed.
+	c.ready.wait()
+
+	objVal, err := conversion.EnforcePtr(objPtr)
+	if err != nil {
+		return err
+	}
+
+	obj, exists, readResourceVersion, err := c.watchCache.WaitUntilFreshAndGet(getRV, key, nil)
+	if err != nil {
+		return err
+	}
+
+	if exists {
+		elem, ok := obj.(*storeElement)
+		if !ok {
+			return fmt.Errorf("non *storeElement returned from storage: %v", obj)
+		}
+		objVal.Set(reflect.ValueOf(elem.Object).Elem())
+	} else {
+		objVal.Set(reflect.Zero(objVal.Type()))
+		if !ignoreNotFound {
+			return NewKeyNotFoundError(key, int64(readResourceVersion))
+		}
+	}
+	return nil
+}
+
+// Implements storage.Interface.
+func (c *Cacher) GetToList(ctx context.Context, key string, resourceVersion string, pred SelectionPredicate, listObj runtime.Object) error {
+	pagingEnabled := utilfeature.DefaultFeatureGate.Enabled(features.APIListChunking)
+	if resourceVersion == "" || (pagingEnabled && (len(pred.Continue) > 0 || pred.Limit > 0)) {
+		// If resourceVersion is not specified, serve it from underlying
+		// storage (for backward compatibility). If a continuation or limit is
+		// requested, serve it from the underlying storage as well.
+		return c.storage.GetToList(ctx, key, resourceVersion, pred, listObj)
+	}
+
+	// If resourceVersion is specified, serve it from cache.
+	// It's guaranteed that the returned value is at least that
+	// fresh as the given resourceVersion.
+	listRV, err := c.versioner.ParseListResourceVersion(resourceVersion)
+	if err != nil {
+		return err
+	}
+
+	if listRV == 0 && !c.ready.check() {
+		// If Cacher is not yet initialized and we don't require any specific
+		// minimal resource version, simply forward the request to storage.
+		return c.storage.GetToList(ctx, key, resourceVersion, pred, listObj)
+	}
+
+	trace := utiltrace.New(fmt.Sprintf("cacher %v: List", c.objectType.String()))
+	defer trace.LogIfLong(500 * time.Millisecond)
+
+	c.ready.wait()
+	trace.Step("Ready")
+
+	// List elements with at least 'listRV' from cache.
+	listPtr, err := meta.GetItemsPtr(listObj)
+	if err != nil {
+		return err
+	}
+	listVal, err := conversion.EnforcePtr(listPtr)
+	if err != nil || listVal.Kind() != reflect.Slice {
+		return fmt.Errorf("need a pointer to slice, got %v", listVal.Kind())
+	}
+	filter := filterWithAttrsFunction(key, pred)
+
+	obj, exists, readResourceVersion, err := c.watchCache.WaitUntilFreshAndGet(listRV, key, trace)
+	if err != nil {
+		return err
+	}
+	trace.Step("Got from cache")
+
+	if exists {
+		elem, ok := obj.(*storeElement)
+		if !ok {
+			return fmt.Errorf("non *storeElement returned from storage: %v", obj)
+		}
+		if filter(elem.Key, elem.Labels, elem.Fields, elem.Uninitialized) {
+			listVal.Set(reflect.Append(listVal, reflect.ValueOf(elem.Object).Elem()))
+		}
+	}
+	if c.versioner != nil {
+		if err := c.versioner.UpdateList(listObj, readResourceVersion, ""); err != nil {
+			return err
+		}
+	}
+	return nil
+}
+
+// Implements storage.Interface.
+func (c *Cacher) List(ctx context.Context, key string, resourceVersion string, pred SelectionPredicate, listObj runtime.Object) error {
+	pagingEnabled := utilfeature.DefaultFeatureGate.Enabled(features.APIListChunking)
+	hasContinuation := pagingEnabled && len(pred.Continue) > 0
+	hasLimit := pagingEnabled && pred.Limit > 0 && resourceVersion != "0"
+	if resourceVersion == "" || hasContinuation || hasLimit {
+		// If resourceVersion is not specified, serve it from underlying
+		// storage (for backward compatibility). If a continuation is
+		// requested, serve it from the underlying storage as well.
+		// Limits are only sent to storage when resourceVersion is non-zero
+		// since the watch cache isn't able to perform continuations, and
+		// limits are ignored when resource version is zero.
+		return c.storage.List(ctx, key, resourceVersion, pred, listObj)
+	}
+
+	// If resourceVersion is specified, serve it from cache.
+	// It's guaranteed that the returned value is at least that
+	// fresh as the given resourceVersion.
+	listRV, err := c.versioner.ParseListResourceVersion(resourceVersion)
+	if err != nil {
+		return err
+	}
+
+	if listRV == 0 && !c.ready.check() {
+		// If Cacher is not yet initialized and we don't require any specific
+		// minimal resource version, simply forward the request to storage.
+		return c.storage.List(ctx, key, resourceVersion, pred, listObj)
+	}
+
+	trace := utiltrace.New(fmt.Sprintf("cacher %v: List", c.objectType.String()))
+	defer trace.LogIfLong(500 * time.Millisecond)
+
+	c.ready.wait()
+	trace.Step("Ready")
+
+	// List elements with at least 'listRV' from cache.
+	listPtr, err := meta.GetItemsPtr(listObj)
+	if err != nil {
+		return err
+	}
+	listVal, err := conversion.EnforcePtr(listPtr)
+	if err != nil || listVal.Kind() != reflect.Slice {
+		return fmt.Errorf("need a pointer to slice, got %v", listVal.Kind())
+	}
+	filter := filterWithAttrsFunction(key, pred)
+
+	objs, readResourceVersion, err := c.watchCache.WaitUntilFreshAndList(listRV, trace)
+	if err != nil {
+		return err
+	}
+	trace.Step(fmt.Sprintf("Listed %d items from cache", len(objs)))
+	if len(objs) > listVal.Cap() && pred.Label.Empty() && pred.Field.Empty() {
+		// Resize the slice appropriately, since we already know that none
+		// of the elements will be filtered out.
+		listVal.Set(reflect.MakeSlice(reflect.SliceOf(c.objectType.Elem()), 0, len(objs)))
+		trace.Step("Resized result")
+	}
+	for _, obj := range objs {
+		elem, ok := obj.(*storeElement)
+		if !ok {
+			return fmt.Errorf("non *storeElement returned from storage: %v", obj)
+		}
+		if filter(elem.Key, elem.Labels, elem.Fields, elem.Uninitialized) {
+			listVal.Set(reflect.Append(listVal, reflect.ValueOf(elem.Object).Elem()))
+		}
+	}
+	trace.Step(fmt.Sprintf("Filtered %d items", listVal.Len()))
+	if c.versioner != nil {
+		if err := c.versioner.UpdateList(listObj, readResourceVersion, ""); err != nil {
+			return err
+		}
+	}
+	return nil
+}
+
+// Implements storage.Interface.
+func (c *Cacher) GuaranteedUpdate(
+	ctx context.Context, key string, ptrToType runtime.Object, ignoreNotFound bool,
+	preconditions *Preconditions, tryUpdate UpdateFunc, _ ...runtime.Object) error {
+	// Ignore the suggestion and try to pass down the current version of the object
+	// read from cache.
+	if elem, exists, err := c.watchCache.GetByKey(key); err != nil {
+		glog.Errorf("GetByKey returned error: %v", err)
+	} else if exists {
+		currObj := elem.(*storeElement).Object.DeepCopyObject()
+		return c.storage.GuaranteedUpdate(ctx, key, ptrToType, ignoreNotFound, preconditions, tryUpdate, currObj)
+	}
+	// If we couldn't get the object, fallback to no-suggestion.
+	return c.storage.GuaranteedUpdate(ctx, key, ptrToType, ignoreNotFound, preconditions, tryUpdate)
+}
+
+func (c *Cacher) Count(pathPrefix string) (int64, error) {
+	return c.storage.Count(pathPrefix)
+}
+
+func (c *Cacher) triggerValues(event *watchCacheEvent) ([]string, bool) {
+	// TODO: Currently we assume that in a given Cacher object, its <c.triggerFunc>
+	// is aware of exactly the same trigger (at most one). Thus calling:
+	//   c.triggerFunc(<some object>)
+	// can return only 0 or 1 values.
+	// That means, that triggerValues itself may return up to 2 different values.
+	if c.triggerFunc == nil {
+		return nil, false
+	}
+	result := make([]string, 0, 2)
+	matchValues := c.triggerFunc(event.Object)
+	if len(matchValues) > 0 {
+		result = append(result, matchValues[0].Value)
+	}
+	if event.PrevObject == nil {
+		return result, len(result) > 0
+	}
+	prevMatchValues := c.triggerFunc(event.PrevObject)
+	if len(prevMatchValues) > 0 {
+		if len(result) == 0 || result[0] != prevMatchValues[0].Value {
+			result = append(result, prevMatchValues[0].Value)
+		}
+	}
+	return result, len(result) > 0
+}
+
+func (c *Cacher) processEvent(event *watchCacheEvent) {
+	if curLen := int64(len(c.incoming)); c.incomingHWM.Update(curLen) {
+		// Monitor if this gets backed up, and how much.
+		glog.V(1).Infof("cacher (%v): %v objects queued in incoming channel.", c.objectType.String(), curLen)
+	}
+	c.incoming <- *event
+}
+
+func (c *Cacher) dispatchEvents() {
+	for {
+		select {
+		case event, ok := <-c.incoming:
+			if !ok {
+				return
+			}
+			c.dispatchEvent(&event)
+		case <-c.stopCh:
+			return
+		}
+	}
+}
+
+func (c *Cacher) dispatchEvent(event *watchCacheEvent) {
+	triggerValues, supported := c.triggerValues(event)
+
+	c.Lock()
+	defer c.Unlock()
+	// Iterate over "allWatchers" no matter what the trigger function is.
+	for _, watcher := range c.watchers.allWatchers {
+		watcher.add(event, c.dispatchTimeoutBudget)
+	}
+	if supported {
+		// Iterate over watchers interested in the given values of the trigger.
+		for _, triggerValue := range triggerValues {
+			for _, watcher := range c.watchers.valueWatchers[triggerValue] {
+				watcher.add(event, c.dispatchTimeoutBudget)
+			}
+		}
+	} else {
+		// supported equal to false generally means that trigger function
+		// is not defined (or not aware of any indexes). In this case,
+		// watchers filters should generally also don't generate any
+		// trigger values, but can cause problems in case of some
+		// misconfiguration. Thus we paranoidly leave this branch.
+
+		// Iterate over watchers interested in exact values for all values.
+		for _, watchers := range c.watchers.valueWatchers {
+			for _, watcher := range watchers {
+				watcher.add(event, c.dispatchTimeoutBudget)
+			}
+		}
+	}
+}
+
+func (c *Cacher) terminateAllWatchers() {
+	c.Lock()
+	defer c.Unlock()
+	c.watchers.terminateAll(c.objectType)
+}
+
+func (c *Cacher) isStopped() bool {
+	c.stopLock.RLock()
+	defer c.stopLock.RUnlock()
+	return c.stopped
+}
+
+func (c *Cacher) Stop() {
+	// avoid stopping twice (note: cachers are shared with subresources)
+	if c.isStopped() {
+		return
+	}
+	c.stopLock.Lock()
+	if c.stopped {
+		c.stopLock.Unlock()
+		return
+	}
+	c.stopped = true
+	c.stopLock.Unlock()
+	close(c.stopCh)
+	c.stopWg.Wait()
+}
+
+func forgetWatcher(c *Cacher, index int, triggerValue string, triggerSupported bool) func(bool) {
+	return func(lock bool) {
+		if lock {
+			c.Lock()
+			defer c.Unlock()
+		} else {
+			// false is currently passed only if we are forcing watcher to close due
+			// to its unresponsiveness and blocking other watchers.
+			// TODO: Get this information in cleaner way.
+			glog.V(1).Infof("Forcing watcher close due to unresponsiveness: %v", c.objectType.String())
+		}
+		// It's possible that the watcher is already not in the structure (e.g. in case of
+		// simultaneous Stop() and terminateAllWatchers(), but it doesn't break anything.
+		c.watchers.deleteWatcher(index, triggerValue, triggerSupported)
+	}
+}
+
+func filterWithAttrsFunction(key string, p SelectionPredicate) filterWithAttrsFunc {
+	filterFunc := func(objKey string, label labels.Set, field fields.Set, uninitialized bool) bool {
+		if !hasPathPrefix(objKey, key) {
+			return false
+		}
+		return p.MatchesObjectAttributes(label, field, uninitialized)
+	}
+	return filterFunc
+}
+
+// Returns resource version to which the underlying cache is synced.
+func (c *Cacher) LastSyncResourceVersion() (uint64, error) {
+	c.ready.wait()
+
+	resourceVersion := c.reflector.LastSyncResourceVersion()
+	return c.versioner.ParseListResourceVersion(resourceVersion)
+}
+
+// cacherListerWatcher opaques storage.Interface to expose cache.ListerWatcher.
+type cacherListerWatcher struct {
+	storage        Interface
+	resourcePrefix string
+	newListFunc    func() runtime.Object
+}
+
+func newCacherListerWatcher(storage Interface, resourcePrefix string, newListFunc func() runtime.Object) cache.ListerWatcher {
+	return &cacherListerWatcher{
+		storage:        storage,
+		resourcePrefix: resourcePrefix,
+		newListFunc:    newListFunc,
+	}
+}
+
+// Implements cache.ListerWatcher interface.
+func (lw *cacherListerWatcher) List(options metav1.ListOptions) (runtime.Object, error) {
+	list := lw.newListFunc()
+	if err := lw.storage.List(context.TODO(), lw.resourcePrefix, "", Everything, list); err != nil {
+		return nil, err
+	}
+	return list, nil
+}
+
+// Implements cache.ListerWatcher interface.
+func (lw *cacherListerWatcher) Watch(options metav1.ListOptions) (watch.Interface, error) {
+	return lw.storage.WatchList(context.TODO(), lw.resourcePrefix, options.ResourceVersion, Everything)
+}
+
+// errWatcher implements watch.Interface to return a single error
+type errWatcher struct {
+	result chan watch.Event
+}
+
+func newErrWatcher(err error) *errWatcher {
+	// Create an error event
+	errEvent := watch.Event{Type: watch.Error}
+	switch err := err.(type) {
+	case runtime.Object:
+		errEvent.Object = err
+	case *errors.StatusError:
+		errEvent.Object = &err.ErrStatus
+	default:
+		errEvent.Object = &metav1.Status{
+			Status:  metav1.StatusFailure,
+			Message: err.Error(),
+			Reason:  metav1.StatusReasonInternalError,
+			Code:    http.StatusInternalServerError,
+		}
+	}
+
+	// Create a watcher with room for a single event, populate it, and close the channel
+	watcher := &errWatcher{result: make(chan watch.Event, 1)}
+	watcher.result <- errEvent
+	close(watcher.result)
+
+	return watcher
+}
+
+// Implements watch.Interface.
+func (c *errWatcher) ResultChan() <-chan watch.Event {
+	return c.result
+}
+
+// Implements watch.Interface.
+func (c *errWatcher) Stop() {
+	// no-op
+}
+
+// cachWatcher implements watch.Interface
+type cacheWatcher struct {
+	sync.Mutex
+	input     chan *watchCacheEvent
+	result    chan watch.Event
+	done      chan struct{}
+	filter    filterWithAttrsFunc
+	stopped   bool
+	forget    func(bool)
+	versioner Versioner
+}
+
+func newCacheWatcher(resourceVersion uint64, chanSize int, initEvents []*watchCacheEvent, filter filterWithAttrsFunc, forget func(bool), versioner Versioner) *cacheWatcher {
+	watcher := &cacheWatcher{
+		input:     make(chan *watchCacheEvent, chanSize),
+		result:    make(chan watch.Event, chanSize),
+		done:      make(chan struct{}),
+		filter:    filter,
+		stopped:   false,
+		forget:    forget,
+		versioner: versioner,
+	}
+	go watcher.process(initEvents, resourceVersion)
+	return watcher
+}
+
+// Implements watch.Interface.
+func (c *cacheWatcher) ResultChan() <-chan watch.Event {
+	return c.result
+}
+
+// Implements watch.Interface.
+func (c *cacheWatcher) Stop() {
+	c.forget(true)
+	c.stop()
+}
+
+func (c *cacheWatcher) stop() {
+	c.Lock()
+	defer c.Unlock()
+	if !c.stopped {
+		c.stopped = true
+		close(c.done)
+		close(c.input)
+	}
+}
+
+var timerPool sync.Pool
+
+func (c *cacheWatcher) add(event *watchCacheEvent, budget *timeBudget) {
+	// Try to send the event immediately, without blocking.
+	select {
+	case c.input <- event:
+		return
+	default:
+	}
+
+	// OK, block sending, but only for up to <timeout>.
+	// cacheWatcher.add is called very often, so arrange
+	// to reuse timers instead of constantly allocating.
+	startTime := time.Now()
+	timeout := budget.takeAvailable()
+
+	t, ok := timerPool.Get().(*time.Timer)
+	if ok {
+		t.Reset(timeout)
+	} else {
+		t = time.NewTimer(timeout)
+	}
+	defer timerPool.Put(t)
+
+	select {
+	case c.input <- event:
+		stopped := t.Stop()
+		if !stopped {
+			// Consume triggered (but not yet received) timer event
+			// so that future reuse does not get a spurious timeout.
+			<-t.C
+		}
+	case <-t.C:
+		// This means that we couldn't send event to that watcher.
+		// Since we don't want to block on it infinitely,
+		// we simply terminate it.
+		c.forget(false)
+		c.stop()
+	}
+
+	budget.returnUnused(timeout - time.Since(startTime))
+}
+
+// NOTE: sendWatchCacheEvent is assumed to not modify <event> !!!
+func (c *cacheWatcher) sendWatchCacheEvent(event *watchCacheEvent) {
+	curObjPasses := event.Type != watch.Deleted && c.filter(event.Key, event.ObjLabels, event.ObjFields, event.ObjUninitialized)
+	oldObjPasses := false
+	if event.PrevObject != nil {
+		oldObjPasses = c.filter(event.Key, event.PrevObjLabels, event.PrevObjFields, event.PrevObjUninitialized)
+	}
+	if !curObjPasses && !oldObjPasses {
+		// Watcher is not interested in that object.
+		return
+	}
+
+	var watchEvent watch.Event
+	switch {
+	case curObjPasses && !oldObjPasses:
+		watchEvent = watch.Event{Type: watch.Added, Object: event.Object.DeepCopyObject()}
+	case curObjPasses && oldObjPasses:
+		watchEvent = watch.Event{Type: watch.Modified, Object: event.Object.DeepCopyObject()}
+	case !curObjPasses && oldObjPasses:
+		// return a delete event with the previous object content, but with the event's resource version
+		oldObj := event.PrevObject.DeepCopyObject()
+		if err := c.versioner.UpdateObject(oldObj, event.ResourceVersion); err != nil {
+			utilruntime.HandleError(fmt.Errorf("failure to version api object (%d) %#v: %v", event.ResourceVersion, oldObj, err))
+		}
+		watchEvent = watch.Event{Type: watch.Deleted, Object: oldObj}
+	}
+
+	// We need to ensure that if we put event X to the c.result, all
+	// previous events were already put into it before, no matter whether
+	// c.done is close or not.
+	// Thus we cannot simply select from c.done and c.result and this
+	// would give us non-determinism.
+	// At the same time, we don't want to block infinitely on putting
+	// to c.result, when c.done is already closed.
+
+	// This ensures that with c.done already close, we at most once go
+	// into the next select after this. With that, no matter which
+	// statement we choose there, we will deliver only consecutive
+	// events.
+	select {
+	case <-c.done:
+		return
+	default:
+	}
+
+	select {
+	case c.result <- watchEvent:
+	case <-c.done:
+	}
+}
+
+func (c *cacheWatcher) process(initEvents []*watchCacheEvent, resourceVersion uint64) {
+	defer utilruntime.HandleCrash()
+
+	// Check how long we are processing initEvents.
+	// As long as these are not processed, we are not processing
+	// any incoming events, so if it takes long, we may actually
+	// block all watchers for some time.
+	// TODO: From the logs it seems that there happens processing
+	// times even up to 1s which is very long. However, this doesn't
+	// depend that much on the number of initEvents. E.g. from the
+	// 2000-node Kubemark run we have logs like this, e.g.:
+	// ... processing 13862 initEvents took 66.808689ms
+	// ... processing 14040 initEvents took 993.532539ms
+	// We should understand what is blocking us in those cases (e.g.
+	// is it lack of CPU, network, or sth else) and potentially
+	// consider increase size of result buffer in those cases.
+	const initProcessThreshold = 500 * time.Millisecond
+	startTime := time.Now()
+	for _, event := range initEvents {
+		c.sendWatchCacheEvent(event)
+	}
+	processingTime := time.Since(startTime)
+	if processingTime > initProcessThreshold {
+		objType := "<null>"
+		if len(initEvents) > 0 {
+			objType = reflect.TypeOf(initEvents[0].Object).String()
+		}
+		glog.V(2).Infof("processing %d initEvents of %s took %v", len(initEvents), objType, processingTime)
+	}
+
+	defer close(c.result)
+	defer c.Stop()
+	for {
+		event, ok := <-c.input
+		if !ok {
+			return
+		}
+		// only send events newer than resourceVersion
+		if event.ResourceVersion > resourceVersion {
+			c.sendWatchCacheEvent(event)
+		}
+	}
+}
+
+type ready struct {
+	ok bool
+	c  *sync.Cond
+}
+
+func newReady() *ready {
+	return &ready{c: sync.NewCond(&sync.Mutex{})}
+}
+
+func (r *ready) wait() {
+	r.c.L.Lock()
+	for !r.ok {
+		r.c.Wait()
+	}
+	r.c.L.Unlock()
+}
+
+// TODO: Make check() function more sophisticated, in particular
+// allow it to behave as "waitWithTimeout".
+func (r *ready) check() bool {
+	r.c.L.Lock()
+	defer r.c.L.Unlock()
+	return r.ok
+}
+
+func (r *ready) set(ok bool) {
+	r.c.L.Lock()
+	defer r.c.L.Unlock()
+	r.ok = ok
+	r.c.Broadcast()
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/doc.go
new file mode 100644
index 0000000..fbdd944
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/doc.go
@@ -0,0 +1,18 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+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.
+*/
+
+// Interfaces for database-related operations.
+package storage // import "k8s.io/apiserver/pkg/storage"
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/errors.go b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/errors.go
new file mode 100644
index 0000000..a4d134a
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/errors.go
@@ -0,0 +1,170 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+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.
+*/
+
+package storage
+
+import (
+	"fmt"
+
+	"k8s.io/apimachinery/pkg/util/validation/field"
+)
+
+const (
+	ErrCodeKeyNotFound int = iota + 1
+	ErrCodeKeyExists
+	ErrCodeResourceVersionConflicts
+	ErrCodeInvalidObj
+	ErrCodeUnreachable
+)
+
+var errCodeToMessage = map[int]string{
+	ErrCodeKeyNotFound:              "key not found",
+	ErrCodeKeyExists:                "key exists",
+	ErrCodeResourceVersionConflicts: "resource version conflicts",
+	ErrCodeInvalidObj:               "invalid object",
+	ErrCodeUnreachable:              "server unreachable",
+}
+
+func NewKeyNotFoundError(key string, rv int64) *StorageError {
+	return &StorageError{
+		Code:            ErrCodeKeyNotFound,
+		Key:             key,
+		ResourceVersion: rv,
+	}
+}
+
+func NewKeyExistsError(key string, rv int64) *StorageError {
+	return &StorageError{
+		Code:            ErrCodeKeyExists,
+		Key:             key,
+		ResourceVersion: rv,
+	}
+}
+
+func NewResourceVersionConflictsError(key string, rv int64) *StorageError {
+	return &StorageError{
+		Code:            ErrCodeResourceVersionConflicts,
+		Key:             key,
+		ResourceVersion: rv,
+	}
+}
+
+func NewUnreachableError(key string, rv int64) *StorageError {
+	return &StorageError{
+		Code:            ErrCodeUnreachable,
+		Key:             key,
+		ResourceVersion: rv,
+	}
+}
+
+func NewInvalidObjError(key, msg string) *StorageError {
+	return &StorageError{
+		Code:               ErrCodeInvalidObj,
+		Key:                key,
+		AdditionalErrorMsg: msg,
+	}
+}
+
+type StorageError struct {
+	Code               int
+	Key                string
+	ResourceVersion    int64
+	AdditionalErrorMsg string
+}
+
+func (e *StorageError) Error() string {
+	return fmt.Sprintf("StorageError: %s, Code: %d, Key: %s, ResourceVersion: %d, AdditionalErrorMsg: %s",
+		errCodeToMessage[e.Code], e.Code, e.Key, e.ResourceVersion, e.AdditionalErrorMsg)
+}
+
+// IsNotFound returns true if and only if err is "key" not found error.
+func IsNotFound(err error) bool {
+	return isErrCode(err, ErrCodeKeyNotFound)
+}
+
+// IsNodeExist returns true if and only if err is an node already exist error.
+func IsNodeExist(err error) bool {
+	return isErrCode(err, ErrCodeKeyExists)
+}
+
+// IsUnreachable returns true if and only if err indicates the server could not be reached.
+func IsUnreachable(err error) bool {
+	return isErrCode(err, ErrCodeUnreachable)
+}
+
+// IsConflict returns true if and only if err is a write conflict.
+func IsConflict(err error) bool {
+	return isErrCode(err, ErrCodeResourceVersionConflicts)
+}
+
+// IsInvalidObj returns true if and only if err is invalid error
+func IsInvalidObj(err error) bool {
+	return isErrCode(err, ErrCodeInvalidObj)
+}
+
+func isErrCode(err error, code int) bool {
+	if err == nil {
+		return false
+	}
+	if e, ok := err.(*StorageError); ok {
+		return e.Code == code
+	}
+	return false
+}
+
+// InvalidError is generated when an error caused by invalid API object occurs
+// in the storage package.
+type InvalidError struct {
+	Errs field.ErrorList
+}
+
+func (e InvalidError) Error() string {
+	return e.Errs.ToAggregate().Error()
+}
+
+// IsInvalidError returns true if and only if err is an InvalidError.
+func IsInvalidError(err error) bool {
+	_, ok := err.(InvalidError)
+	return ok
+}
+
+func NewInvalidError(errors field.ErrorList) InvalidError {
+	return InvalidError{errors}
+}
+
+// InternalError is generated when an error occurs in the storage package, i.e.,
+// not from the underlying storage backend (e.g., etcd).
+type InternalError struct {
+	Reason string
+}
+
+func (e InternalError) Error() string {
+	return e.Reason
+}
+
+// IsInternalError returns true if and only if err is an InternalError.
+func IsInternalError(err error) bool {
+	_, ok := err.(InternalError)
+	return ok
+}
+
+func NewInternalError(reason string) InternalError {
+	return InternalError{reason}
+}
+
+func NewInternalErrorf(format string, a ...interface{}) InternalError {
+	return InternalError{fmt.Sprintf(format, a)}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/errors/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/errors/doc.go
new file mode 100644
index 0000000..3d3150c
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/errors/doc.go
@@ -0,0 +1,18 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+// Package etcd provides conversion of etcd errors to API errors.
+package storage // import "k8s.io/apiserver/pkg/storage/errors"
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/errors/storage.go b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/errors/storage.go
new file mode 100644
index 0000000..fd3b35e
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/errors/storage.go
@@ -0,0 +1,116 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package storage
+
+import (
+	"k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apiserver/pkg/storage"
+)
+
+// InterpretListError converts a generic error on a retrieval
+// operation into the appropriate API error.
+func InterpretListError(err error, qualifiedResource schema.GroupResource) error {
+	switch {
+	case storage.IsNotFound(err):
+		return errors.NewNotFound(qualifiedResource, "")
+	case storage.IsUnreachable(err):
+		return errors.NewServerTimeout(qualifiedResource, "list", 2) // TODO: make configurable or handled at a higher level
+	case storage.IsInternalError(err):
+		return errors.NewInternalError(err)
+	default:
+		return err
+	}
+}
+
+// InterpretGetError converts a generic error on a retrieval
+// operation into the appropriate API error.
+func InterpretGetError(err error, qualifiedResource schema.GroupResource, name string) error {
+	switch {
+	case storage.IsNotFound(err):
+		return errors.NewNotFound(qualifiedResource, name)
+	case storage.IsUnreachable(err):
+		return errors.NewServerTimeout(qualifiedResource, "get", 2) // TODO: make configurable or handled at a higher level
+	case storage.IsInternalError(err):
+		return errors.NewInternalError(err)
+	default:
+		return err
+	}
+}
+
+// InterpretCreateError converts a generic error on a create
+// operation into the appropriate API error.
+func InterpretCreateError(err error, qualifiedResource schema.GroupResource, name string) error {
+	switch {
+	case storage.IsNodeExist(err):
+		return errors.NewAlreadyExists(qualifiedResource, name)
+	case storage.IsUnreachable(err):
+		return errors.NewServerTimeout(qualifiedResource, "create", 2) // TODO: make configurable or handled at a higher level
+	case storage.IsInternalError(err):
+		return errors.NewInternalError(err)
+	default:
+		return err
+	}
+}
+
+// InterpretUpdateError converts a generic error on an update
+// operation into the appropriate API error.
+func InterpretUpdateError(err error, qualifiedResource schema.GroupResource, name string) error {
+	switch {
+	case storage.IsConflict(err), storage.IsNodeExist(err), storage.IsInvalidObj(err):
+		return errors.NewConflict(qualifiedResource, name, err)
+	case storage.IsUnreachable(err):
+		return errors.NewServerTimeout(qualifiedResource, "update", 2) // TODO: make configurable or handled at a higher level
+	case storage.IsNotFound(err):
+		return errors.NewNotFound(qualifiedResource, name)
+	case storage.IsInternalError(err):
+		return errors.NewInternalError(err)
+	default:
+		return err
+	}
+}
+
+// InterpretDeleteError converts a generic error on a delete
+// operation into the appropriate API error.
+func InterpretDeleteError(err error, qualifiedResource schema.GroupResource, name string) error {
+	switch {
+	case storage.IsNotFound(err):
+		return errors.NewNotFound(qualifiedResource, name)
+	case storage.IsUnreachable(err):
+		return errors.NewServerTimeout(qualifiedResource, "delete", 2) // TODO: make configurable or handled at a higher level
+	case storage.IsConflict(err), storage.IsNodeExist(err), storage.IsInvalidObj(err):
+		return errors.NewConflict(qualifiedResource, name, err)
+	case storage.IsInternalError(err):
+		return errors.NewInternalError(err)
+	default:
+		return err
+	}
+}
+
+// InterpretWatchError converts a generic error on a watch
+// operation into the appropriate API error.
+func InterpretWatchError(err error, resource schema.GroupResource, name string) error {
+	switch {
+	case storage.IsInvalidError(err):
+		invalidError, _ := err.(storage.InvalidError)
+		return errors.NewInvalid(schema.GroupKind{Group: resource.Group, Kind: resource.Resource}, name, invalidError.Errs)
+	case storage.IsInternalError(err):
+		return errors.NewInternalError(err)
+	default:
+		return err
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd/OWNERS b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd/OWNERS
new file mode 100755
index 0000000..a065498
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd/OWNERS
@@ -0,0 +1,25 @@
+reviewers:
+- lavalamp
+- smarterclayton
+- wojtek-t
+- deads2k
+- derekwaynecarr
+- caesarxuchao
+- mikedanese
+- liggitt
+- davidopp
+- pmorie
+- luxas
+- janetkuo
+- roberthbailey
+- tallclair
+- timothysc
+- dims
+- hongchaodeng
+- krousey
+- fgrzadkowski
+- resouer
+- pweil-
+- mqliang
+- feihujiang
+- enj
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd/api_object_versioner.go b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd/api_object_versioner.go
new file mode 100644
index 0000000..5534f9f
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd/api_object_versioner.go
@@ -0,0 +1,148 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package etcd
+
+import (
+	"strconv"
+
+	"k8s.io/apimachinery/pkg/api/meta"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/util/validation/field"
+	"k8s.io/apiserver/pkg/storage"
+)
+
+// APIObjectVersioner implements versioning and extracting etcd node information
+// for objects that have an embedded ObjectMeta or ListMeta field.
+type APIObjectVersioner struct{}
+
+// UpdateObject implements Versioner
+func (a APIObjectVersioner) UpdateObject(obj runtime.Object, resourceVersion uint64) error {
+	accessor, err := meta.Accessor(obj)
+	if err != nil {
+		return err
+	}
+	versionString := ""
+	if resourceVersion != 0 {
+		versionString = strconv.FormatUint(resourceVersion, 10)
+	}
+	accessor.SetResourceVersion(versionString)
+	return nil
+}
+
+// UpdateList implements Versioner
+func (a APIObjectVersioner) UpdateList(obj runtime.Object, resourceVersion uint64, nextKey string) error {
+	listAccessor, err := meta.ListAccessor(obj)
+	if err != nil || listAccessor == nil {
+		return err
+	}
+	versionString := ""
+	if resourceVersion != 0 {
+		versionString = strconv.FormatUint(resourceVersion, 10)
+	}
+	listAccessor.SetResourceVersion(versionString)
+	listAccessor.SetContinue(nextKey)
+	return nil
+}
+
+// PrepareObjectForStorage clears resource version and self link prior to writing to etcd.
+func (a APIObjectVersioner) PrepareObjectForStorage(obj runtime.Object) error {
+	accessor, err := meta.Accessor(obj)
+	if err != nil {
+		return err
+	}
+	accessor.SetResourceVersion("")
+	accessor.SetSelfLink("")
+	return nil
+}
+
+// ObjectResourceVersion implements Versioner
+func (a APIObjectVersioner) ObjectResourceVersion(obj runtime.Object) (uint64, error) {
+	accessor, err := meta.Accessor(obj)
+	if err != nil {
+		return 0, err
+	}
+	version := accessor.GetResourceVersion()
+	if len(version) == 0 {
+		return 0, nil
+	}
+	return strconv.ParseUint(version, 10, 64)
+}
+
+// ParseWatchResourceVersion takes a resource version argument and converts it to
+// the etcd version we should pass to helper.Watch(). Because resourceVersion is
+// an opaque value, the default watch behavior for non-zero watch is to watch
+// the next value (if you pass "1", you will see updates from "2" onwards).
+func (a APIObjectVersioner) ParseWatchResourceVersion(resourceVersion string) (uint64, error) {
+	if resourceVersion == "" || resourceVersion == "0" {
+		return 0, nil
+	}
+	version, err := strconv.ParseUint(resourceVersion, 10, 64)
+	if err != nil {
+		return 0, storage.NewInvalidError(field.ErrorList{
+			// Validation errors are supposed to return version-specific field
+			// paths, but this is probably close enough.
+			field.Invalid(field.NewPath("resourceVersion"), resourceVersion, err.Error()),
+		})
+	}
+	return version, nil
+}
+
+// ParseListResourceVersion takes a resource version argument and converts it to
+// the etcd version.
+// TODO: reevaluate whether it is really clearer to have both this and the
+// Watch version of this function, since they perform the same logic.
+func (a APIObjectVersioner) ParseListResourceVersion(resourceVersion string) (uint64, error) {
+	if resourceVersion == "" {
+		return 0, nil
+	}
+	version, err := strconv.ParseUint(resourceVersion, 10, 64)
+	if err != nil {
+		return 0, storage.NewInvalidError(field.ErrorList{
+			// Validation errors are supposed to return version-specific field
+			// paths, but this is probably close enough.
+			field.Invalid(field.NewPath("resourceVersion"), resourceVersion, err.Error()),
+		})
+	}
+	return version, nil
+}
+
+// APIObjectVersioner implements Versioner
+var Versioner storage.Versioner = APIObjectVersioner{}
+
+// CompareResourceVersion compares etcd resource versions.  Outside this API they are all strings,
+// but etcd resource versions are special, they're actually ints, so we can easily compare them.
+func (a APIObjectVersioner) CompareResourceVersion(lhs, rhs runtime.Object) int {
+	lhsVersion, err := Versioner.ObjectResourceVersion(lhs)
+	if err != nil {
+		// coder error
+		panic(err)
+	}
+	rhsVersion, err := Versioner.ObjectResourceVersion(rhs)
+	if err != nil {
+		// coder error
+		panic(err)
+	}
+
+	if lhsVersion == rhsVersion {
+		return 0
+	}
+	if lhsVersion < rhsVersion {
+		return -1
+	}
+
+	return 1
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd/doc.go
new file mode 100644
index 0000000..566f466
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd/doc.go
@@ -0,0 +1,17 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+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.
+*/
+
+package etcd // import "k8s.io/apiserver/pkg/storage/etcd"
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd/etcd_helper.go b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd/etcd_helper.go
new file mode 100644
index 0000000..2fe2bba
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd/etcd_helper.go
@@ -0,0 +1,652 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package etcd
+
+import (
+	"context"
+	"errors"
+	"fmt"
+	"path"
+	"reflect"
+	"time"
+
+	etcd "github.com/coreos/etcd/client"
+	"github.com/golang/glog"
+
+	"k8s.io/apimachinery/pkg/api/meta"
+	"k8s.io/apimachinery/pkg/conversion"
+	"k8s.io/apimachinery/pkg/runtime"
+	utilcache "k8s.io/apimachinery/pkg/util/cache"
+	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
+	"k8s.io/apimachinery/pkg/watch"
+	"k8s.io/apiserver/pkg/storage"
+	"k8s.io/apiserver/pkg/storage/etcd/metrics"
+	etcdutil "k8s.io/apiserver/pkg/storage/etcd/util"
+	utiltrace "k8s.io/apiserver/pkg/util/trace"
+)
+
+// ValueTransformer allows a string value to be transformed before being read from or written to the underlying store. The methods
+// must be able to undo the transformation caused by the other.
+type ValueTransformer interface {
+	// TransformStringFromStorage may transform the provided string from its underlying storage representation or return an error.
+	// Stale is true if the object on disk is stale and a write to etcd should be issued, even if the contents of the object
+	// have not changed.
+	TransformStringFromStorage(string) (value string, stale bool, err error)
+	// TransformStringToStorage may transform the provided string into the appropriate form in storage or return an error.
+	TransformStringToStorage(string) (value string, err error)
+}
+
+type identityTransformer struct{}
+
+func (identityTransformer) TransformStringFromStorage(s string) (string, bool, error) {
+	return s, false, nil
+}
+func (identityTransformer) TransformStringToStorage(s string) (string, error) { return s, nil }
+
+// IdentityTransformer performs no transformation on the provided values.
+var IdentityTransformer ValueTransformer = identityTransformer{}
+
+// Creates a new storage interface from the client
+// TODO: deprecate in favor of storage.Config abstraction over time
+func NewEtcdStorage(client etcd.Client, codec runtime.Codec, prefix string, quorum bool, cacheSize int, transformer ValueTransformer) storage.Interface {
+	return &etcdHelper{
+		etcdMembersAPI: etcd.NewMembersAPI(client),
+		etcdKeysAPI:    etcd.NewKeysAPI(client),
+		codec:          codec,
+		versioner:      APIObjectVersioner{},
+		transformer:    transformer,
+		pathPrefix:     path.Join("/", prefix),
+		quorum:         quorum,
+		cache:          utilcache.NewCache(cacheSize),
+	}
+}
+
+// etcdHelper is the reference implementation of storage.Interface.
+type etcdHelper struct {
+	etcdMembersAPI etcd.MembersAPI
+	etcdKeysAPI    etcd.KeysAPI
+	codec          runtime.Codec
+	transformer    ValueTransformer
+	// Note that versioner is required for etcdHelper to work correctly.
+	// The public constructors (NewStorage & NewEtcdStorage) are setting it
+	// correctly, so be careful when manipulating with it manually.
+	// optional, has to be set to perform any atomic operations
+	versioner storage.Versioner
+	// prefix for all etcd keys
+	pathPrefix string
+	// if true,  perform quorum read
+	quorum bool
+
+	// We cache objects stored in etcd. For keys we use Node.ModifiedIndex which is equivalent
+	// to resourceVersion.
+	// This depends on etcd's indexes being globally unique across all objects/types. This will
+	// have to revisited if we decide to do things like multiple etcd clusters, or etcd will
+	// support multi-object transaction that will result in many objects with the same index.
+	// Number of entries stored in the cache is controlled by maxEtcdCacheEntries constant.
+	// TODO: Measure how much this cache helps after the conversion code is optimized.
+	cache utilcache.Cache
+}
+
+// Implements storage.Interface.
+func (h *etcdHelper) Versioner() storage.Versioner {
+	return h.versioner
+}
+
+// Implements storage.Interface.
+func (h *etcdHelper) Create(ctx context.Context, key string, obj, out runtime.Object, ttl uint64) error {
+	trace := utiltrace.New("etcdHelper::Create " + getTypeName(obj))
+	defer trace.LogIfLong(250 * time.Millisecond)
+	if ctx == nil {
+		glog.Errorf("Context is nil")
+	}
+	key = path.Join(h.pathPrefix, key)
+	data, err := runtime.Encode(h.codec, obj)
+	trace.Step("Object encoded")
+	if err != nil {
+		return err
+	}
+	if version, err := h.versioner.ObjectResourceVersion(obj); err == nil && version != 0 {
+		return errors.New("resourceVersion may not be set on objects to be created")
+	}
+	if err := h.versioner.PrepareObjectForStorage(obj); err != nil {
+		return fmt.Errorf("PrepareObjectForStorage returned an error: %v", err)
+	}
+	trace.Step("Version checked")
+
+	startTime := time.Now()
+	opts := etcd.SetOptions{
+		TTL:       time.Duration(ttl) * time.Second,
+		PrevExist: etcd.PrevNoExist,
+	}
+
+	newBody, err := h.transformer.TransformStringToStorage(string(data))
+	if err != nil {
+		return storage.NewInternalError(err.Error())
+	}
+
+	response, err := h.etcdKeysAPI.Set(ctx, key, newBody, &opts)
+	trace.Step("Object created")
+	metrics.RecordEtcdRequestLatency("create", getTypeName(obj), startTime)
+	if err != nil {
+		return toStorageErr(err, key, 0)
+	}
+	if out != nil {
+		if _, err := conversion.EnforcePtr(out); err != nil {
+			panic("unable to convert output object to pointer")
+		}
+		_, _, _, err = h.extractObj(response, err, out, false, false)
+	}
+	return err
+}
+
+func checkPreconditions(key string, preconditions *storage.Preconditions, out runtime.Object) error {
+	if preconditions == nil {
+		return nil
+	}
+	objMeta, err := meta.Accessor(out)
+	if err != nil {
+		return storage.NewInternalErrorf("can't enforce preconditions %v on un-introspectable object %v, got error: %v", *preconditions, out, err)
+	}
+	if preconditions.UID != nil && *preconditions.UID != objMeta.GetUID() {
+		errMsg := fmt.Sprintf("Precondition failed: UID in precondition: %v, UID in object meta: %v", preconditions.UID, objMeta.GetUID())
+		return storage.NewInvalidObjError(key, errMsg)
+	}
+	return nil
+}
+
+// Implements storage.Interface.
+func (h *etcdHelper) Delete(ctx context.Context, key string, out runtime.Object, preconditions *storage.Preconditions) error {
+	if ctx == nil {
+		glog.Errorf("Context is nil")
+	}
+	key = path.Join(h.pathPrefix, key)
+	v, err := conversion.EnforcePtr(out)
+	if err != nil {
+		panic("unable to convert output object to pointer")
+	}
+
+	if preconditions == nil {
+		startTime := time.Now()
+		response, err := h.etcdKeysAPI.Delete(ctx, key, nil)
+		metrics.RecordEtcdRequestLatency("delete", getTypeName(out), startTime)
+		if !etcdutil.IsEtcdNotFound(err) {
+			// if the object that existed prior to the delete is returned by etcd, update the out object.
+			if err != nil || response.PrevNode != nil {
+				_, _, _, err = h.extractObj(response, err, out, false, true)
+			}
+		}
+		return toStorageErr(err, key, 0)
+	}
+
+	// Check the preconditions match.
+	obj := reflect.New(v.Type()).Interface().(runtime.Object)
+	for {
+		_, node, res, _, err := h.bodyAndExtractObj(ctx, key, obj, false)
+		if err != nil {
+			return toStorageErr(err, key, 0)
+		}
+		if err := checkPreconditions(key, preconditions, obj); err != nil {
+			return toStorageErr(err, key, 0)
+		}
+		index := uint64(0)
+		if node != nil {
+			index = node.ModifiedIndex
+		} else if res != nil {
+			index = res.Index
+		}
+		opt := etcd.DeleteOptions{PrevIndex: index}
+		startTime := time.Now()
+		response, err := h.etcdKeysAPI.Delete(ctx, key, &opt)
+		metrics.RecordEtcdRequestLatency("delete", getTypeName(out), startTime)
+		if !etcdutil.IsEtcdTestFailed(err) {
+			if !etcdutil.IsEtcdNotFound(err) {
+				// if the object that existed prior to the delete is returned by etcd, update the out object.
+				if err != nil || response.PrevNode != nil {
+					_, _, _, err = h.extractObj(response, err, out, false, true)
+				}
+			}
+			return toStorageErr(err, key, 0)
+		}
+
+		glog.V(4).Infof("deletion of %s failed because of a conflict, going to retry", key)
+	}
+}
+
+// Implements storage.Interface.
+func (h *etcdHelper) Watch(ctx context.Context, key string, resourceVersion string, pred storage.SelectionPredicate) (watch.Interface, error) {
+	if ctx == nil {
+		glog.Errorf("Context is nil")
+	}
+	watchRV, err := h.versioner.ParseWatchResourceVersion(resourceVersion)
+	if err != nil {
+		return nil, err
+	}
+	key = path.Join(h.pathPrefix, key)
+	w := newEtcdWatcher(false, h.quorum, nil, pred, h.codec, h.versioner, nil, h.transformer, h)
+	go w.etcdWatch(ctx, h.etcdKeysAPI, key, watchRV)
+	return w, nil
+}
+
+// Implements storage.Interface.
+func (h *etcdHelper) WatchList(ctx context.Context, key string, resourceVersion string, pred storage.SelectionPredicate) (watch.Interface, error) {
+	if ctx == nil {
+		glog.Errorf("Context is nil")
+	}
+	watchRV, err := h.versioner.ParseWatchResourceVersion(resourceVersion)
+	if err != nil {
+		return nil, err
+	}
+	key = path.Join(h.pathPrefix, key)
+	w := newEtcdWatcher(true, h.quorum, exceptKey(key), pred, h.codec, h.versioner, nil, h.transformer, h)
+	go w.etcdWatch(ctx, h.etcdKeysAPI, key, watchRV)
+	return w, nil
+}
+
+// Implements storage.Interface.
+func (h *etcdHelper) Get(ctx context.Context, key string, resourceVersion string, objPtr runtime.Object, ignoreNotFound bool) error {
+	if ctx == nil {
+		glog.Errorf("Context is nil")
+	}
+	key = path.Join(h.pathPrefix, key)
+	_, _, _, _, err := h.bodyAndExtractObj(ctx, key, objPtr, ignoreNotFound)
+	return err
+}
+
+// bodyAndExtractObj performs the normal Get path to etcd, returning the parsed node and response for additional information
+// about the response, like the current etcd index and the ttl.
+func (h *etcdHelper) bodyAndExtractObj(ctx context.Context, key string, objPtr runtime.Object, ignoreNotFound bool) (body string, node *etcd.Node, res *etcd.Response, stale bool, err error) {
+	if ctx == nil {
+		glog.Errorf("Context is nil")
+	}
+	startTime := time.Now()
+
+	opts := &etcd.GetOptions{
+		Quorum: h.quorum,
+	}
+
+	response, err := h.etcdKeysAPI.Get(ctx, key, opts)
+	metrics.RecordEtcdRequestLatency("get", getTypeName(objPtr), startTime)
+	if err != nil && !etcdutil.IsEtcdNotFound(err) {
+		return "", nil, nil, false, toStorageErr(err, key, 0)
+	}
+	body, node, stale, err = h.extractObj(response, err, objPtr, ignoreNotFound, false)
+	return body, node, response, stale, toStorageErr(err, key, 0)
+}
+
+func (h *etcdHelper) extractObj(response *etcd.Response, inErr error, objPtr runtime.Object, ignoreNotFound, prevNode bool) (body string, node *etcd.Node, stale bool, err error) {
+	if response != nil {
+		if prevNode {
+			node = response.PrevNode
+		} else {
+			node = response.Node
+		}
+	}
+	if inErr != nil || node == nil || len(node.Value) == 0 {
+		if ignoreNotFound {
+			v, err := conversion.EnforcePtr(objPtr)
+			if err != nil {
+				return "", nil, false, err
+			}
+			v.Set(reflect.Zero(v.Type()))
+			return "", nil, false, nil
+		} else if inErr != nil {
+			return "", nil, false, inErr
+		}
+		return "", nil, false, fmt.Errorf("unable to locate a value on the response: %#v", response)
+	}
+
+	body, stale, err = h.transformer.TransformStringFromStorage(node.Value)
+	if err != nil {
+		return body, nil, stale, storage.NewInternalError(err.Error())
+	}
+	out, gvk, err := h.codec.Decode([]byte(body), nil, objPtr)
+	if err != nil {
+		return body, nil, stale, err
+	}
+	if out != objPtr {
+		return body, nil, stale, fmt.Errorf("unable to decode object %s into %v", gvk.String(), reflect.TypeOf(objPtr))
+	}
+	// being unable to set the version does not prevent the object from being extracted
+	_ = h.versioner.UpdateObject(objPtr, node.ModifiedIndex)
+	return body, node, stale, err
+}
+
+// Implements storage.Interface.
+func (h *etcdHelper) GetToList(ctx context.Context, key string, resourceVersion string, pred storage.SelectionPredicate, listObj runtime.Object) error {
+	if ctx == nil {
+		glog.Errorf("Context is nil")
+	}
+	trace := utiltrace.New("GetToList " + getTypeName(listObj))
+	listPtr, err := meta.GetItemsPtr(listObj)
+	if err != nil {
+		return err
+	}
+	key = path.Join(h.pathPrefix, key)
+	startTime := time.Now()
+	trace.Step("About to read etcd node")
+
+	opts := &etcd.GetOptions{
+		Quorum: h.quorum,
+	}
+	response, err := h.etcdKeysAPI.Get(ctx, key, opts)
+	trace.Step("Etcd node read")
+	metrics.RecordEtcdRequestLatency("get", getTypeName(listPtr), startTime)
+	if err != nil {
+		if etcdutil.IsEtcdNotFound(err) {
+			if etcdErr, ok := err.(etcd.Error); ok {
+				return h.versioner.UpdateList(listObj, etcdErr.Index, "")
+			}
+			return fmt.Errorf("unexpected error from storage: %#v", err)
+		}
+		return toStorageErr(err, key, 0)
+	}
+
+	nodes := make([]*etcd.Node, 0)
+	nodes = append(nodes, response.Node)
+
+	if err := h.decodeNodeList(nodes, pred, listPtr); err != nil {
+		return err
+	}
+	trace.Step("Object decoded")
+	if err := h.versioner.UpdateList(listObj, response.Index, ""); err != nil {
+		return err
+	}
+	return nil
+}
+
+// decodeNodeList walks the tree of each node in the list and decodes into the specified object
+func (h *etcdHelper) decodeNodeList(nodes []*etcd.Node, pred storage.SelectionPredicate, slicePtr interface{}) error {
+	trace := utiltrace.New("decodeNodeList " + getTypeName(slicePtr))
+	defer trace.LogIfLong(400 * time.Millisecond)
+	v, err := conversion.EnforcePtr(slicePtr)
+	if err != nil || v.Kind() != reflect.Slice {
+		// This should not happen at runtime.
+		panic("need ptr to slice")
+	}
+	for _, node := range nodes {
+		if node.Dir {
+			// IMPORTANT: do not log each key as a discrete step in the trace log
+			// as it produces an immense amount of log spam when there is a large
+			// amount of content in the list.
+			if err := h.decodeNodeList(node.Nodes, pred, slicePtr); err != nil {
+				return err
+			}
+			continue
+		}
+		if obj, found := h.getFromCache(node.ModifiedIndex, pred); found {
+			// obj != nil iff it matches the pred function.
+			if obj != nil {
+				v.Set(reflect.Append(v, reflect.ValueOf(obj).Elem()))
+			}
+		} else {
+			body, _, err := h.transformer.TransformStringFromStorage(node.Value)
+			if err != nil {
+				// omit items from lists and watches that cannot be transformed, but log the error
+				utilruntime.HandleError(fmt.Errorf("unable to transform key %q: %v", node.Key, err))
+				continue
+			}
+
+			obj, _, err := h.codec.Decode([]byte(body), nil, reflect.New(v.Type().Elem()).Interface().(runtime.Object))
+			if err != nil {
+				return err
+			}
+			// being unable to set the version does not prevent the object from being extracted
+			_ = h.versioner.UpdateObject(obj, node.ModifiedIndex)
+			if matched, err := pred.Matches(obj); err == nil && matched {
+				v.Set(reflect.Append(v, reflect.ValueOf(obj).Elem()))
+			}
+			if node.ModifiedIndex != 0 {
+				h.addToCache(node.ModifiedIndex, obj)
+			}
+		}
+	}
+	trace.Step(fmt.Sprintf("Decoded %v nodes", len(nodes)))
+	return nil
+}
+
+// Implements storage.Interface.
+func (h *etcdHelper) List(ctx context.Context, key string, resourceVersion string, pred storage.SelectionPredicate, listObj runtime.Object) error {
+	if ctx == nil {
+		glog.Errorf("Context is nil")
+	}
+	trace := utiltrace.New("List " + getTypeName(listObj))
+	defer trace.LogIfLong(400 * time.Millisecond)
+	listPtr, err := meta.GetItemsPtr(listObj)
+	if err != nil {
+		return err
+	}
+	key = path.Join(h.pathPrefix, key)
+	startTime := time.Now()
+	trace.Step("About to list etcd node")
+	nodes, index, err := h.listEtcdNode(ctx, key)
+	trace.Step("Etcd node listed")
+	metrics.RecordEtcdRequestLatency("list", getTypeName(listPtr), startTime)
+	if err != nil {
+		return err
+	}
+	if err := h.decodeNodeList(nodes, pred, listPtr); err != nil {
+		return err
+	}
+	trace.Step("Node list decoded")
+	if err := h.versioner.UpdateList(listObj, index, ""); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (h *etcdHelper) listEtcdNode(ctx context.Context, key string) ([]*etcd.Node, uint64, error) {
+	if ctx == nil {
+		glog.Errorf("Context is nil")
+	}
+	opts := etcd.GetOptions{
+		Recursive: true,
+		Sort:      true,
+		Quorum:    h.quorum,
+	}
+	result, err := h.etcdKeysAPI.Get(ctx, key, &opts)
+	if err != nil {
+		var index uint64
+		if etcdError, ok := err.(etcd.Error); ok {
+			index = etcdError.Index
+		}
+		nodes := make([]*etcd.Node, 0)
+		if etcdutil.IsEtcdNotFound(err) {
+			return nodes, index, nil
+		} else {
+			return nodes, index, toStorageErr(err, key, 0)
+		}
+	}
+	return result.Node.Nodes, result.Index, nil
+}
+
+// Implements storage.Interface.
+func (h *etcdHelper) GuaranteedUpdate(
+	ctx context.Context, key string, ptrToType runtime.Object, ignoreNotFound bool,
+	preconditions *storage.Preconditions, tryUpdate storage.UpdateFunc, _ ...runtime.Object) error {
+	// Ignore the suggestion about current object.
+	if ctx == nil {
+		glog.Errorf("Context is nil")
+	}
+	v, err := conversion.EnforcePtr(ptrToType)
+	if err != nil {
+		// Panic is appropriate, because this is a programming error.
+		panic("need ptr to type")
+	}
+	key = path.Join(h.pathPrefix, key)
+	for {
+		obj := reflect.New(v.Type()).Interface().(runtime.Object)
+		origBody, node, res, stale, err := h.bodyAndExtractObj(ctx, key, obj, ignoreNotFound)
+		if err != nil {
+			return toStorageErr(err, key, 0)
+		}
+		if err := checkPreconditions(key, preconditions, obj); err != nil {
+			return toStorageErr(err, key, 0)
+		}
+		meta := storage.ResponseMeta{}
+		if node != nil {
+			meta.TTL = node.TTL
+			meta.ResourceVersion = node.ModifiedIndex
+		}
+		// Get the object to be written by calling tryUpdate.
+		ret, newTTL, err := tryUpdate(obj, meta)
+		if err != nil {
+			return toStorageErr(err, key, 0)
+		}
+
+		index := uint64(0)
+		ttl := uint64(0)
+		if node != nil {
+			index = node.ModifiedIndex
+			if node.TTL != 0 {
+				ttl = uint64(node.TTL)
+			}
+			if node.Expiration != nil && ttl == 0 {
+				ttl = 1
+			}
+		} else if res != nil {
+			index = res.Index
+		}
+
+		if newTTL != nil {
+			if ttl != 0 && *newTTL == 0 {
+				// TODO: remove this after we have verified this is no longer an issue
+				glog.V(4).Infof("GuaranteedUpdate is clearing TTL for %q, may not be intentional", key)
+			}
+			ttl = *newTTL
+		}
+
+		// Since update object may have a resourceVersion set, we need to clear it here.
+		if err := h.versioner.PrepareObjectForStorage(ret); err != nil {
+			return errors.New("resourceVersion cannot be set on objects store in etcd")
+		}
+
+		newBodyData, err := runtime.Encode(h.codec, ret)
+		if err != nil {
+			return err
+		}
+		newBody := string(newBodyData)
+		data, err := h.transformer.TransformStringToStorage(newBody)
+		if err != nil {
+			return storage.NewInternalError(err.Error())
+		}
+
+		// First time this key has been used, try creating new value.
+		if index == 0 {
+			startTime := time.Now()
+			opts := etcd.SetOptions{
+				TTL:       time.Duration(ttl) * time.Second,
+				PrevExist: etcd.PrevNoExist,
+			}
+			response, err := h.etcdKeysAPI.Set(ctx, key, data, &opts)
+			metrics.RecordEtcdRequestLatency("create", getTypeName(ptrToType), startTime)
+			if etcdutil.IsEtcdNodeExist(err) {
+				continue
+			}
+			_, _, _, err = h.extractObj(response, err, ptrToType, false, false)
+			return toStorageErr(err, key, 0)
+		}
+
+		// If we don't send an update, we simply return the currently existing
+		// version of the object. However, the value transformer may indicate that
+		// the on disk representation has changed and that we must commit an update.
+		if newBody == origBody && !stale {
+			_, _, _, err := h.extractObj(res, nil, ptrToType, ignoreNotFound, false)
+			return err
+		}
+
+		startTime := time.Now()
+		// Swap origBody with data, if origBody is the latest etcd data.
+		opts := etcd.SetOptions{
+			PrevIndex: index,
+			TTL:       time.Duration(ttl) * time.Second,
+		}
+		response, err := h.etcdKeysAPI.Set(ctx, key, data, &opts)
+		metrics.RecordEtcdRequestLatency("compareAndSwap", getTypeName(ptrToType), startTime)
+		if etcdutil.IsEtcdTestFailed(err) {
+			// Try again.
+			continue
+		}
+		_, _, _, err = h.extractObj(response, err, ptrToType, false, false)
+		return toStorageErr(err, key, int64(index))
+	}
+}
+
+func (*etcdHelper) Count(pathPerfix string) (int64, error) {
+	return 0, fmt.Errorf("Count is unimplemented for etcd2!")
+}
+
+// etcdCache defines interface used for caching objects stored in etcd. Objects are keyed by
+// their Node.ModifiedIndex, which is unique across all types.
+// All implementations must be thread-safe.
+type etcdCache interface {
+	getFromCache(index uint64, pred storage.SelectionPredicate) (runtime.Object, bool)
+	addToCache(index uint64, obj runtime.Object)
+}
+
+func getTypeName(obj interface{}) string {
+	return reflect.TypeOf(obj).String()
+}
+
+func (h *etcdHelper) getFromCache(index uint64, pred storage.SelectionPredicate) (runtime.Object, bool) {
+	startTime := time.Now()
+	defer func() {
+		metrics.ObserveGetCache(startTime)
+	}()
+	obj, found := h.cache.Get(index)
+	if found {
+		if matched, err := pred.Matches(obj.(runtime.Object)); err != nil || !matched {
+			return nil, true
+		}
+		// We should not return the object itself to avoid polluting the cache if someone
+		// modifies returned values.
+		objCopy := obj.(runtime.Object).DeepCopyObject()
+		metrics.ObserveCacheHit()
+		return objCopy.(runtime.Object), true
+	}
+	metrics.ObserveCacheMiss()
+	return nil, false
+}
+
+func (h *etcdHelper) addToCache(index uint64, obj runtime.Object) {
+	startTime := time.Now()
+	defer func() {
+		metrics.ObserveAddCache(startTime)
+	}()
+	objCopy := obj.DeepCopyObject()
+	isOverwrite := h.cache.Add(index, objCopy)
+	if !isOverwrite {
+		metrics.ObserveNewEntry()
+	}
+}
+
+func toStorageErr(err error, key string, rv int64) error {
+	if err == nil {
+		return nil
+	}
+	switch {
+	case etcdutil.IsEtcdNotFound(err):
+		return storage.NewKeyNotFoundError(key, rv)
+	case etcdutil.IsEtcdNodeExist(err):
+		return storage.NewKeyExistsError(key, rv)
+	case etcdutil.IsEtcdTestFailed(err):
+		return storage.NewResourceVersionConflictsError(key, rv)
+	case etcdutil.IsEtcdUnreachable(err):
+		return storage.NewUnreachableError(key, rv)
+	default:
+		return err
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd/etcd_watcher.go b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd/etcd_watcher.go
new file mode 100644
index 0000000..21ffc42
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd/etcd_watcher.go
@@ -0,0 +1,500 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package etcd
+
+import (
+	"context"
+	"fmt"
+	"net/http"
+	"reflect"
+	"sync"
+	"time"
+
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
+	"k8s.io/apimachinery/pkg/watch"
+	"k8s.io/apiserver/pkg/storage"
+	etcdutil "k8s.io/apiserver/pkg/storage/etcd/util"
+
+	etcd "github.com/coreos/etcd/client"
+	"github.com/golang/glog"
+)
+
+// Etcd watch event actions
+const (
+	EtcdCreate = "create"
+	EtcdGet    = "get"
+	EtcdSet    = "set"
+	EtcdCAS    = "compareAndSwap"
+	EtcdDelete = "delete"
+	EtcdCAD    = "compareAndDelete"
+	EtcdExpire = "expire"
+)
+
+// TransformFunc attempts to convert an object to another object for use with a watcher.
+type TransformFunc func(runtime.Object) (runtime.Object, error)
+
+// includeFunc returns true if the given key should be considered part of a watch
+type includeFunc func(key string) bool
+
+// exceptKey is an includeFunc that returns false when the provided key matches the watched key
+func exceptKey(except string) includeFunc {
+	return func(key string) bool {
+		return key != except
+	}
+}
+
+// etcdWatcher converts a native etcd watch to a watch.Interface.
+type etcdWatcher struct {
+	// HighWaterMarks for performance debugging.
+	// Important: Since HighWaterMark is using sync/atomic, it has to be at the top of the struct due to a bug on 32-bit platforms
+	// See: https://golang.org/pkg/sync/atomic/ for more information
+	incomingHWM storage.HighWaterMark
+	outgoingHWM storage.HighWaterMark
+
+	encoding runtime.Codec
+	// Note that versioner is required for etcdWatcher to work correctly.
+	// There is no public constructor of it, so be careful when manipulating
+	// with it manually.
+	versioner        storage.Versioner
+	transform        TransformFunc
+	valueTransformer ValueTransformer
+
+	list    bool // If we're doing a recursive watch, should be true.
+	quorum  bool // If we enable quorum, should be true
+	include includeFunc
+	pred    storage.SelectionPredicate
+
+	etcdIncoming  chan *etcd.Response
+	etcdError     chan error
+	ctx           context.Context
+	cancel        context.CancelFunc
+	etcdCallEnded chan struct{}
+
+	outgoing chan watch.Event
+	userStop chan struct{}
+	stopped  bool
+	stopLock sync.Mutex
+	// wg is used to avoid calls to etcd after Stop(), and to make sure
+	// that the translate goroutine is not leaked.
+	wg sync.WaitGroup
+
+	// Injectable for testing. Send the event down the outgoing channel.
+	emit func(watch.Event)
+
+	cache etcdCache
+}
+
+// watchWaitDuration is the amount of time to wait for an error from watch.
+const watchWaitDuration = 100 * time.Millisecond
+
+// newEtcdWatcher returns a new etcdWatcher; if list is true, watch sub-nodes.
+// The versioner must be able to handle the objects that transform creates.
+func newEtcdWatcher(list bool, quorum bool, include includeFunc, pred storage.SelectionPredicate,
+	encoding runtime.Codec, versioner storage.Versioner, transform TransformFunc,
+	valueTransformer ValueTransformer, cache etcdCache) *etcdWatcher {
+	w := &etcdWatcher{
+		encoding:         encoding,
+		versioner:        versioner,
+		transform:        transform,
+		valueTransformer: valueTransformer,
+
+		list:    list,
+		quorum:  quorum,
+		include: include,
+		pred:    pred,
+		// Buffer this channel, so that the etcd client is not forced
+		// to context switch with every object it gets, and so that a
+		// long time spent decoding an object won't block the *next*
+		// object. Basically, we see a lot of "401 window exceeded"
+		// errors from etcd, and that's due to the client not streaming
+		// results but rather getting them one at a time. So we really
+		// want to never block the etcd client, if possible. The 100 is
+		// mostly arbitrary--we know it goes as high as 50, though.
+		// There's a V(2) log message that prints the length so we can
+		// monitor how much of this buffer is actually used.
+		etcdIncoming: make(chan *etcd.Response, 100),
+		etcdError:    make(chan error, 1),
+		// Similarly to etcdIncomming, we don't want to force context
+		// switch on every new incoming object.
+		outgoing: make(chan watch.Event, 100),
+		userStop: make(chan struct{}),
+		stopped:  false,
+		wg:       sync.WaitGroup{},
+		cache:    cache,
+		ctx:      nil,
+		cancel:   nil,
+	}
+	w.emit = func(e watch.Event) {
+		if curLen := int64(len(w.outgoing)); w.outgoingHWM.Update(curLen) {
+			// Monitor if this gets backed up, and how much.
+			glog.V(1).Infof("watch (%v): %v objects queued in outgoing channel.", reflect.TypeOf(e.Object).String(), curLen)
+		}
+		// Give up on user stop, without this we leak a lot of goroutines in tests.
+		select {
+		case w.outgoing <- e:
+		case <-w.userStop:
+		}
+	}
+	// translate will call done. We need to Add() here because otherwise,
+	// if Stop() gets called before translate gets started, there'd be a
+	// problem.
+	w.wg.Add(1)
+	go w.translate()
+	return w
+}
+
+// etcdWatch calls etcd's Watch function, and handles any errors. Meant to be called
+// as a goroutine.
+func (w *etcdWatcher) etcdWatch(ctx context.Context, client etcd.KeysAPI, key string, resourceVersion uint64) {
+	defer utilruntime.HandleCrash()
+	defer close(w.etcdError)
+	defer close(w.etcdIncoming)
+
+	// All calls to etcd are coming from this function - once it is finished
+	// no other call to etcd should be generated by this watcher.
+	done := func() {}
+
+	// We need to be prepared, that Stop() can be called at any time.
+	// It can potentially also be called, even before this function is called.
+	// If that is the case, we simply skip all the code here.
+	// See #18928 for more details.
+	var watcher etcd.Watcher
+	returned := func() bool {
+		w.stopLock.Lock()
+		defer w.stopLock.Unlock()
+		if w.stopped {
+			// Watcher has already been stopped - don't event initiate it here.
+			return true
+		}
+		w.wg.Add(1)
+		done = w.wg.Done
+		// Perform initialization of watcher under lock - we want to avoid situation when
+		// Stop() is called in the meantime (which in tests can cause etcd termination and
+		// strange behavior here).
+		if resourceVersion == 0 {
+			latest, err := etcdGetInitialWatchState(ctx, client, key, w.list, w.quorum, w.etcdIncoming)
+			if err != nil {
+				w.etcdError <- err
+				return true
+			}
+			resourceVersion = latest
+		}
+
+		opts := etcd.WatcherOptions{
+			Recursive:  w.list,
+			AfterIndex: resourceVersion,
+		}
+		watcher = client.Watcher(key, &opts)
+		w.ctx, w.cancel = context.WithCancel(ctx)
+		return false
+	}()
+	defer done()
+	if returned {
+		return
+	}
+
+	for {
+		resp, err := watcher.Next(w.ctx)
+		if err != nil {
+			w.etcdError <- err
+			return
+		}
+		w.etcdIncoming <- resp
+	}
+}
+
+// etcdGetInitialWatchState turns an etcd Get request into a watch equivalent
+func etcdGetInitialWatchState(ctx context.Context, client etcd.KeysAPI, key string, recursive bool, quorum bool, incoming chan<- *etcd.Response) (resourceVersion uint64, err error) {
+	opts := etcd.GetOptions{
+		Recursive: recursive,
+		Sort:      false,
+		Quorum:    quorum,
+	}
+	resp, err := client.Get(ctx, key, &opts)
+	if err != nil {
+		if !etcdutil.IsEtcdNotFound(err) {
+			utilruntime.HandleError(fmt.Errorf("watch was unable to retrieve the current index for the provided key (%q): %v", key, err))
+			return resourceVersion, toStorageErr(err, key, 0)
+		}
+		if etcdError, ok := err.(etcd.Error); ok {
+			resourceVersion = etcdError.Index
+		}
+		return resourceVersion, nil
+	}
+	resourceVersion = resp.Index
+	convertRecursiveResponse(resp.Node, resp, incoming)
+	return
+}
+
+// convertRecursiveResponse turns a recursive get response from etcd into individual response objects
+// by copying the original response.  This emulates the behavior of a recursive watch.
+func convertRecursiveResponse(node *etcd.Node, response *etcd.Response, incoming chan<- *etcd.Response) {
+	if node.Dir {
+		for i := range node.Nodes {
+			convertRecursiveResponse(node.Nodes[i], response, incoming)
+		}
+		return
+	}
+	copied := *response
+	copied.Action = "get"
+	copied.Node = node
+	incoming <- &copied
+}
+
+// translate pulls stuff from etcd, converts, and pushes out the outgoing channel. Meant to be
+// called as a goroutine.
+func (w *etcdWatcher) translate() {
+	defer w.wg.Done()
+	defer close(w.outgoing)
+	defer utilruntime.HandleCrash()
+
+	for {
+		select {
+		case err := <-w.etcdError:
+			if err != nil {
+				var status *metav1.Status
+				switch {
+				case etcdutil.IsEtcdWatchExpired(err):
+					status = &metav1.Status{
+						Status:  metav1.StatusFailure,
+						Message: err.Error(),
+						Code:    http.StatusGone, // Gone
+						Reason:  metav1.StatusReasonExpired,
+					}
+				// TODO: need to generate errors using api/errors which has a circular dependency on this package
+				//   no other way to inject errors
+				// case etcdutil.IsEtcdUnreachable(err):
+				//   status = errors.NewServerTimeout(...)
+				default:
+					status = &metav1.Status{
+						Status:  metav1.StatusFailure,
+						Message: err.Error(),
+						Code:    http.StatusInternalServerError,
+						Reason:  metav1.StatusReasonInternalError,
+					}
+				}
+				w.emit(watch.Event{
+					Type:   watch.Error,
+					Object: status,
+				})
+			}
+			return
+		case <-w.userStop:
+			return
+		case res, ok := <-w.etcdIncoming:
+			if ok {
+				if curLen := int64(len(w.etcdIncoming)); w.incomingHWM.Update(curLen) {
+					// Monitor if this gets backed up, and how much.
+					glog.V(1).Infof("watch: %v objects queued in incoming channel.", curLen)
+				}
+				w.sendResult(res)
+			}
+			// If !ok, don't return here-- must wait for etcdError channel
+			// to give an error or be closed.
+		}
+	}
+}
+
+// decodeObject extracts an object from the provided etcd node or returns an error.
+func (w *etcdWatcher) decodeObject(node *etcd.Node) (runtime.Object, error) {
+	if obj, found := w.cache.getFromCache(node.ModifiedIndex, storage.Everything); found {
+		return obj, nil
+	}
+
+	body, _, err := w.valueTransformer.TransformStringFromStorage(node.Value)
+	if err != nil {
+		return nil, err
+	}
+
+	obj, err := runtime.Decode(w.encoding, []byte(body))
+	if err != nil {
+		return nil, err
+	}
+
+	// ensure resource version is set on the object we load from etcd
+	if err := w.versioner.UpdateObject(obj, node.ModifiedIndex); err != nil {
+		utilruntime.HandleError(fmt.Errorf("failure to version api object (%d) %#v: %v", node.ModifiedIndex, obj, err))
+	}
+
+	// perform any necessary transformation
+	if w.transform != nil {
+		obj, err = w.transform(obj)
+		if err != nil {
+			utilruntime.HandleError(fmt.Errorf("failure to transform api object %#v: %v", obj, err))
+			return nil, err
+		}
+	}
+
+	if node.ModifiedIndex != 0 {
+		w.cache.addToCache(node.ModifiedIndex, obj)
+	}
+	return obj, nil
+}
+
+func (w *etcdWatcher) sendAdd(res *etcd.Response) {
+	if res.Node == nil {
+		utilruntime.HandleError(fmt.Errorf("unexpected nil node: %#v", res))
+		return
+	}
+	if w.include != nil && !w.include(res.Node.Key) {
+		return
+	}
+	obj, err := w.decodeObject(res.Node)
+	if err != nil {
+		utilruntime.HandleError(fmt.Errorf("failure to decode api object: %v\n'%v' from %#v %#v", err, string(res.Node.Value), res, res.Node))
+		// TODO: expose an error through watch.Interface?
+		// Ignore this value. If we stop the watch on a bad value, a client that uses
+		// the resourceVersion to resume will never be able to get past a bad value.
+		return
+	}
+	if matched, err := w.pred.Matches(obj); err != nil || !matched {
+		return
+	}
+	action := watch.Added
+	w.emit(watch.Event{
+		Type:   action,
+		Object: obj,
+	})
+}
+
+func (w *etcdWatcher) sendModify(res *etcd.Response) {
+	if res.Node == nil {
+		glog.Errorf("unexpected nil node: %#v", res)
+		return
+	}
+	if w.include != nil && !w.include(res.Node.Key) {
+		return
+	}
+	curObj, err := w.decodeObject(res.Node)
+	if err != nil {
+		utilruntime.HandleError(fmt.Errorf("failure to decode api object: %v\n'%v' from %#v %#v", err, string(res.Node.Value), res, res.Node))
+		// TODO: expose an error through watch.Interface?
+		// Ignore this value. If we stop the watch on a bad value, a client that uses
+		// the resourceVersion to resume will never be able to get past a bad value.
+		return
+	}
+	curObjPasses := false
+	if matched, err := w.pred.Matches(curObj); err == nil && matched {
+		curObjPasses = true
+	}
+	oldObjPasses := false
+	var oldObj runtime.Object
+	if res.PrevNode != nil && res.PrevNode.Value != "" {
+		// Ignore problems reading the old object.
+		if oldObj, err = w.decodeObject(res.PrevNode); err == nil {
+			if err := w.versioner.UpdateObject(oldObj, res.Node.ModifiedIndex); err != nil {
+				utilruntime.HandleError(fmt.Errorf("failure to version api object (%d) %#v: %v", res.Node.ModifiedIndex, oldObj, err))
+			}
+			if matched, err := w.pred.Matches(oldObj); err == nil && matched {
+				oldObjPasses = true
+			}
+		}
+	}
+	// Some changes to an object may cause it to start or stop matching a pred.
+	// We need to report those as adds/deletes. So we have to check both the previous
+	// and current value of the object.
+	switch {
+	case curObjPasses && oldObjPasses:
+		w.emit(watch.Event{
+			Type:   watch.Modified,
+			Object: curObj,
+		})
+	case curObjPasses && !oldObjPasses:
+		w.emit(watch.Event{
+			Type:   watch.Added,
+			Object: curObj,
+		})
+	case !curObjPasses && oldObjPasses:
+		w.emit(watch.Event{
+			Type:   watch.Deleted,
+			Object: oldObj,
+		})
+	}
+	// Do nothing if neither new nor old object passed the pred.
+}
+
+func (w *etcdWatcher) sendDelete(res *etcd.Response) {
+	if res.PrevNode == nil {
+		utilruntime.HandleError(fmt.Errorf("unexpected nil prev node: %#v", res))
+		return
+	}
+	if w.include != nil && !w.include(res.PrevNode.Key) {
+		return
+	}
+	node := *res.PrevNode
+	if res.Node != nil {
+		// Note that this sends the *old* object with the etcd index for the time at
+		// which it gets deleted. This will allow users to restart the watch at the right
+		// index.
+		node.ModifiedIndex = res.Node.ModifiedIndex
+	}
+	obj, err := w.decodeObject(&node)
+	if err != nil {
+		utilruntime.HandleError(fmt.Errorf("failure to decode api object: %v\nfrom %#v %#v", err, res, res.Node))
+		// TODO: expose an error through watch.Interface?
+		// Ignore this value. If we stop the watch on a bad value, a client that uses
+		// the resourceVersion to resume will never be able to get past a bad value.
+		return
+	}
+	if matched, err := w.pred.Matches(obj); err != nil || !matched {
+		return
+	}
+	w.emit(watch.Event{
+		Type:   watch.Deleted,
+		Object: obj,
+	})
+}
+
+func (w *etcdWatcher) sendResult(res *etcd.Response) {
+	switch res.Action {
+	case EtcdCreate, EtcdGet:
+		// "Get" will only happen in watch 0 case, where we explicitly want ADDED event
+		// for initial state.
+		w.sendAdd(res)
+	case EtcdSet, EtcdCAS:
+		w.sendModify(res)
+	case EtcdDelete, EtcdExpire, EtcdCAD:
+		w.sendDelete(res)
+	default:
+		utilruntime.HandleError(fmt.Errorf("unknown action: %v", res.Action))
+	}
+}
+
+// ResultChan implements watch.Interface.
+func (w *etcdWatcher) ResultChan() <-chan watch.Event {
+	return w.outgoing
+}
+
+// Stop implements watch.Interface.
+func (w *etcdWatcher) Stop() {
+	w.stopLock.Lock()
+	if w.cancel != nil {
+		w.cancel()
+		w.cancel = nil
+	}
+	if !w.stopped {
+		w.stopped = true
+		close(w.userStop)
+	}
+	w.stopLock.Unlock()
+
+	// Wait until all calls to etcd are finished and no other
+	// will be issued.
+	w.wg.Wait()
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd/metrics/metrics.go b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd/metrics/metrics.go
new file mode 100644
index 0000000..96385f6
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd/metrics/metrics.go
@@ -0,0 +1,122 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+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.
+*/
+
+package metrics
+
+import (
+	"sync"
+	"time"
+
+	"github.com/prometheus/client_golang/prometheus"
+)
+
+var (
+	cacheHitCounterOpts = prometheus.CounterOpts{
+		Name: "etcd_helper_cache_hit_count",
+		Help: "Counter of etcd helper cache hits.",
+	}
+	cacheHitCounter      = prometheus.NewCounter(cacheHitCounterOpts)
+	cacheMissCounterOpts = prometheus.CounterOpts{
+		Name: "etcd_helper_cache_miss_count",
+		Help: "Counter of etcd helper cache miss.",
+	}
+	cacheMissCounter      = prometheus.NewCounter(cacheMissCounterOpts)
+	cacheEntryCounterOpts = prometheus.CounterOpts{
+		Name: "etcd_helper_cache_entry_count",
+		Help: "Counter of etcd helper cache entries. This can be different from etcd_helper_cache_miss_count " +
+			"because two concurrent threads can miss the cache and generate the same entry twice.",
+	}
+	cacheEntryCounter = prometheus.NewCounter(cacheEntryCounterOpts)
+	cacheGetLatency   = prometheus.NewSummary(
+		prometheus.SummaryOpts{
+			Name: "etcd_request_cache_get_latencies_summary",
+			Help: "Latency in microseconds of getting an object from etcd cache",
+		},
+	)
+	cacheAddLatency = prometheus.NewSummary(
+		prometheus.SummaryOpts{
+			Name: "etcd_request_cache_add_latencies_summary",
+			Help: "Latency in microseconds of adding an object to etcd cache",
+		},
+	)
+	etcdRequestLatenciesSummary = prometheus.NewSummaryVec(
+		prometheus.SummaryOpts{
+			Name: "etcd_request_latencies_summary",
+			Help: "Etcd request latency summary in microseconds for each operation and object type.",
+		},
+		[]string{"operation", "type"},
+	)
+	objectCounts = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "etcd_object_counts",
+			Help: "Number of stored objects at the time of last check split by kind.",
+		},
+		[]string{"resource"},
+	)
+)
+
+var registerMetrics sync.Once
+
+// Register all metrics.
+func Register() {
+	// Register the metrics.
+	registerMetrics.Do(func() {
+		prometheus.MustRegister(cacheHitCounter)
+		prometheus.MustRegister(cacheMissCounter)
+		prometheus.MustRegister(cacheEntryCounter)
+		prometheus.MustRegister(cacheAddLatency)
+		prometheus.MustRegister(cacheGetLatency)
+		prometheus.MustRegister(etcdRequestLatenciesSummary)
+		prometheus.MustRegister(objectCounts)
+	})
+}
+
+func UpdateObjectCount(resourcePrefix string, count int64) {
+	objectCounts.WithLabelValues(resourcePrefix).Set(float64(count))
+}
+
+func RecordEtcdRequestLatency(verb, resource string, startTime time.Time) {
+	etcdRequestLatenciesSummary.WithLabelValues(verb, resource).Observe(float64(time.Since(startTime) / time.Microsecond))
+}
+
+func ObserveGetCache(startTime time.Time) {
+	cacheGetLatency.Observe(float64(time.Since(startTime) / time.Microsecond))
+}
+
+func ObserveAddCache(startTime time.Time) {
+	cacheAddLatency.Observe(float64(time.Since(startTime) / time.Microsecond))
+}
+
+func ObserveCacheHit() {
+	cacheHitCounter.Inc()
+}
+
+func ObserveCacheMiss() {
+	cacheMissCounter.Inc()
+}
+
+func ObserveNewEntry() {
+	cacheEntryCounter.Inc()
+}
+
+func Reset() {
+	cacheHitCounter = prometheus.NewCounter(cacheHitCounterOpts)
+	cacheMissCounter = prometheus.NewCounter(cacheMissCounterOpts)
+	cacheEntryCounter = prometheus.NewCounter(cacheEntryCounterOpts)
+	// TODO: Reset cacheAddLatency.
+	// TODO: Reset cacheGetLatency.
+	etcdRequestLatenciesSummary.Reset()
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd/util/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd/util/doc.go
new file mode 100644
index 0000000..97241a4
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd/util/doc.go
@@ -0,0 +1,19 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+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.
+*/
+
+// Package util holds generic etcd-related utility functions that any user of ectd might want to
+// use, without pulling in kubernetes-specific code.
+package util // import "k8s.io/apiserver/pkg/storage/etcd/util"
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd/util/etcd_util.go b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd/util/etcd_util.go
new file mode 100644
index 0000000..7c71fe2
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd/util/etcd_util.go
@@ -0,0 +1,99 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+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.
+*/
+
+package util
+
+import (
+	"encoding/json"
+	"fmt"
+	"io/ioutil"
+	"net/http"
+
+	etcd "github.com/coreos/etcd/client"
+)
+
+// IsEtcdNotFound returns true if and only if err is an etcd not found error.
+func IsEtcdNotFound(err error) bool {
+	return isEtcdErrorNum(err, etcd.ErrorCodeKeyNotFound)
+}
+
+// IsEtcdNodeExist returns true if and only if err is an etcd node already exist error.
+func IsEtcdNodeExist(err error) bool {
+	return isEtcdErrorNum(err, etcd.ErrorCodeNodeExist)
+}
+
+// IsEtcdTestFailed returns true if and only if err is an etcd write conflict.
+func IsEtcdTestFailed(err error) bool {
+	return isEtcdErrorNum(err, etcd.ErrorCodeTestFailed)
+}
+
+// IsEtcdWatchExpired returns true if and only if err indicates the watch has expired.
+func IsEtcdWatchExpired(err error) bool {
+	// NOTE: This seems weird why it wouldn't be etcd.ErrorCodeWatcherCleared
+	//       I'm using the previous matching value
+	return isEtcdErrorNum(err, etcd.ErrorCodeEventIndexCleared)
+}
+
+// IsEtcdUnreachable returns true if and only if err indicates the server could not be reached.
+func IsEtcdUnreachable(err error) bool {
+	// NOTE: The logic has changed previous error code no longer applies
+	return err == etcd.ErrClusterUnavailable
+}
+
+// isEtcdErrorNum returns true if and only if err is an etcd error, whose errorCode matches errorCode
+func isEtcdErrorNum(err error, errorCode int) bool {
+	if err != nil {
+		if etcdError, ok := err.(etcd.Error); ok {
+			return etcdError.Code == errorCode
+		}
+		// NOTE: There are other error types returned
+	}
+	return false
+}
+
+// GetEtcdVersion performs a version check against the provided Etcd server,
+// returning the string response, and error (if any).
+func GetEtcdVersion(host string) (string, error) {
+	response, err := http.Get(host + "/version")
+	if err != nil {
+		return "", err
+	}
+	defer response.Body.Close()
+	if response.StatusCode != http.StatusOK {
+		return "", fmt.Errorf("unsuccessful response from etcd server %q: %v", host, err)
+	}
+	versionBytes, err := ioutil.ReadAll(response.Body)
+	if err != nil {
+		return "", err
+	}
+	return string(versionBytes), nil
+}
+
+type etcdHealth struct {
+	// Note this has to be public so the json library can modify it.
+	Health string `json:"health"`
+}
+
+func EtcdHealthCheck(data []byte) error {
+	obj := etcdHealth{}
+	if err := json.Unmarshal(data, &obj); err != nil {
+		return err
+	}
+	if obj.Health != "true" {
+		return fmt.Errorf("Unhealthy status: %s", obj.Health)
+	}
+	return nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd3/OWNERS b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd3/OWNERS
new file mode 100755
index 0000000..84c24e7
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd3/OWNERS
@@ -0,0 +1,5 @@
+reviewers:
+- wojtek-t
+- timothysc
+- madhusudancs
+- hongchaodeng
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd3/compact.go b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd3/compact.go
new file mode 100644
index 0000000..bdcd5bc
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd3/compact.go
@@ -0,0 +1,162 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package etcd3
+
+import (
+	"context"
+	"strconv"
+	"sync"
+	"time"
+
+	"github.com/coreos/etcd/clientv3"
+	"github.com/golang/glog"
+)
+
+const (
+	compactRevKey = "compact_rev_key"
+)
+
+var (
+	endpointsMapMu sync.Mutex
+	endpointsMap   map[string]struct{}
+)
+
+func init() {
+	endpointsMap = make(map[string]struct{})
+}
+
+// StartCompactor starts a compactor in the background to compact old version of keys that's not needed.
+// By default, we save the most recent 10 minutes data and compact versions > 10minutes ago.
+// It should be enough for slow watchers and to tolerate burst.
+// TODO: We might keep a longer history (12h) in the future once storage API can take advantage of past version of keys.
+func StartCompactor(ctx context.Context, client *clientv3.Client, compactInterval time.Duration) {
+	endpointsMapMu.Lock()
+	defer endpointsMapMu.Unlock()
+
+	// In one process, we can have only one compactor for one cluster.
+	// Currently we rely on endpoints to differentiate clusters.
+	for _, ep := range client.Endpoints() {
+		if _, ok := endpointsMap[ep]; ok {
+			glog.V(4).Infof("compactor already exists for endpoints %v", client.Endpoints())
+			return
+		}
+	}
+	for _, ep := range client.Endpoints() {
+		endpointsMap[ep] = struct{}{}
+	}
+
+	if compactInterval != 0 {
+		go compactor(ctx, client, compactInterval)
+	}
+}
+
+// compactor periodically compacts historical versions of keys in etcd.
+// It will compact keys with versions older than given interval.
+// In other words, after compaction, it will only contain keys set during last interval.
+// Any API call for the older versions of keys will return error.
+// Interval is the time interval between each compaction. The first compaction happens after "interval".
+func compactor(ctx context.Context, client *clientv3.Client, interval time.Duration) {
+	// Technical definitions:
+	// We have a special key in etcd defined as *compactRevKey*.
+	// compactRevKey's value will be set to the string of last compacted revision.
+	// compactRevKey's version will be used as logical time for comparison. THe version is referred as compact time.
+	// Initially, because the key doesn't exist, the compact time (version) is 0.
+	//
+	// Algorithm:
+	// - Compare to see if (local compact_time) = (remote compact_time).
+	// - If yes, increment both local and remote compact_time, and do a compaction.
+	// - If not, set local to remote compact_time.
+	//
+	// Technical details/insights:
+	//
+	// The protocol here is lease based. If one compactor CAS successfully, the others would know it when they fail in
+	// CAS later and would try again in 10 minutes. If an APIServer crashed, another one would "take over" the lease.
+	//
+	// For example, in the following diagram, we have a compactor C1 doing compaction in t1, t2. Another compactor C2
+	// at t1' (t1 < t1' < t2) would CAS fail, set its known oldRev to rev at t1', and try again in t2' (t2' > t2).
+	// If C1 crashed and wouldn't compact at t2, C2 would CAS successfully at t2'.
+	//
+	//                 oldRev(t2)     curRev(t2)
+	//                                  +
+	//   oldRev        curRev           |
+	//     +             +              |
+	//     |             |              |
+	//     |             |    t1'       |     t2'
+	// +---v-------------v----^---------v------^---->
+	//     t0           t1             t2
+	//
+	// We have the guarantees:
+	// - in normal cases, the interval is 10 minutes.
+	// - in failover, the interval is >10m and <20m
+	//
+	// FAQ:
+	// - What if time is not accurate? We don't care as long as someone did the compaction. Atomicity is ensured using
+	//   etcd API.
+	// - What happened under heavy load scenarios? Initially, each apiserver will do only one compaction
+	//   every 10 minutes. This is very unlikely affecting or affected w.r.t. server load.
+
+	var compactTime int64
+	var rev int64
+	var err error
+	for {
+		select {
+		case <-time.After(interval):
+		case <-ctx.Done():
+			return
+		}
+
+		compactTime, rev, err = compact(ctx, client, compactTime, rev)
+		if err != nil {
+			glog.Errorf("etcd: endpoint (%v) compact failed: %v", client.Endpoints(), err)
+			continue
+		}
+	}
+}
+
+// compact compacts etcd store and returns current rev.
+// It will return the current compact time and global revision if no error occurred.
+// Note that CAS fail will not incur any error.
+func compact(ctx context.Context, client *clientv3.Client, t, rev int64) (int64, int64, error) {
+	resp, err := client.KV.Txn(ctx).If(
+		clientv3.Compare(clientv3.Version(compactRevKey), "=", t),
+	).Then(
+		clientv3.OpPut(compactRevKey, strconv.FormatInt(rev, 10)), // Expect side effect: increment Version
+	).Else(
+		clientv3.OpGet(compactRevKey),
+	).Commit()
+	if err != nil {
+		return t, rev, err
+	}
+
+	curRev := resp.Header.Revision
+
+	if !resp.Succeeded {
+		curTime := resp.Responses[0].GetResponseRange().Kvs[0].Version
+		return curTime, curRev, nil
+	}
+	curTime := t + 1
+
+	if rev == 0 {
+		// We don't compact on bootstrap.
+		return curTime, curRev, nil
+	}
+	if _, err = client.Compact(ctx, rev); err != nil {
+		return curTime, curRev, err
+	}
+	glog.V(4).Infof("etcd: compacted rev (%d), endpoints (%v)", rev, client.Endpoints())
+	return curTime, curRev, nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd3/errors.go b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd3/errors.go
new file mode 100644
index 0000000..5aac30a
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd3/errors.go
@@ -0,0 +1,42 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package etcd3
+
+import (
+	"k8s.io/apimachinery/pkg/api/errors"
+
+	etcdrpc "github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes"
+)
+
+func interpretWatchError(err error) error {
+	switch {
+	case err == etcdrpc.ErrCompacted:
+		return errors.NewResourceExpired("The resourceVersion for the provided watch is too old.")
+	}
+	return err
+}
+
+func interpretListError(err error, paging bool) error {
+	switch {
+	case err == etcdrpc.ErrCompacted:
+		if paging {
+			return errors.NewResourceExpired("The provided from parameter is too old to display a consistent list result. You must start a new list without the from.")
+		}
+		return errors.NewResourceExpired("The resourceVersion for the provided list is too old.")
+	}
+	return err
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd3/event.go b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd3/event.go
new file mode 100644
index 0000000..7dc9175
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd3/event.go
@@ -0,0 +1,57 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package etcd3
+
+import (
+	"github.com/coreos/etcd/clientv3"
+	"github.com/coreos/etcd/mvcc/mvccpb"
+)
+
+type event struct {
+	key       string
+	value     []byte
+	prevValue []byte
+	rev       int64
+	isDeleted bool
+	isCreated bool
+}
+
+// parseKV converts a KeyValue retrieved from an initial sync() listing to a synthetic isCreated event.
+func parseKV(kv *mvccpb.KeyValue) *event {
+	return &event{
+		key:       string(kv.Key),
+		value:     kv.Value,
+		prevValue: nil,
+		rev:       kv.ModRevision,
+		isDeleted: false,
+		isCreated: true,
+	}
+}
+
+func parseEvent(e *clientv3.Event) *event {
+	ret := &event{
+		key:       string(e.Kv.Key),
+		value:     e.Kv.Value,
+		rev:       e.Kv.ModRevision,
+		isDeleted: e.Type == clientv3.EventTypeDelete,
+		isCreated: e.IsCreate(),
+	}
+	if e.PrevKv != nil {
+		ret.prevValue = e.PrevKv.Value
+	}
+	return ret
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd3/lease_manager.go b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd3/lease_manager.go
new file mode 100644
index 0000000..dc06ac5
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd3/lease_manager.go
@@ -0,0 +1,102 @@
+/*
+Copyright 2018 The Kubernetes Authors.
+
+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.
+*/
+
+package etcd3
+
+import (
+	"context"
+	"sync"
+	"time"
+
+	"github.com/coreos/etcd/clientv3"
+)
+
+// leaseManager is used to manage leases requested from etcd. If a new write
+// needs a lease that has similar expiration time to the previous one, the old
+// lease will be reused to reduce the overhead of etcd, since lease operations
+// are expensive. In the implementation, we only store one previous lease,
+// since all the events have the same ttl.
+type leaseManager struct {
+	client                  *clientv3.Client // etcd client used to grant leases
+	leaseMu                 sync.Mutex
+	prevLeaseID             clientv3.LeaseID
+	prevLeaseExpirationTime time.Time
+	// The period of time in seconds and percent of TTL that each lease is
+	// reused. The minimum of them is used to avoid unreasonably large
+	// numbers. We use var instead of const for testing purposes.
+	leaseReuseDurationSeconds int64
+	leaseReuseDurationPercent float64
+}
+
+// newDefaultLeaseManager creates a new lease manager using default setting.
+func newDefaultLeaseManager(client *clientv3.Client) *leaseManager {
+	return newLeaseManager(client, 60, 0.05)
+}
+
+// newLeaseManager creates a new lease manager with the number of buffered
+// leases, lease reuse duration in seconds and percentage. The percentage
+// value x means x*100%.
+func newLeaseManager(client *clientv3.Client, leaseReuseDurationSeconds int64, leaseReuseDurationPercent float64) *leaseManager {
+	return &leaseManager{
+		client: client,
+		leaseReuseDurationSeconds: leaseReuseDurationSeconds,
+		leaseReuseDurationPercent: leaseReuseDurationPercent,
+	}
+}
+
+// setLeaseReuseDurationSeconds is used for testing purpose. It is used to
+// reduce the extra lease duration to avoid unnecessary timeout in testing.
+func (l *leaseManager) setLeaseReuseDurationSeconds(duration int64) {
+	l.leaseMu.Lock()
+	defer l.leaseMu.Unlock()
+	l.leaseReuseDurationSeconds = duration
+}
+
+// GetLease returns a lease based on requested ttl: if the cached previous
+// lease can be reused, reuse it; otherwise request a new one from etcd.
+func (l *leaseManager) GetLease(ctx context.Context, ttl int64) (clientv3.LeaseID, error) {
+	now := time.Now()
+	l.leaseMu.Lock()
+	defer l.leaseMu.Unlock()
+	// check if previous lease can be reused
+	reuseDurationSeconds := l.getReuseDurationSecondsLocked(ttl)
+	valid := now.Add(time.Duration(ttl) * time.Second).Before(l.prevLeaseExpirationTime)
+	sufficient := now.Add(time.Duration(ttl+reuseDurationSeconds) * time.Second).After(l.prevLeaseExpirationTime)
+	if valid && sufficient {
+		return l.prevLeaseID, nil
+	}
+	// request a lease with a little extra ttl from etcd
+	ttl += reuseDurationSeconds
+	lcr, err := l.client.Lease.Grant(ctx, ttl)
+	if err != nil {
+		return clientv3.LeaseID(0), err
+	}
+	// cache the new lease id
+	l.prevLeaseID = lcr.ID
+	l.prevLeaseExpirationTime = now.Add(time.Duration(ttl) * time.Second)
+	return lcr.ID, nil
+}
+
+// getReuseDurationSecondsLocked returns the reusable duration in seconds
+// based on the configuration. Lock has to be acquired before calling this
+// function.
+func (l *leaseManager) getReuseDurationSecondsLocked(ttl int64) int64 {
+	reuseDurationSeconds := int64(l.leaseReuseDurationPercent * float64(ttl))
+	if reuseDurationSeconds > l.leaseReuseDurationSeconds {
+		reuseDurationSeconds = l.leaseReuseDurationSeconds
+	}
+	return reuseDurationSeconds
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd3/preflight/checks.go b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd3/preflight/checks.go
new file mode 100644
index 0000000..9c12c20
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd3/preflight/checks.go
@@ -0,0 +1,70 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package preflight
+
+import (
+	"fmt"
+	"math/rand"
+	"net"
+	"net/url"
+	"time"
+)
+
+const connectionTimeout = 1 * time.Second
+
+// EtcdConnection holds the Etcd server list
+type EtcdConnection struct {
+	ServerList []string
+}
+
+func (EtcdConnection) serverReachable(connURL *url.URL) bool {
+	scheme := connURL.Scheme
+	if scheme == "http" || scheme == "https" || scheme == "tcp" {
+		scheme = "tcp"
+	}
+	if conn, err := net.DialTimeout(scheme, connURL.Host, connectionTimeout); err == nil {
+		defer conn.Close()
+		return true
+	}
+	return false
+}
+
+func parseServerURI(serverURI string) (*url.URL, error) {
+	connURL, err := url.Parse(serverURI)
+	if err != nil {
+		return &url.URL{}, fmt.Errorf("unable to parse etcd url: %v", err)
+	}
+	return connURL, nil
+}
+
+// CheckEtcdServers will attempt to reach all etcd servers once. If any
+// can be reached, return true.
+func (con EtcdConnection) CheckEtcdServers() (done bool, err error) {
+	// Attempt to reach every Etcd server randomly.
+	serverNumber := len(con.ServerList)
+	serverPerms := rand.Perm(serverNumber)
+	for _, index := range serverPerms {
+		host, err := parseServerURI(con.ServerList[index])
+		if err != nil {
+			return false, err
+		}
+		if con.serverReachable(host) {
+			return true, nil
+		}
+	}
+	return false, nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd3/store.go b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd3/store.go
new file mode 100644
index 0000000..1513af8
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd3/store.go
@@ -0,0 +1,816 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package etcd3
+
+import (
+	"bytes"
+	"context"
+	"encoding/base64"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"path"
+	"reflect"
+	"strings"
+	"time"
+
+	"github.com/coreos/etcd/clientv3"
+	"github.com/golang/glog"
+
+	apierrors "k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/api/meta"
+	"k8s.io/apimachinery/pkg/conversion"
+	"k8s.io/apimachinery/pkg/runtime"
+	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
+	"k8s.io/apimachinery/pkg/watch"
+	"k8s.io/apiserver/pkg/storage"
+	"k8s.io/apiserver/pkg/storage/etcd"
+	"k8s.io/apiserver/pkg/storage/value"
+	utiltrace "k8s.io/apiserver/pkg/util/trace"
+)
+
+// authenticatedDataString satisfies the value.Context interface. It uses the key to
+// authenticate the stored data. This does not defend against reuse of previously
+// encrypted values under the same key, but will prevent an attacker from using an
+// encrypted value from a different key. A stronger authenticated data segment would
+// include the etcd3 Version field (which is incremented on each write to a key and
+// reset when the key is deleted), but an attacker with write access to etcd can
+// force deletion and recreation of keys to weaken that angle.
+type authenticatedDataString string
+
+// AuthenticatedData implements the value.Context interface.
+func (d authenticatedDataString) AuthenticatedData() []byte {
+	return []byte(string(d))
+}
+
+var _ value.Context = authenticatedDataString("")
+
+type store struct {
+	client *clientv3.Client
+	// getOpts contains additional options that should be passed
+	// to all Get() calls.
+	getOps        []clientv3.OpOption
+	codec         runtime.Codec
+	versioner     storage.Versioner
+	transformer   value.Transformer
+	pathPrefix    string
+	watcher       *watcher
+	pagingEnabled bool
+	leaseManager  *leaseManager
+}
+
+type elemForDecode struct {
+	data []byte
+	rev  uint64
+}
+
+type objState struct {
+	obj   runtime.Object
+	meta  *storage.ResponseMeta
+	rev   int64
+	data  []byte
+	stale bool
+}
+
+// New returns an etcd3 implementation of storage.Interface.
+func New(c *clientv3.Client, codec runtime.Codec, prefix string, transformer value.Transformer, pagingEnabled bool) storage.Interface {
+	return newStore(c, true, pagingEnabled, codec, prefix, transformer)
+}
+
+// NewWithNoQuorumRead returns etcd3 implementation of storage.Interface
+// where Get operations don't require quorum read.
+func NewWithNoQuorumRead(c *clientv3.Client, codec runtime.Codec, prefix string, transformer value.Transformer, pagingEnabled bool) storage.Interface {
+	return newStore(c, false, pagingEnabled, codec, prefix, transformer)
+}
+
+func newStore(c *clientv3.Client, quorumRead, pagingEnabled bool, codec runtime.Codec, prefix string, transformer value.Transformer) *store {
+	versioner := etcd.APIObjectVersioner{}
+	result := &store{
+		client:        c,
+		codec:         codec,
+		versioner:     versioner,
+		transformer:   transformer,
+		pagingEnabled: pagingEnabled,
+		// for compatibility with etcd2 impl.
+		// no-op for default prefix of '/registry'.
+		// keeps compatibility with etcd2 impl for custom prefixes that don't start with '/'
+		pathPrefix:   path.Join("/", prefix),
+		watcher:      newWatcher(c, codec, versioner, transformer),
+		leaseManager: newDefaultLeaseManager(c),
+	}
+	if !quorumRead {
+		// In case of non-quorum reads, we can set WithSerializable()
+		// options for all Get operations.
+		result.getOps = append(result.getOps, clientv3.WithSerializable())
+	}
+	return result
+}
+
+// Versioner implements storage.Interface.Versioner.
+func (s *store) Versioner() storage.Versioner {
+	return s.versioner
+}
+
+// Get implements storage.Interface.Get.
+func (s *store) Get(ctx context.Context, key string, resourceVersion string, out runtime.Object, ignoreNotFound bool) error {
+	key = path.Join(s.pathPrefix, key)
+	getResp, err := s.client.KV.Get(ctx, key, s.getOps...)
+	if err != nil {
+		return err
+	}
+
+	if len(getResp.Kvs) == 0 {
+		if ignoreNotFound {
+			return runtime.SetZeroValue(out)
+		}
+		return storage.NewKeyNotFoundError(key, 0)
+	}
+	kv := getResp.Kvs[0]
+
+	data, _, err := s.transformer.TransformFromStorage(kv.Value, authenticatedDataString(key))
+	if err != nil {
+		return storage.NewInternalError(err.Error())
+	}
+
+	return decode(s.codec, s.versioner, data, out, kv.ModRevision)
+}
+
+// Create implements storage.Interface.Create.
+func (s *store) Create(ctx context.Context, key string, obj, out runtime.Object, ttl uint64) error {
+	if version, err := s.versioner.ObjectResourceVersion(obj); err == nil && version != 0 {
+		return errors.New("resourceVersion should not be set on objects to be created")
+	}
+	if err := s.versioner.PrepareObjectForStorage(obj); err != nil {
+		return fmt.Errorf("PrepareObjectForStorage failed: %v", err)
+	}
+	data, err := runtime.Encode(s.codec, obj)
+	if err != nil {
+		return err
+	}
+	key = path.Join(s.pathPrefix, key)
+
+	opts, err := s.ttlOpts(ctx, int64(ttl))
+	if err != nil {
+		return err
+	}
+
+	newData, err := s.transformer.TransformToStorage(data, authenticatedDataString(key))
+	if err != nil {
+		return storage.NewInternalError(err.Error())
+	}
+
+	txnResp, err := s.client.KV.Txn(ctx).If(
+		notFound(key),
+	).Then(
+		clientv3.OpPut(key, string(newData), opts...),
+	).Commit()
+	if err != nil {
+		return err
+	}
+	if !txnResp.Succeeded {
+		return storage.NewKeyExistsError(key, 0)
+	}
+
+	if out != nil {
+		putResp := txnResp.Responses[0].GetResponsePut()
+		return decode(s.codec, s.versioner, data, out, putResp.Header.Revision)
+	}
+	return nil
+}
+
+// Delete implements storage.Interface.Delete.
+func (s *store) Delete(ctx context.Context, key string, out runtime.Object, preconditions *storage.Preconditions) error {
+	v, err := conversion.EnforcePtr(out)
+	if err != nil {
+		panic("unable to convert output object to pointer")
+	}
+	key = path.Join(s.pathPrefix, key)
+	if preconditions == nil {
+		return s.unconditionalDelete(ctx, key, out)
+	}
+	return s.conditionalDelete(ctx, key, out, v, preconditions)
+}
+
+func (s *store) unconditionalDelete(ctx context.Context, key string, out runtime.Object) error {
+	// We need to do get and delete in single transaction in order to
+	// know the value and revision before deleting it.
+	txnResp, err := s.client.KV.Txn(ctx).If().Then(
+		clientv3.OpGet(key),
+		clientv3.OpDelete(key),
+	).Commit()
+	if err != nil {
+		return err
+	}
+	getResp := txnResp.Responses[0].GetResponseRange()
+	if len(getResp.Kvs) == 0 {
+		return storage.NewKeyNotFoundError(key, 0)
+	}
+
+	kv := getResp.Kvs[0]
+	data, _, err := s.transformer.TransformFromStorage(kv.Value, authenticatedDataString(key))
+	if err != nil {
+		return storage.NewInternalError(err.Error())
+	}
+	return decode(s.codec, s.versioner, data, out, kv.ModRevision)
+}
+
+func (s *store) conditionalDelete(ctx context.Context, key string, out runtime.Object, v reflect.Value, preconditions *storage.Preconditions) error {
+	getResp, err := s.client.KV.Get(ctx, key)
+	if err != nil {
+		return err
+	}
+	for {
+		origState, err := s.getState(getResp, key, v, false)
+		if err != nil {
+			return err
+		}
+		if err := checkPreconditions(key, preconditions, origState.obj); err != nil {
+			return err
+		}
+		txnResp, err := s.client.KV.Txn(ctx).If(
+			clientv3.Compare(clientv3.ModRevision(key), "=", origState.rev),
+		).Then(
+			clientv3.OpDelete(key),
+		).Else(
+			clientv3.OpGet(key),
+		).Commit()
+		if err != nil {
+			return err
+		}
+		if !txnResp.Succeeded {
+			getResp = (*clientv3.GetResponse)(txnResp.Responses[0].GetResponseRange())
+			glog.V(4).Infof("deletion of %s failed because of a conflict, going to retry", key)
+			continue
+		}
+		return decode(s.codec, s.versioner, origState.data, out, origState.rev)
+	}
+}
+
+// GuaranteedUpdate implements storage.Interface.GuaranteedUpdate.
+func (s *store) GuaranteedUpdate(
+	ctx context.Context, key string, out runtime.Object, ignoreNotFound bool,
+	preconditions *storage.Preconditions, tryUpdate storage.UpdateFunc, suggestion ...runtime.Object) error {
+	trace := utiltrace.New(fmt.Sprintf("GuaranteedUpdate etcd3: %s", reflect.TypeOf(out).String()))
+	defer trace.LogIfLong(500 * time.Millisecond)
+
+	v, err := conversion.EnforcePtr(out)
+	if err != nil {
+		panic("unable to convert output object to pointer")
+	}
+	key = path.Join(s.pathPrefix, key)
+
+	getCurrentState := func() (*objState, error) {
+		getResp, err := s.client.KV.Get(ctx, key, s.getOps...)
+		if err != nil {
+			return nil, err
+		}
+		return s.getState(getResp, key, v, ignoreNotFound)
+	}
+
+	var origState *objState
+	var mustCheckData bool
+	if len(suggestion) == 1 && suggestion[0] != nil {
+		origState, err = s.getStateFromObject(suggestion[0])
+		if err != nil {
+			return err
+		}
+		mustCheckData = true
+	} else {
+		origState, err = getCurrentState()
+		if err != nil {
+			return err
+		}
+	}
+	trace.Step("initial value restored")
+
+	transformContext := authenticatedDataString(key)
+	for {
+		if err := checkPreconditions(key, preconditions, origState.obj); err != nil {
+			return err
+		}
+
+		ret, ttl, err := s.updateState(origState, tryUpdate)
+		if err != nil {
+			// It's possible we were working with stale data
+			if mustCheckData && apierrors.IsConflict(err) {
+				// Actually fetch
+				origState, err = getCurrentState()
+				if err != nil {
+					return err
+				}
+				mustCheckData = false
+				// Retry
+				continue
+			}
+
+			return err
+		}
+
+		data, err := runtime.Encode(s.codec, ret)
+		if err != nil {
+			return err
+		}
+		if !origState.stale && bytes.Equal(data, origState.data) {
+			// if we skipped the original Get in this loop, we must refresh from
+			// etcd in order to be sure the data in the store is equivalent to
+			// our desired serialization
+			if mustCheckData {
+				origState, err = getCurrentState()
+				if err != nil {
+					return err
+				}
+				mustCheckData = false
+				if !bytes.Equal(data, origState.data) {
+					// original data changed, restart loop
+					continue
+				}
+			}
+			// recheck that the data from etcd is not stale before short-circuiting a write
+			if !origState.stale {
+				return decode(s.codec, s.versioner, origState.data, out, origState.rev)
+			}
+		}
+
+		newData, err := s.transformer.TransformToStorage(data, transformContext)
+		if err != nil {
+			return storage.NewInternalError(err.Error())
+		}
+
+		opts, err := s.ttlOpts(ctx, int64(ttl))
+		if err != nil {
+			return err
+		}
+		trace.Step("Transaction prepared")
+
+		txnResp, err := s.client.KV.Txn(ctx).If(
+			clientv3.Compare(clientv3.ModRevision(key), "=", origState.rev),
+		).Then(
+			clientv3.OpPut(key, string(newData), opts...),
+		).Else(
+			clientv3.OpGet(key),
+		).Commit()
+		if err != nil {
+			return err
+		}
+		trace.Step("Transaction committed")
+		if !txnResp.Succeeded {
+			getResp := (*clientv3.GetResponse)(txnResp.Responses[0].GetResponseRange())
+			glog.V(4).Infof("GuaranteedUpdate of %s failed because of a conflict, going to retry", key)
+			origState, err = s.getState(getResp, key, v, ignoreNotFound)
+			if err != nil {
+				return err
+			}
+			trace.Step("Retry value restored")
+			mustCheckData = false
+			continue
+		}
+		putResp := txnResp.Responses[0].GetResponsePut()
+
+		return decode(s.codec, s.versioner, data, out, putResp.Header.Revision)
+	}
+}
+
+// GetToList implements storage.Interface.GetToList.
+func (s *store) GetToList(ctx context.Context, key string, resourceVersion string, pred storage.SelectionPredicate, listObj runtime.Object) error {
+	listPtr, err := meta.GetItemsPtr(listObj)
+	if err != nil {
+		return err
+	}
+	v, err := conversion.EnforcePtr(listPtr)
+	if err != nil || v.Kind() != reflect.Slice {
+		panic("need ptr to slice")
+	}
+
+	key = path.Join(s.pathPrefix, key)
+	getResp, err := s.client.KV.Get(ctx, key, s.getOps...)
+	if err != nil {
+		return err
+	}
+
+	if len(getResp.Kvs) > 0 {
+		data, _, err := s.transformer.TransformFromStorage(getResp.Kvs[0].Value, authenticatedDataString(key))
+		if err != nil {
+			return storage.NewInternalError(err.Error())
+		}
+		if err := appendListItem(v, data, uint64(getResp.Kvs[0].ModRevision), pred, s.codec, s.versioner); err != nil {
+			return err
+		}
+	}
+	// update version with cluster level revision
+	return s.versioner.UpdateList(listObj, uint64(getResp.Header.Revision), "")
+}
+
+func (s *store) Count(key string) (int64, error) {
+	key = path.Join(s.pathPrefix, key)
+	getResp, err := s.client.KV.Get(context.Background(), key, clientv3.WithRange(clientv3.GetPrefixRangeEnd(key)), clientv3.WithCountOnly())
+	if err != nil {
+		return 0, err
+	}
+	return getResp.Count, nil
+}
+
+// continueToken is a simple structured object for encoding the state of a continue token.
+// TODO: if we change the version of the encoded from, we can't start encoding the new version
+// until all other servers are upgraded (i.e. we need to support rolling schema)
+// This is a public API struct and cannot change.
+type continueToken struct {
+	APIVersion      string `json:"v"`
+	ResourceVersion int64  `json:"rv"`
+	StartKey        string `json:"start"`
+}
+
+// parseFrom transforms an encoded predicate from into a versioned struct.
+// TODO: return a typed error that instructs clients that they must relist
+func decodeContinue(continueValue, keyPrefix string) (fromKey string, rv int64, err error) {
+	data, err := base64.RawURLEncoding.DecodeString(continueValue)
+	if err != nil {
+		return "", 0, fmt.Errorf("continue key is not valid: %v", err)
+	}
+	var c continueToken
+	if err := json.Unmarshal(data, &c); err != nil {
+		return "", 0, fmt.Errorf("continue key is not valid: %v", err)
+	}
+	switch c.APIVersion {
+	case "meta.k8s.io/v1":
+		if c.ResourceVersion == 0 {
+			return "", 0, fmt.Errorf("continue key is not valid: incorrect encoded start resourceVersion (version meta.k8s.io/v1)")
+		}
+		if len(c.StartKey) == 0 {
+			return "", 0, fmt.Errorf("continue key is not valid: encoded start key empty (version meta.k8s.io/v1)")
+		}
+		// defend against path traversal attacks by clients - path.Clean will ensure that startKey cannot
+		// be at a higher level of the hierarchy, and so when we append the key prefix we will end up with
+		// continue start key that is fully qualified and cannot range over anything less specific than
+		// keyPrefix.
+		key := c.StartKey
+		if !strings.HasPrefix(key, "/") {
+			key = "/" + key
+		}
+		cleaned := path.Clean(key)
+		if cleaned != key {
+			return "", 0, fmt.Errorf("continue key is not valid: %s", c.StartKey)
+		}
+		return keyPrefix + cleaned[1:], c.ResourceVersion, nil
+	default:
+		return "", 0, fmt.Errorf("continue key is not valid: server does not recognize this encoded version %q", c.APIVersion)
+	}
+}
+
+// encodeContinue returns a string representing the encoded continuation of the current query.
+func encodeContinue(key, keyPrefix string, resourceVersion int64) (string, error) {
+	nextKey := strings.TrimPrefix(key, keyPrefix)
+	if nextKey == key {
+		return "", fmt.Errorf("unable to encode next field: the key and key prefix do not match")
+	}
+	out, err := json.Marshal(&continueToken{APIVersion: "meta.k8s.io/v1", ResourceVersion: resourceVersion, StartKey: nextKey})
+	if err != nil {
+		return "", err
+	}
+	return base64.RawURLEncoding.EncodeToString(out), nil
+}
+
+// List implements storage.Interface.List.
+func (s *store) List(ctx context.Context, key, resourceVersion string, pred storage.SelectionPredicate, listObj runtime.Object) error {
+	listPtr, err := meta.GetItemsPtr(listObj)
+	if err != nil {
+		return err
+	}
+	v, err := conversion.EnforcePtr(listPtr)
+	if err != nil || v.Kind() != reflect.Slice {
+		panic("need ptr to slice")
+	}
+
+	if s.pathPrefix != "" {
+		key = path.Join(s.pathPrefix, key)
+	}
+	// We need to make sure the key ended with "/" so that we only get children "directories".
+	// e.g. if we have key "/a", "/a/b", "/ab", getting keys with prefix "/a" will return all three,
+	// while with prefix "/a/" will return only "/a/b" which is the correct answer.
+	if !strings.HasSuffix(key, "/") {
+		key += "/"
+	}
+	keyPrefix := key
+
+	// set the appropriate clientv3 options to filter the returned data set
+	var paging bool
+	options := make([]clientv3.OpOption, 0, 4)
+	if s.pagingEnabled && pred.Limit > 0 {
+		paging = true
+		options = append(options, clientv3.WithLimit(pred.Limit))
+	}
+
+	var returnedRV int64
+	switch {
+	case s.pagingEnabled && len(pred.Continue) > 0:
+		continueKey, continueRV, err := decodeContinue(pred.Continue, keyPrefix)
+		if err != nil {
+			return apierrors.NewBadRequest(fmt.Sprintf("invalid continue token: %v", err))
+		}
+
+		if len(resourceVersion) > 0 && resourceVersion != "0" {
+			return apierrors.NewBadRequest("specifying resource version is not allowed when using continue")
+		}
+
+		rangeEnd := clientv3.GetPrefixRangeEnd(keyPrefix)
+		options = append(options, clientv3.WithRange(rangeEnd))
+		key = continueKey
+
+		options = append(options, clientv3.WithRev(continueRV))
+		returnedRV = continueRV
+
+	case s.pagingEnabled && pred.Limit > 0:
+		if len(resourceVersion) > 0 {
+			fromRV, err := s.versioner.ParseListResourceVersion(resourceVersion)
+			if err != nil {
+				return apierrors.NewBadRequest(fmt.Sprintf("invalid resource version: %v", err))
+			}
+			if fromRV > 0 {
+				options = append(options, clientv3.WithRev(int64(fromRV)))
+			}
+			returnedRV = int64(fromRV)
+		}
+
+		rangeEnd := clientv3.GetPrefixRangeEnd(keyPrefix)
+		options = append(options, clientv3.WithRange(rangeEnd))
+
+	default:
+		if len(resourceVersion) > 0 {
+			fromRV, err := s.versioner.ParseListResourceVersion(resourceVersion)
+			if err != nil {
+				return apierrors.NewBadRequest(fmt.Sprintf("invalid resource version: %v", err))
+			}
+			if fromRV > 0 {
+				options = append(options, clientv3.WithRev(int64(fromRV)))
+			}
+			returnedRV = int64(fromRV)
+		}
+
+		options = append(options, clientv3.WithPrefix())
+	}
+
+	// loop until we have filled the requested limit from etcd or there are no more results
+	var lastKey []byte
+	var hasMore bool
+	for {
+		getResp, err := s.client.KV.Get(ctx, key, options...)
+		if err != nil {
+			return interpretListError(err, len(pred.Continue) > 0)
+		}
+		hasMore = getResp.More
+
+		if len(getResp.Kvs) == 0 && getResp.More {
+			return fmt.Errorf("no results were found, but etcd indicated there were more values remaining")
+		}
+
+		// avoid small allocations for the result slice, since this can be called in many
+		// different contexts and we don't know how significantly the result will be filtered
+		if pred.Empty() {
+			growSlice(v, len(getResp.Kvs))
+		} else {
+			growSlice(v, 2048, len(getResp.Kvs))
+		}
+
+		// take items from the response until the bucket is full, filtering as we go
+		for _, kv := range getResp.Kvs {
+			if paging && int64(v.Len()) >= pred.Limit {
+				hasMore = true
+				break
+			}
+			lastKey = kv.Key
+
+			data, _, err := s.transformer.TransformFromStorage(kv.Value, authenticatedDataString(kv.Key))
+			if err != nil {
+				utilruntime.HandleError(fmt.Errorf("unable to transform key %q: %v", kv.Key, err))
+				continue
+			}
+
+			if err := appendListItem(v, data, uint64(kv.ModRevision), pred, s.codec, s.versioner); err != nil {
+				return err
+			}
+		}
+
+		// indicate to the client which resource version was returned
+		if returnedRV == 0 {
+			returnedRV = getResp.Header.Revision
+		}
+
+		// no more results remain or we didn't request paging
+		if !hasMore || !paging {
+			break
+		}
+		// we're paging but we have filled our bucket
+		if int64(v.Len()) >= pred.Limit {
+			break
+		}
+		key = string(lastKey) + "\x00"
+	}
+
+	// instruct the client to begin querying from immediately after the last key we returned
+	// we never return a key that the client wouldn't be allowed to see
+	if hasMore {
+		// we want to start immediately after the last key
+		next, err := encodeContinue(string(lastKey)+"\x00", keyPrefix, returnedRV)
+		if err != nil {
+			return err
+		}
+		return s.versioner.UpdateList(listObj, uint64(returnedRV), next)
+	}
+
+	// no continuation
+	return s.versioner.UpdateList(listObj, uint64(returnedRV), "")
+}
+
+// growSlice takes a slice value and grows its capacity up
+// to the maximum of the passed sizes or maxCapacity, whichever
+// is smaller. Above maxCapacity decisions about allocation are left
+// to the Go runtime on append. This allows a caller to make an
+// educated guess about the potential size of the total list while
+// still avoiding overly aggressive initial allocation. If sizes
+// is empty maxCapacity will be used as the size to grow.
+func growSlice(v reflect.Value, maxCapacity int, sizes ...int) {
+	cap := v.Cap()
+	max := cap
+	for _, size := range sizes {
+		if size > max {
+			max = size
+		}
+	}
+	if len(sizes) == 0 || max > maxCapacity {
+		max = maxCapacity
+	}
+	if max <= cap {
+		return
+	}
+	if v.Len() > 0 {
+		extra := reflect.MakeSlice(v.Type(), 0, max)
+		reflect.Copy(extra, v)
+		v.Set(extra)
+	} else {
+		extra := reflect.MakeSlice(v.Type(), 0, max)
+		v.Set(extra)
+	}
+}
+
+// Watch implements storage.Interface.Watch.
+func (s *store) Watch(ctx context.Context, key string, resourceVersion string, pred storage.SelectionPredicate) (watch.Interface, error) {
+	return s.watch(ctx, key, resourceVersion, pred, false)
+}
+
+// WatchList implements storage.Interface.WatchList.
+func (s *store) WatchList(ctx context.Context, key string, resourceVersion string, pred storage.SelectionPredicate) (watch.Interface, error) {
+	return s.watch(ctx, key, resourceVersion, pred, true)
+}
+
+func (s *store) watch(ctx context.Context, key string, rv string, pred storage.SelectionPredicate, recursive bool) (watch.Interface, error) {
+	rev, err := s.versioner.ParseWatchResourceVersion(rv)
+	if err != nil {
+		return nil, err
+	}
+	key = path.Join(s.pathPrefix, key)
+	return s.watcher.Watch(ctx, key, int64(rev), recursive, pred)
+}
+
+func (s *store) getState(getResp *clientv3.GetResponse, key string, v reflect.Value, ignoreNotFound bool) (*objState, error) {
+	state := &objState{
+		obj:  reflect.New(v.Type()).Interface().(runtime.Object),
+		meta: &storage.ResponseMeta{},
+	}
+	if len(getResp.Kvs) == 0 {
+		if !ignoreNotFound {
+			return nil, storage.NewKeyNotFoundError(key, 0)
+		}
+		if err := runtime.SetZeroValue(state.obj); err != nil {
+			return nil, err
+		}
+	} else {
+		data, stale, err := s.transformer.TransformFromStorage(getResp.Kvs[0].Value, authenticatedDataString(key))
+		if err != nil {
+			return nil, storage.NewInternalError(err.Error())
+		}
+		state.rev = getResp.Kvs[0].ModRevision
+		state.meta.ResourceVersion = uint64(state.rev)
+		state.data = data
+		state.stale = stale
+		if err := decode(s.codec, s.versioner, state.data, state.obj, state.rev); err != nil {
+			return nil, err
+		}
+	}
+	return state, nil
+}
+
+func (s *store) getStateFromObject(obj runtime.Object) (*objState, error) {
+	state := &objState{
+		obj:  obj,
+		meta: &storage.ResponseMeta{},
+	}
+
+	rv, err := s.versioner.ObjectResourceVersion(obj)
+	if err != nil {
+		return nil, fmt.Errorf("couldn't get resource version: %v", err)
+	}
+	state.rev = int64(rv)
+	state.meta.ResourceVersion = uint64(state.rev)
+
+	// Compute the serialized form - for that we need to temporarily clean
+	// its resource version field (those are not stored in etcd).
+	if err := s.versioner.PrepareObjectForStorage(obj); err != nil {
+		return nil, fmt.Errorf("PrepareObjectForStorage failed: %v", err)
+	}
+	state.data, err = runtime.Encode(s.codec, obj)
+	if err != nil {
+		return nil, err
+	}
+	s.versioner.UpdateObject(state.obj, uint64(rv))
+	return state, nil
+}
+
+func (s *store) updateState(st *objState, userUpdate storage.UpdateFunc) (runtime.Object, uint64, error) {
+	ret, ttlPtr, err := userUpdate(st.obj, *st.meta)
+	if err != nil {
+		return nil, 0, err
+	}
+
+	if err := s.versioner.PrepareObjectForStorage(ret); err != nil {
+		return nil, 0, fmt.Errorf("PrepareObjectForStorage failed: %v", err)
+	}
+	var ttl uint64
+	if ttlPtr != nil {
+		ttl = *ttlPtr
+	}
+	return ret, ttl, nil
+}
+
+// ttlOpts returns client options based on given ttl.
+// ttl: if ttl is non-zero, it will attach the key to a lease with ttl of roughly the same length
+func (s *store) ttlOpts(ctx context.Context, ttl int64) ([]clientv3.OpOption, error) {
+	if ttl == 0 {
+		return nil, nil
+	}
+	id, err := s.leaseManager.GetLease(ctx, ttl)
+	if err != nil {
+		return nil, err
+	}
+	return []clientv3.OpOption{clientv3.WithLease(id)}, nil
+}
+
+// decode decodes value of bytes into object. It will also set the object resource version to rev.
+// On success, objPtr would be set to the object.
+func decode(codec runtime.Codec, versioner storage.Versioner, value []byte, objPtr runtime.Object, rev int64) error {
+	if _, err := conversion.EnforcePtr(objPtr); err != nil {
+		panic("unable to convert output object to pointer")
+	}
+	_, _, err := codec.Decode(value, nil, objPtr)
+	if err != nil {
+		return err
+	}
+	// being unable to set the version does not prevent the object from being extracted
+	versioner.UpdateObject(objPtr, uint64(rev))
+	return nil
+}
+
+// appendListItem decodes and appends the object (if it passes filter) to v, which must be a slice.
+func appendListItem(v reflect.Value, data []byte, rev uint64, pred storage.SelectionPredicate, codec runtime.Codec, versioner storage.Versioner) error {
+	obj, _, err := codec.Decode(data, nil, reflect.New(v.Type().Elem()).Interface().(runtime.Object))
+	if err != nil {
+		return err
+	}
+	// being unable to set the version does not prevent the object from being extracted
+	versioner.UpdateObject(obj, rev)
+	if matched, err := pred.Matches(obj); err == nil && matched {
+		v.Set(reflect.Append(v, reflect.ValueOf(obj).Elem()))
+	}
+	return nil
+}
+
+func checkPreconditions(key string, preconditions *storage.Preconditions, out runtime.Object) error {
+	if preconditions == nil {
+		return nil
+	}
+	objMeta, err := meta.Accessor(out)
+	if err != nil {
+		return storage.NewInternalErrorf("can't enforce preconditions %v on un-introspectable object %v, got error: %v", *preconditions, out, err)
+	}
+	if preconditions.UID != nil && *preconditions.UID != objMeta.GetUID() {
+		errMsg := fmt.Sprintf("Precondition failed: UID in precondition: %v, UID in object meta: %v", *preconditions.UID, objMeta.GetUID())
+		return storage.NewInvalidObjError(key, errMsg)
+	}
+	return nil
+}
+
+func notFound(key string) clientv3.Cmp {
+	return clientv3.Compare(clientv3.ModRevision(key), "=", 0)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd3/watcher.go b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd3/watcher.go
new file mode 100644
index 0000000..f09a000
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/etcd3/watcher.go
@@ -0,0 +1,402 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package etcd3
+
+import (
+	"context"
+	"errors"
+	"fmt"
+	"os"
+	"strconv"
+	"strings"
+	"sync"
+
+	apierrs "k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/watch"
+	"k8s.io/apiserver/pkg/storage"
+	"k8s.io/apiserver/pkg/storage/value"
+
+	"github.com/coreos/etcd/clientv3"
+	"github.com/golang/glog"
+)
+
+const (
+	// We have set a buffer in order to reduce times of context switches.
+	incomingBufSize = 100
+	outgoingBufSize = 100
+)
+
+// fatalOnDecodeError is used during testing to panic the server if watcher encounters a decoding error
+var fatalOnDecodeError = false
+
+// errTestingDecode is the only error that testingDeferOnDecodeError catches during a panic
+var errTestingDecode = errors.New("sentinel error only used during testing to indicate watch decoding error")
+
+// testingDeferOnDecodeError is used during testing to recover from a panic caused by errTestingDecode, all other values continue to panic
+func testingDeferOnDecodeError() {
+	if r := recover(); r != nil && r != errTestingDecode {
+		panic(r)
+	}
+}
+
+func init() {
+	// check to see if we are running in a test environment
+	fatalOnDecodeError, _ = strconv.ParseBool(os.Getenv("KUBE_PANIC_WATCH_DECODE_ERROR"))
+}
+
+type watcher struct {
+	client      *clientv3.Client
+	codec       runtime.Codec
+	versioner   storage.Versioner
+	transformer value.Transformer
+}
+
+// watchChan implements watch.Interface.
+type watchChan struct {
+	watcher           *watcher
+	key               string
+	initialRev        int64
+	recursive         bool
+	internalPred      storage.SelectionPredicate
+	ctx               context.Context
+	cancel            context.CancelFunc
+	incomingEventChan chan *event
+	resultChan        chan watch.Event
+	errChan           chan error
+}
+
+func newWatcher(client *clientv3.Client, codec runtime.Codec, versioner storage.Versioner, transformer value.Transformer) *watcher {
+	return &watcher{
+		client:      client,
+		codec:       codec,
+		versioner:   versioner,
+		transformer: transformer,
+	}
+}
+
+// Watch watches on a key and returns a watch.Interface that transfers relevant notifications.
+// If rev is zero, it will return the existing object(s) and then start watching from
+// the maximum revision+1 from returned objects.
+// If rev is non-zero, it will watch events happened after given revision.
+// If recursive is false, it watches on given key.
+// If recursive is true, it watches any children and directories under the key, excluding the root key itself.
+// pred must be non-nil. Only if pred matches the change, it will be returned.
+func (w *watcher) Watch(ctx context.Context, key string, rev int64, recursive bool, pred storage.SelectionPredicate) (watch.Interface, error) {
+	if recursive && !strings.HasSuffix(key, "/") {
+		key += "/"
+	}
+	wc := w.createWatchChan(ctx, key, rev, recursive, pred)
+	go wc.run()
+	return wc, nil
+}
+
+func (w *watcher) createWatchChan(ctx context.Context, key string, rev int64, recursive bool, pred storage.SelectionPredicate) *watchChan {
+	wc := &watchChan{
+		watcher:           w,
+		key:               key,
+		initialRev:        rev,
+		recursive:         recursive,
+		internalPred:      pred,
+		incomingEventChan: make(chan *event, incomingBufSize),
+		resultChan:        make(chan watch.Event, outgoingBufSize),
+		errChan:           make(chan error, 1),
+	}
+	if pred.Empty() {
+		// The filter doesn't filter out any object.
+		wc.internalPred = storage.Everything
+	}
+	wc.ctx, wc.cancel = context.WithCancel(ctx)
+	return wc
+}
+
+func (wc *watchChan) run() {
+	watchClosedCh := make(chan struct{})
+	go wc.startWatching(watchClosedCh)
+
+	var resultChanWG sync.WaitGroup
+	resultChanWG.Add(1)
+	go wc.processEvent(&resultChanWG)
+
+	select {
+	case err := <-wc.errChan:
+		if err == context.Canceled {
+			break
+		}
+		errResult := transformErrorToEvent(err)
+		if errResult != nil {
+			// error result is guaranteed to be received by user before closing ResultChan.
+			select {
+			case wc.resultChan <- *errResult:
+			case <-wc.ctx.Done(): // user has given up all results
+			}
+		}
+	case <-watchClosedCh:
+	case <-wc.ctx.Done(): // user cancel
+	}
+
+	// We use wc.ctx to reap all goroutines. Under whatever condition, we should stop them all.
+	// It's fine to double cancel.
+	wc.cancel()
+
+	// we need to wait until resultChan wouldn't be used anymore
+	resultChanWG.Wait()
+	close(wc.resultChan)
+}
+
+func (wc *watchChan) Stop() {
+	wc.cancel()
+}
+
+func (wc *watchChan) ResultChan() <-chan watch.Event {
+	return wc.resultChan
+}
+
+// sync tries to retrieve existing data and send them to process.
+// The revision to watch will be set to the revision in response.
+// All events sent will have isCreated=true
+func (wc *watchChan) sync() error {
+	opts := []clientv3.OpOption{}
+	if wc.recursive {
+		opts = append(opts, clientv3.WithPrefix())
+	}
+	getResp, err := wc.watcher.client.Get(wc.ctx, wc.key, opts...)
+	if err != nil {
+		return err
+	}
+	wc.initialRev = getResp.Header.Revision
+	for _, kv := range getResp.Kvs {
+		wc.sendEvent(parseKV(kv))
+	}
+	return nil
+}
+
+// startWatching does:
+// - get current objects if initialRev=0; set initialRev to current rev
+// - watch on given key and send events to process.
+func (wc *watchChan) startWatching(watchClosedCh chan struct{}) {
+	if wc.initialRev == 0 {
+		if err := wc.sync(); err != nil {
+			glog.Errorf("failed to sync with latest state: %v", err)
+			wc.sendError(err)
+			return
+		}
+	}
+	opts := []clientv3.OpOption{clientv3.WithRev(wc.initialRev + 1), clientv3.WithPrevKV()}
+	if wc.recursive {
+		opts = append(opts, clientv3.WithPrefix())
+	}
+	wch := wc.watcher.client.Watch(wc.ctx, wc.key, opts...)
+	for wres := range wch {
+		if wres.Err() != nil {
+			err := wres.Err()
+			// If there is an error on server (e.g. compaction), the channel will return it before closed.
+			glog.Errorf("watch chan error: %v", err)
+			wc.sendError(err)
+			return
+		}
+		for _, e := range wres.Events {
+			wc.sendEvent(parseEvent(e))
+		}
+	}
+	// When we come to this point, it's only possible that client side ends the watch.
+	// e.g. cancel the context, close the client.
+	// If this watch chan is broken and context isn't cancelled, other goroutines will still hang.
+	// We should notify the main thread that this goroutine has exited.
+	close(watchClosedCh)
+}
+
+// processEvent processes events from etcd watcher and sends results to resultChan.
+func (wc *watchChan) processEvent(wg *sync.WaitGroup) {
+	defer wg.Done()
+
+	for {
+		select {
+		case e := <-wc.incomingEventChan:
+			res := wc.transform(e)
+			if res == nil {
+				continue
+			}
+			if len(wc.resultChan) == outgoingBufSize {
+				glog.Warningf("Fast watcher, slow processing. Number of buffered events: %d."+
+					"Probably caused by slow dispatching events to watchers", outgoingBufSize)
+			}
+			// If user couldn't receive results fast enough, we also block incoming events from watcher.
+			// Because storing events in local will cause more memory usage.
+			// The worst case would be closing the fast watcher.
+			select {
+			case wc.resultChan <- *res:
+			case <-wc.ctx.Done():
+				return
+			}
+		case <-wc.ctx.Done():
+			return
+		}
+	}
+}
+
+func (wc *watchChan) filter(obj runtime.Object) bool {
+	if wc.internalPred.Empty() {
+		return true
+	}
+	matched, err := wc.internalPred.Matches(obj)
+	return err == nil && matched
+}
+
+func (wc *watchChan) acceptAll() bool {
+	return wc.internalPred.Empty()
+}
+
+// transform transforms an event into a result for user if not filtered.
+func (wc *watchChan) transform(e *event) (res *watch.Event) {
+	curObj, oldObj, err := wc.prepareObjs(e)
+	if err != nil {
+		glog.Errorf("failed to prepare current and previous objects: %v", err)
+		wc.sendError(err)
+		return nil
+	}
+
+	switch {
+	case e.isDeleted:
+		if !wc.filter(oldObj) {
+			return nil
+		}
+		res = &watch.Event{
+			Type:   watch.Deleted,
+			Object: oldObj,
+		}
+	case e.isCreated:
+		if !wc.filter(curObj) {
+			return nil
+		}
+		res = &watch.Event{
+			Type:   watch.Added,
+			Object: curObj,
+		}
+	default:
+		if wc.acceptAll() {
+			res = &watch.Event{
+				Type:   watch.Modified,
+				Object: curObj,
+			}
+			return res
+		}
+		curObjPasses := wc.filter(curObj)
+		oldObjPasses := wc.filter(oldObj)
+		switch {
+		case curObjPasses && oldObjPasses:
+			res = &watch.Event{
+				Type:   watch.Modified,
+				Object: curObj,
+			}
+		case curObjPasses && !oldObjPasses:
+			res = &watch.Event{
+				Type:   watch.Added,
+				Object: curObj,
+			}
+		case !curObjPasses && oldObjPasses:
+			res = &watch.Event{
+				Type:   watch.Deleted,
+				Object: oldObj,
+			}
+		}
+	}
+	return res
+}
+
+func transformErrorToEvent(err error) *watch.Event {
+	err = interpretWatchError(err)
+	if _, ok := err.(apierrs.APIStatus); !ok {
+		err = apierrs.NewInternalError(err)
+	}
+	status := err.(apierrs.APIStatus).Status()
+	return &watch.Event{
+		Type:   watch.Error,
+		Object: &status,
+	}
+}
+
+func (wc *watchChan) sendError(err error) {
+	select {
+	case wc.errChan <- err:
+	case <-wc.ctx.Done():
+	}
+}
+
+func (wc *watchChan) sendEvent(e *event) {
+	if len(wc.incomingEventChan) == incomingBufSize {
+		glog.Warningf("Fast watcher, slow processing. Number of buffered events: %d."+
+			"Probably caused by slow decoding, user not receiving fast, or other processing logic",
+			incomingBufSize)
+	}
+	select {
+	case wc.incomingEventChan <- e:
+	case <-wc.ctx.Done():
+	}
+}
+
+func (wc *watchChan) prepareObjs(e *event) (curObj runtime.Object, oldObj runtime.Object, err error) {
+	if !e.isDeleted {
+		data, _, err := wc.watcher.transformer.TransformFromStorage(e.value, authenticatedDataString(e.key))
+		if err != nil {
+			return nil, nil, err
+		}
+		curObj, err = decodeObj(wc.watcher.codec, wc.watcher.versioner, data, e.rev)
+		if err != nil {
+			return nil, nil, err
+		}
+	}
+	// We need to decode prevValue, only if this is deletion event or
+	// the underlying filter doesn't accept all objects (otherwise we
+	// know that the filter for previous object will return true and
+	// we need the object only to compute whether it was filtered out
+	// before).
+	if len(e.prevValue) > 0 && (e.isDeleted || !wc.acceptAll()) {
+		data, _, err := wc.watcher.transformer.TransformFromStorage(e.prevValue, authenticatedDataString(e.key))
+		if err != nil {
+			return nil, nil, err
+		}
+		// Note that this sends the *old* object with the etcd revision for the time at
+		// which it gets deleted.
+		oldObj, err = decodeObj(wc.watcher.codec, wc.watcher.versioner, data, e.rev)
+		if err != nil {
+			return nil, nil, err
+		}
+	}
+	return curObj, oldObj, nil
+}
+
+func decodeObj(codec runtime.Codec, versioner storage.Versioner, data []byte, rev int64) (_ runtime.Object, err error) {
+	obj, err := runtime.Decode(codec, []byte(data))
+	if err != nil {
+		if fatalOnDecodeError {
+			// catch watch decode error iff we caused it on
+			// purpose during a unit test
+			defer testingDeferOnDecodeError()
+			// we are running in a test environment and thus an
+			// error here is due to a coder mistake if the defer
+			// does not catch it
+			panic(err)
+		}
+		return nil, err
+	}
+	// ensure resource version is set on the object we load from etcd
+	if err := versioner.UpdateObject(obj, uint64(rev)); err != nil {
+		return nil, fmt.Errorf("failure to version api object (%d) %#v: %v", rev, obj, err)
+	}
+	return obj, nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/interfaces.go b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/interfaces.go
new file mode 100644
index 0000000..227ab2b
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/interfaces.go
@@ -0,0 +1,202 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+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.
+*/
+
+package storage
+
+import (
+	"context"
+
+	"k8s.io/apimachinery/pkg/fields"
+	"k8s.io/apimachinery/pkg/labels"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/types"
+	"k8s.io/apimachinery/pkg/watch"
+)
+
+// Versioner abstracts setting and retrieving metadata fields from database response
+// onto the object ot list. It is required to maintain storage invariants - updating an
+// object twice with the same data except for the ResourceVersion and SelfLink must be
+// a no-op. A resourceVersion of type uint64 is a 'raw' resourceVersion,
+// intended to be sent directly to or from the backend. A resourceVersion of
+// type string is a 'safe' resourceVersion, intended for consumption by users.
+type Versioner interface {
+	// UpdateObject sets storage metadata into an API object. Returns an error if the object
+	// cannot be updated correctly. May return nil if the requested object does not need metadata
+	// from database.
+	UpdateObject(obj runtime.Object, resourceVersion uint64) error
+	// UpdateList sets the resource version into an API list object. Returns an error if the object
+	// cannot be updated correctly. May return nil if the requested object does not need metadata
+	// from database. continueValue is optional and indicates that more results are available if
+	// the client passes that value to the server in a subsequent call.
+	UpdateList(obj runtime.Object, resourceVersion uint64, continueValue string) error
+	// PrepareObjectForStorage should set SelfLink and ResourceVersion to the empty value. Should
+	// return an error if the specified object cannot be updated.
+	PrepareObjectForStorage(obj runtime.Object) error
+	// ObjectResourceVersion returns the resource version (for persistence) of the specified object.
+	// Should return an error if the specified object does not have a persistable version.
+	ObjectResourceVersion(obj runtime.Object) (uint64, error)
+
+	// ParseWatchResourceVersion takes a resource version argument and
+	// converts it to the storage backend we should pass to helper.Watch().
+	// Because resourceVersion is an opaque value, the default watch
+	// behavior for non-zero watch is to watch the next value (if you pass
+	// "1", you will see updates from "2" onwards).
+	ParseWatchResourceVersion(resourceVersion string) (uint64, error)
+	// ParseListResourceVersion takes a resource version argument and
+	// converts it to the storage backend version. Appropriate for
+	// everything that's not intended as an argument for watch.
+	ParseListResourceVersion(resourceVersion string) (uint64, error)
+}
+
+// ResponseMeta contains information about the database metadata that is associated with
+// an object. It abstracts the actual underlying objects to prevent coupling with concrete
+// database and to improve testability.
+type ResponseMeta struct {
+	// TTL is the time to live of the node that contained the returned object. It may be
+	// zero or negative in some cases (objects may be expired after the requested
+	// expiration time due to server lag).
+	TTL int64
+	// The resource version of the node that contained the returned object.
+	ResourceVersion uint64
+}
+
+// MatchValue defines a pair (<index name>, <value for that index>).
+type MatchValue struct {
+	IndexName string
+	Value     string
+}
+
+// TriggerPublisherFunc is a function that takes an object, and returns a list of pairs
+// (<index name>, <index value for the given object>) for all indexes known
+// to that function.
+type TriggerPublisherFunc func(obj runtime.Object) []MatchValue
+
+// Everything accepts all objects.
+var Everything = SelectionPredicate{
+	Label: labels.Everything(),
+	Field: fields.Everything(),
+	// TODO: split this into a new top level constant?
+	IncludeUninitialized: true,
+}
+
+// Pass an UpdateFunc to Interface.GuaranteedUpdate to make an update
+// that is guaranteed to succeed.
+// See the comment for GuaranteedUpdate for more details.
+type UpdateFunc func(input runtime.Object, res ResponseMeta) (output runtime.Object, ttl *uint64, err error)
+
+// Preconditions must be fulfilled before an operation (update, delete, etc.) is carried out.
+type Preconditions struct {
+	// Specifies the target UID.
+	// +optional
+	UID *types.UID `json:"uid,omitempty"`
+}
+
+// NewUIDPreconditions returns a Preconditions with UID set.
+func NewUIDPreconditions(uid string) *Preconditions {
+	u := types.UID(uid)
+	return &Preconditions{UID: &u}
+}
+
+// Interface offers a common interface for object marshaling/unmarshaling operations and
+// hides all the storage-related operations behind it.
+type Interface interface {
+	// Returns Versioner associated with this interface.
+	Versioner() Versioner
+
+	// Create adds a new object at a key unless it already exists. 'ttl' is time-to-live
+	// in seconds (0 means forever). If no error is returned and out is not nil, out will be
+	// set to the read value from database.
+	Create(ctx context.Context, key string, obj, out runtime.Object, ttl uint64) error
+
+	// Delete removes the specified key and returns the value that existed at that spot.
+	// If key didn't exist, it will return NotFound storage error.
+	Delete(ctx context.Context, key string, out runtime.Object, preconditions *Preconditions) error
+
+	// Watch begins watching the specified key. Events are decoded into API objects,
+	// and any items selected by 'p' are sent down to returned watch.Interface.
+	// resourceVersion may be used to specify what version to begin watching,
+	// which should be the current resourceVersion, and no longer rv+1
+	// (e.g. reconnecting without missing any updates).
+	// If resource version is "0", this interface will get current object at given key
+	// and send it in an "ADDED" event, before watch starts.
+	Watch(ctx context.Context, key string, resourceVersion string, p SelectionPredicate) (watch.Interface, error)
+
+	// WatchList begins watching the specified key's items. Items are decoded into API
+	// objects and any item selected by 'p' are sent down to returned watch.Interface.
+	// resourceVersion may be used to specify what version to begin watching,
+	// which should be the current resourceVersion, and no longer rv+1
+	// (e.g. reconnecting without missing any updates).
+	// If resource version is "0", this interface will list current objects directory defined by key
+	// and send them in "ADDED" events, before watch starts.
+	WatchList(ctx context.Context, key string, resourceVersion string, p SelectionPredicate) (watch.Interface, error)
+
+	// Get unmarshals json found at key into objPtr. On a not found error, will either
+	// return a zero object of the requested type, or an error, depending on ignoreNotFound.
+	// Treats empty responses and nil response nodes exactly like a not found error.
+	// The returned contents may be delayed, but it is guaranteed that they will
+	// be have at least 'resourceVersion'.
+	Get(ctx context.Context, key string, resourceVersion string, objPtr runtime.Object, ignoreNotFound bool) error
+
+	// GetToList unmarshals json found at key and opaque it into *List api object
+	// (an object that satisfies the runtime.IsList definition).
+	// The returned contents may be delayed, but it is guaranteed that they will
+	// be have at least 'resourceVersion'.
+	GetToList(ctx context.Context, key string, resourceVersion string, p SelectionPredicate, listObj runtime.Object) error
+
+	// List unmarshalls jsons found at directory defined by key and opaque them
+	// into *List api object (an object that satisfies runtime.IsList definition).
+	// The returned contents may be delayed, but it is guaranteed that they will
+	// be have at least 'resourceVersion'.
+	List(ctx context.Context, key string, resourceVersion string, p SelectionPredicate, listObj runtime.Object) error
+
+	// GuaranteedUpdate keeps calling 'tryUpdate()' to update key 'key' (of type 'ptrToType')
+	// retrying the update until success if there is index conflict.
+	// Note that object passed to tryUpdate may change across invocations of tryUpdate() if
+	// other writers are simultaneously updating it, so tryUpdate() needs to take into account
+	// the current contents of the object when deciding how the update object should look.
+	// If the key doesn't exist, it will return NotFound storage error if ignoreNotFound=false
+	// or zero value in 'ptrToType' parameter otherwise.
+	// If the object to update has the same value as previous, it won't do any update
+	// but will return the object in 'ptrToType' parameter.
+	// If 'suggestion' can contain zero or one element - in such case this can be used as
+	// a suggestion about the current version of the object to avoid read operation from
+	// storage to get it.
+	//
+	// Example:
+	//
+	// s := /* implementation of Interface */
+	// err := s.GuaranteedUpdate(
+	//     "myKey", &MyType{}, true,
+	//     func(input runtime.Object, res ResponseMeta) (runtime.Object, *uint64, error) {
+	//       // Before each incovation of the user defined function, "input" is reset to
+	//       // current contents for "myKey" in database.
+	//       curr := input.(*MyType)  // Guaranteed to succeed.
+	//
+	//       // Make the modification
+	//       curr.Counter++
+	//
+	//       // Return the modified object - return an error to stop iterating. Return
+	//       // a uint64 to alter the TTL on the object, or nil to keep it the same value.
+	//       return cur, nil, nil
+	//    }
+	// })
+	GuaranteedUpdate(
+		ctx context.Context, key string, ptrToType runtime.Object, ignoreNotFound bool,
+		precondtions *Preconditions, tryUpdate UpdateFunc, suggestion ...runtime.Object) error
+
+	// Count returns number of different entries under the key (generally being path prefix).
+	Count(key string) (int64, error)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/names/generate.go b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/names/generate.go
new file mode 100644
index 0000000..aad9a07
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/names/generate.go
@@ -0,0 +1,54 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package names
+
+import (
+	"fmt"
+
+	utilrand "k8s.io/apimachinery/pkg/util/rand"
+)
+
+// NameGenerator generates names for objects. Some backends may have more information
+// available to guide selection of new names and this interface hides those details.
+type NameGenerator interface {
+	// GenerateName generates a valid name from the base name, adding a random suffix to the
+	// the base. If base is valid, the returned name must also be valid. The generator is
+	// responsible for knowing the maximum valid name length.
+	GenerateName(base string) string
+}
+
+// simpleNameGenerator generates random names.
+type simpleNameGenerator struct{}
+
+// SimpleNameGenerator is a generator that returns the name plus a random suffix of five alphanumerics
+// when a name is requested. The string is guaranteed to not exceed the length of a standard Kubernetes
+// name (63 characters)
+var SimpleNameGenerator NameGenerator = simpleNameGenerator{}
+
+const (
+	// TODO: make this flexible for non-core resources with alternate naming rules.
+	maxNameLength          = 63
+	randomLength           = 5
+	maxGeneratedNameLength = maxNameLength - randomLength
+)
+
+func (simpleNameGenerator) GenerateName(base string) string {
+	if len(base) > maxGeneratedNameLength {
+		base = base[:maxGeneratedNameLength]
+	}
+	return fmt.Sprintf("%s%s", base, utilrand.String(randomLength))
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/selection_predicate.go b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/selection_predicate.go
new file mode 100644
index 0000000..9c8c3d5
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/selection_predicate.go
@@ -0,0 +1,150 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package storage
+
+import (
+	"k8s.io/apimachinery/pkg/api/meta"
+	"k8s.io/apimachinery/pkg/fields"
+	"k8s.io/apimachinery/pkg/labels"
+	"k8s.io/apimachinery/pkg/runtime"
+)
+
+// AttrFunc returns label and field sets and the uninitialized flag for List or Watch to match.
+// In any failure to parse given object, it returns error.
+type AttrFunc func(obj runtime.Object) (labels.Set, fields.Set, bool, error)
+
+// FieldMutationFunc allows the mutation of the field selection fields.  It is mutating to
+// avoid the extra allocation on this common path
+type FieldMutationFunc func(obj runtime.Object, fieldSet fields.Set) error
+
+func DefaultClusterScopedAttr(obj runtime.Object) (labels.Set, fields.Set, bool, error) {
+	metadata, err := meta.Accessor(obj)
+	if err != nil {
+		return nil, nil, false, err
+	}
+	fieldSet := fields.Set{
+		"metadata.name": metadata.GetName(),
+	}
+
+	return labels.Set(metadata.GetLabels()), fieldSet, metadata.GetInitializers() != nil, nil
+}
+
+func DefaultNamespaceScopedAttr(obj runtime.Object) (labels.Set, fields.Set, bool, error) {
+	metadata, err := meta.Accessor(obj)
+	if err != nil {
+		return nil, nil, false, err
+	}
+	fieldSet := fields.Set{
+		"metadata.name":      metadata.GetName(),
+		"metadata.namespace": metadata.GetNamespace(),
+	}
+
+	return labels.Set(metadata.GetLabels()), fieldSet, metadata.GetInitializers() != nil, nil
+}
+
+func (f AttrFunc) WithFieldMutation(fieldMutator FieldMutationFunc) AttrFunc {
+	return func(obj runtime.Object) (labels.Set, fields.Set, bool, error) {
+		labelSet, fieldSet, initialized, err := f(obj)
+		if err != nil {
+			return nil, nil, false, err
+		}
+		if err := fieldMutator(obj, fieldSet); err != nil {
+			return nil, nil, false, err
+		}
+		return labelSet, fieldSet, initialized, nil
+	}
+}
+
+// SelectionPredicate is used to represent the way to select objects from api storage.
+type SelectionPredicate struct {
+	Label                labels.Selector
+	Field                fields.Selector
+	IncludeUninitialized bool
+	GetAttrs             AttrFunc
+	IndexFields          []string
+	Limit                int64
+	Continue             string
+}
+
+// Matches returns true if the given object's labels and fields (as
+// returned by s.GetAttrs) match s.Label and s.Field. An error is
+// returned if s.GetAttrs fails.
+func (s *SelectionPredicate) Matches(obj runtime.Object) (bool, error) {
+	if s.Empty() {
+		return true, nil
+	}
+	labels, fields, uninitialized, err := s.GetAttrs(obj)
+	if err != nil {
+		return false, err
+	}
+	if !s.IncludeUninitialized && uninitialized {
+		return false, nil
+	}
+	matched := s.Label.Matches(labels)
+	if matched && s.Field != nil {
+		matched = matched && s.Field.Matches(fields)
+	}
+	return matched, nil
+}
+
+// MatchesObjectAttributes returns true if the given labels and fields
+// match s.Label and s.Field.
+func (s *SelectionPredicate) MatchesObjectAttributes(l labels.Set, f fields.Set, uninitialized bool) bool {
+	if !s.IncludeUninitialized && uninitialized {
+		return false
+	}
+	if s.Label.Empty() && s.Field.Empty() {
+		return true
+	}
+	matched := s.Label.Matches(l)
+	if matched && s.Field != nil {
+		matched = (matched && s.Field.Matches(f))
+	}
+	return matched
+}
+
+// MatchesSingle will return (name, true) if and only if s.Field matches on the object's
+// name.
+func (s *SelectionPredicate) MatchesSingle() (string, bool) {
+	if len(s.Continue) > 0 {
+		return "", false
+	}
+	// TODO: should be namespace.name
+	if name, ok := s.Field.RequiresExactMatch("metadata.name"); ok {
+		return name, true
+	}
+	return "", false
+}
+
+// For any index defined by IndexFields, if a matcher can match only (a subset)
+// of objects that return <value> for a given index, a pair (<index name>, <value>)
+// wil be returned.
+// TODO: Consider supporting also labels.
+func (s *SelectionPredicate) MatcherIndex() []MatchValue {
+	var result []MatchValue
+	for _, field := range s.IndexFields {
+		if value, ok := s.Field.RequiresExactMatch(field); ok {
+			result = append(result, MatchValue{IndexName: field, Value: value})
+		}
+	}
+	return result
+}
+
+// Empty returns true if the predicate performs no filtering.
+func (s *SelectionPredicate) Empty() bool {
+	return s.Label.Empty() && s.Field.Empty() && s.IncludeUninitialized
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/storagebackend/OWNERS b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/storagebackend/OWNERS
new file mode 100755
index 0000000..d14ed51
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/storagebackend/OWNERS
@@ -0,0 +1,6 @@
+reviewers:
+- lavalamp
+- smarterclayton
+- wojtek-t
+- timothysc
+- hongchaodeng
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/storagebackend/config.go b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/storagebackend/config.go
new file mode 100644
index 0000000..8d7ecf3
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/storagebackend/config.go
@@ -0,0 +1,80 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package storagebackend
+
+import (
+	"time"
+
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apiserver/pkg/storage/value"
+)
+
+const (
+	StorageTypeUnset = ""
+	StorageTypeETCD2 = "etcd2"
+	StorageTypeETCD3 = "etcd3"
+
+	DefaultCompactInterval = 5 * time.Minute
+)
+
+// Config is configuration for creating a storage backend.
+type Config struct {
+	// Type defines the type of storage backend, e.g. "etcd2", etcd3". Default ("") is "etcd3".
+	Type string
+	// Prefix is the prefix to all keys passed to storage.Interface methods.
+	Prefix string
+	// ServerList is the list of storage servers to connect with.
+	ServerList []string
+	// TLS credentials
+	KeyFile  string
+	CertFile string
+	CAFile   string
+	// Quorum indicates that whether read operations should be quorum-level consistent.
+	Quorum bool
+	// Paging indicates whether the server implementation should allow paging (if it is
+	// supported). This is generally configured by feature gating, or by a specific
+	// resource type not wishing to allow paging, and is not intended for end users to
+	// set.
+	Paging bool
+	// DeserializationCacheSize is the size of cache of deserialized objects.
+	// Currently this is only supported in etcd2.
+	// We will drop the cache once using protobuf.
+	DeserializationCacheSize int
+
+	Codec runtime.Codec
+	// Transformer allows the value to be transformed prior to persisting into etcd.
+	Transformer value.Transformer
+
+	// CompactionInterval is an interval of requesting compaction from apiserver.
+	// If the value is 0, no compaction will be issued.
+	CompactionInterval time.Duration
+
+	// CountMetricPollPeriod specifies how often should count metric be updated
+	CountMetricPollPeriod time.Duration
+}
+
+func NewDefaultConfig(prefix string, codec runtime.Codec) *Config {
+	return &Config{
+		Prefix: prefix,
+		// Default cache size to 0 - if unset, its size will be set based on target
+		// memory usage.
+		DeserializationCacheSize: 0,
+		Codec:              codec,
+		CompactionInterval: DefaultCompactInterval,
+		Quorum:             true,
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/storagebackend/factory/etcd2.go b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/storagebackend/factory/etcd2.go
new file mode 100644
index 0000000..41542cc
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/storagebackend/factory/etcd2.go
@@ -0,0 +1,81 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package factory
+
+import (
+	"net"
+	"net/http"
+	"time"
+
+	etcd2client "github.com/coreos/etcd/client"
+	"github.com/coreos/etcd/pkg/transport"
+
+	utilnet "k8s.io/apimachinery/pkg/util/net"
+	"k8s.io/apiserver/pkg/storage"
+	"k8s.io/apiserver/pkg/storage/etcd"
+	"k8s.io/apiserver/pkg/storage/storagebackend"
+)
+
+func newETCD2Storage(c storagebackend.Config) (storage.Interface, DestroyFunc, error) {
+	tr, err := newTransportForETCD2(c.CertFile, c.KeyFile, c.CAFile)
+	if err != nil {
+		return nil, nil, err
+	}
+	client, err := newETCD2Client(tr, c.ServerList)
+	if err != nil {
+		return nil, nil, err
+	}
+	s := etcd.NewEtcdStorage(client, c.Codec, c.Prefix, c.Quorum, c.DeserializationCacheSize, etcd.IdentityTransformer)
+	return s, tr.CloseIdleConnections, nil
+}
+
+func newETCD2Client(tr *http.Transport, serverList []string) (etcd2client.Client, error) {
+	cli, err := etcd2client.New(etcd2client.Config{
+		Endpoints: serverList,
+		Transport: tr,
+	})
+	if err != nil {
+		return nil, err
+	}
+
+	return cli, nil
+}
+
+func newTransportForETCD2(certFile, keyFile, caFile string) (*http.Transport, error) {
+	info := transport.TLSInfo{
+		CertFile: certFile,
+		KeyFile:  keyFile,
+		CAFile:   caFile,
+	}
+	cfg, err := info.ClientConfig()
+	if err != nil {
+		return nil, err
+	}
+	// Copied from etcd.DefaultTransport declaration.
+	// TODO: Determine if transport needs optimization
+	tr := utilnet.SetTransportDefaults(&http.Transport{
+		Proxy: http.ProxyFromEnvironment,
+		DialContext: (&net.Dialer{
+			Timeout:   30 * time.Second,
+			KeepAlive: 30 * time.Second,
+		}).DialContext,
+		TLSHandshakeTimeout: 10 * time.Second,
+		MaxIdleConnsPerHost: 500,
+		TLSClientConfig:     cfg,
+	})
+	return tr, nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/storagebackend/factory/etcd3.go b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/storagebackend/factory/etcd3.go
new file mode 100644
index 0000000..06b935a
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/storagebackend/factory/etcd3.go
@@ -0,0 +1,82 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package factory
+
+import (
+	"context"
+	"time"
+
+	"github.com/coreos/etcd/clientv3"
+	"github.com/coreos/etcd/pkg/transport"
+
+	"k8s.io/apiserver/pkg/storage"
+	"k8s.io/apiserver/pkg/storage/etcd3"
+	"k8s.io/apiserver/pkg/storage/storagebackend"
+	"k8s.io/apiserver/pkg/storage/value"
+)
+
+// The short keepalive timeout and interval have been chosen to aggressively
+// detect a failed etcd server without introducing much overhead.
+const keepaliveTime = 30 * time.Second
+const keepaliveTimeout = 10 * time.Second
+
+// dialTimeout is the timeout for failing to establish a connection.
+// It is set to 20 seconds as times shorter than that will cause TLS connections to fail
+// on heavily loaded arm64 CPUs (issue #64649)
+const dialTimeout = 20 * time.Second
+
+func newETCD3Storage(c storagebackend.Config) (storage.Interface, DestroyFunc, error) {
+	tlsInfo := transport.TLSInfo{
+		CertFile: c.CertFile,
+		KeyFile:  c.KeyFile,
+		CAFile:   c.CAFile,
+	}
+	tlsConfig, err := tlsInfo.ClientConfig()
+	if err != nil {
+		return nil, nil, err
+	}
+	// NOTE: Client relies on nil tlsConfig
+	// for non-secure connections, update the implicit variable
+	if len(c.CertFile) == 0 && len(c.KeyFile) == 0 && len(c.CAFile) == 0 {
+		tlsConfig = nil
+	}
+	cfg := clientv3.Config{
+		DialTimeout:          dialTimeout,
+		DialKeepAliveTime:    keepaliveTime,
+		DialKeepAliveTimeout: keepaliveTimeout,
+		Endpoints:            c.ServerList,
+		TLS:                  tlsConfig,
+	}
+	client, err := clientv3.New(cfg)
+	if err != nil {
+		return nil, nil, err
+	}
+	ctx, cancel := context.WithCancel(context.Background())
+	etcd3.StartCompactor(ctx, client, c.CompactionInterval)
+	destroyFunc := func() {
+		cancel()
+		client.Close()
+	}
+	transformer := c.Transformer
+	if transformer == nil {
+		transformer = value.IdentityTransformer
+	}
+	if c.Quorum {
+		return etcd3.New(client, c.Codec, c.Prefix, transformer, c.Paging), destroyFunc, nil
+	}
+	return etcd3.NewWithNoQuorumRead(client, c.Codec, c.Prefix, transformer, c.Paging), destroyFunc, nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/storagebackend/factory/factory.go b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/storagebackend/factory/factory.go
new file mode 100644
index 0000000..101207b
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/storagebackend/factory/factory.go
@@ -0,0 +1,43 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package factory
+
+import (
+	"fmt"
+
+	"k8s.io/apiserver/pkg/storage"
+	"k8s.io/apiserver/pkg/storage/storagebackend"
+)
+
+// DestroyFunc is to destroy any resources used by the storage returned in Create() together.
+type DestroyFunc func()
+
+// Create creates a storage backend based on given config.
+func Create(c storagebackend.Config) (storage.Interface, DestroyFunc, error) {
+	switch c.Type {
+	case storagebackend.StorageTypeETCD2:
+		return newETCD2Storage(c)
+	case storagebackend.StorageTypeUnset, storagebackend.StorageTypeETCD3:
+		// TODO: We have the following features to implement:
+		// - Support secure connection by using key, cert, and CA files.
+		// - Honor "https" scheme to support secure connection in gRPC.
+		// - Support non-quorum read.
+		return newETCD3Storage(c)
+	default:
+		return nil, nil, fmt.Errorf("unknown storage type: %s", c.Type)
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/time_budget.go b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/time_budget.go
new file mode 100644
index 0000000..e619ec6
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/time_budget.go
@@ -0,0 +1,95 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package storage
+
+import (
+	"sync"
+	"time"
+)
+
+const (
+	refreshPerSecond = 50 * time.Millisecond
+	maxBudget        = 100 * time.Millisecond
+)
+
+// timeBudget implements a budget of time that you can use and is
+// periodically being refreshed. The pattern to use it is:
+//   budget := newTimeBudget(...)
+//   ...
+//   timeout := budget.takeAvailable()
+//   // Now you can spend at most timeout on doing stuff
+//   ...
+//   // If you didn't use all timeout, return what you didn't use
+//   budget.returnUnused(<unused part of timeout>)
+//
+// NOTE: It's not recommended to be used concurrently from multiple threads -
+// if first user takes the whole timeout, the second one will get 0 timeout
+// even though the first one may return something later.
+type timeBudget struct {
+	sync.Mutex
+	budget time.Duration
+
+	refresh   time.Duration
+	maxBudget time.Duration
+}
+
+func newTimeBudget(stopCh <-chan struct{}) *timeBudget {
+	result := &timeBudget{
+		budget:    time.Duration(0),
+		refresh:   refreshPerSecond,
+		maxBudget: maxBudget,
+	}
+	go result.periodicallyRefresh(stopCh)
+	return result
+}
+
+func (t *timeBudget) periodicallyRefresh(stopCh <-chan struct{}) {
+	ticker := time.NewTicker(time.Second)
+	defer ticker.Stop()
+	for {
+		select {
+		case <-ticker.C:
+			t.Lock()
+			if t.budget = t.budget + t.refresh; t.budget > t.maxBudget {
+				t.budget = t.maxBudget
+			}
+			t.Unlock()
+		case <-stopCh:
+			return
+		}
+	}
+}
+
+func (t *timeBudget) takeAvailable() time.Duration {
+	t.Lock()
+	defer t.Unlock()
+	result := t.budget
+	t.budget = time.Duration(0)
+	return result
+}
+
+func (t *timeBudget) returnUnused(unused time.Duration) {
+	t.Lock()
+	defer t.Unlock()
+	if unused < 0 {
+		// We used more than allowed.
+		return
+	}
+	if t.budget = t.budget + unused; t.budget > t.maxBudget {
+		t.budget = t.maxBudget
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/util.go b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/util.go
new file mode 100644
index 0000000..9d437d0
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/util.go
@@ -0,0 +1,115 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+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.
+*/
+
+package storage
+
+import (
+	"fmt"
+	"strings"
+	"sync/atomic"
+
+	"k8s.io/apimachinery/pkg/api/meta"
+	"k8s.io/apimachinery/pkg/api/validation/path"
+	"k8s.io/apimachinery/pkg/runtime"
+)
+
+type SimpleUpdateFunc func(runtime.Object) (runtime.Object, error)
+
+// SimpleUpdateFunc converts SimpleUpdateFunc into UpdateFunc
+func SimpleUpdate(fn SimpleUpdateFunc) UpdateFunc {
+	return func(input runtime.Object, _ ResponseMeta) (runtime.Object, *uint64, error) {
+		out, err := fn(input)
+		return out, nil, err
+	}
+}
+
+func EverythingFunc(runtime.Object) bool {
+	return true
+}
+
+func NoTriggerFunc() []MatchValue {
+	return nil
+}
+
+func NoTriggerPublisher(runtime.Object) []MatchValue {
+	return nil
+}
+
+func NamespaceKeyFunc(prefix string, obj runtime.Object) (string, error) {
+	meta, err := meta.Accessor(obj)
+	if err != nil {
+		return "", err
+	}
+	name := meta.GetName()
+	if msgs := path.IsValidPathSegmentName(name); len(msgs) != 0 {
+		return "", fmt.Errorf("invalid name: %v", msgs)
+	}
+	return prefix + "/" + meta.GetNamespace() + "/" + name, nil
+}
+
+func NoNamespaceKeyFunc(prefix string, obj runtime.Object) (string, error) {
+	meta, err := meta.Accessor(obj)
+	if err != nil {
+		return "", err
+	}
+	name := meta.GetName()
+	if msgs := path.IsValidPathSegmentName(name); len(msgs) != 0 {
+		return "", fmt.Errorf("invalid name: %v", msgs)
+	}
+	return prefix + "/" + name, nil
+}
+
+// hasPathPrefix returns true if the string matches pathPrefix exactly, or if is prefixed with pathPrefix at a path segment boundary
+func hasPathPrefix(s, pathPrefix string) bool {
+	// Short circuit if s doesn't contain the prefix at all
+	if !strings.HasPrefix(s, pathPrefix) {
+		return false
+	}
+
+	pathPrefixLength := len(pathPrefix)
+
+	if len(s) == pathPrefixLength {
+		// Exact match
+		return true
+	}
+	if strings.HasSuffix(pathPrefix, "/") {
+		// pathPrefix already ensured a path segment boundary
+		return true
+	}
+	if s[pathPrefixLength:pathPrefixLength+1] == "/" {
+		// The next character in s is a path segment boundary
+		// Check this instead of normalizing pathPrefix to avoid allocating on every call
+		return true
+	}
+	return false
+}
+
+// HighWaterMark is a thread-safe object for tracking the maximum value seen
+// for some quantity.
+type HighWaterMark int64
+
+// Update returns true if and only if 'current' is the highest value ever seen.
+func (hwm *HighWaterMark) Update(current int64) bool {
+	for {
+		old := atomic.LoadInt64((*int64)(hwm))
+		if current <= old {
+			return false
+		}
+		if atomic.CompareAndSwapInt64((*int64)(hwm), old, current) {
+			return true
+		}
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/value/metrics.go b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/value/metrics.go
new file mode 100644
index 0000000..1fe3167
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/value/metrics.go
@@ -0,0 +1,124 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package value
+
+import (
+	"sync"
+	"time"
+
+	"github.com/prometheus/client_golang/prometheus"
+)
+
+const (
+	namespace = "apiserver"
+	subsystem = "storage"
+)
+
+var (
+	transformerLatencies = prometheus.NewHistogramVec(
+		prometheus.HistogramOpts{
+			Namespace: namespace,
+			Subsystem: subsystem,
+			Name:      "transformation_latencies_microseconds",
+			Help:      "Latencies in microseconds of value transformation operations.",
+			// In-process transformations (ex. AES CBC) complete on the order of 20 microseconds. However, when
+			// external KMS is involved latencies may climb into milliseconds.
+			Buckets: prometheus.ExponentialBuckets(5, 2, 14),
+		},
+		[]string{"transformation_type"},
+	)
+	transformerFailuresTotal = prometheus.NewCounterVec(
+		prometheus.CounterOpts{
+			Namespace: namespace,
+			Subsystem: subsystem,
+			Name:      "transformation_failures_total",
+			Help:      "Total number of failed transformation operations.",
+		},
+		[]string{"transformation_type"},
+	)
+
+	envelopeTransformationCacheMissTotal = prometheus.NewCounter(
+		prometheus.CounterOpts{
+			Namespace: namespace,
+			Subsystem: subsystem,
+			Name:      "envelope_transformation_cache_misses_total",
+			Help:      "Total number of cache misses while accessing key decryption key(KEK).",
+		},
+	)
+
+	dataKeyGenerationLatencies = prometheus.NewHistogram(
+		prometheus.HistogramOpts{
+			Namespace: namespace,
+			Subsystem: subsystem,
+			Name:      "data_key_generation_latencies_microseconds",
+			Help:      "Latencies in microseconds of data encryption key(DEK) generation operations.",
+			Buckets:   prometheus.ExponentialBuckets(5, 2, 14),
+		},
+	)
+	dataKeyGenerationFailuresTotal = prometheus.NewCounter(
+		prometheus.CounterOpts{
+			Namespace: namespace,
+			Subsystem: subsystem,
+			Name:      "data_key_generation_failures_total",
+			Help:      "Total number of failed data encryption key(DEK) generation operations.",
+		},
+	)
+)
+
+var registerMetrics sync.Once
+
+func RegisterMetrics() {
+	registerMetrics.Do(func() {
+		prometheus.MustRegister(transformerLatencies)
+		prometheus.MustRegister(transformerFailuresTotal)
+		prometheus.MustRegister(envelopeTransformationCacheMissTotal)
+		prometheus.MustRegister(dataKeyGenerationLatencies)
+		prometheus.MustRegister(dataKeyGenerationFailuresTotal)
+	})
+}
+
+// RecordTransformation records latencies and count of TransformFromStorage and TransformToStorage operations.
+func RecordTransformation(transformationType string, start time.Time, err error) {
+	if err != nil {
+		transformerFailuresTotal.WithLabelValues(transformationType).Inc()
+		return
+	}
+
+	since := sinceInMicroseconds(start)
+	transformerLatencies.WithLabelValues(transformationType).Observe(float64(since))
+}
+
+// RecordCacheMiss records a miss on Key Encryption Key(KEK) - call to KMS was required to decrypt KEK.
+func RecordCacheMiss() {
+	envelopeTransformationCacheMissTotal.Inc()
+}
+
+// RecordDataKeyGeneration records latencies and count of Data Encryption Key generation operations.
+func RecordDataKeyGeneration(start time.Time, err error) {
+	if err != nil {
+		dataKeyGenerationFailuresTotal.Inc()
+		return
+	}
+
+	since := sinceInMicroseconds(start)
+	dataKeyGenerationLatencies.Observe(float64(since))
+}
+
+func sinceInMicroseconds(start time.Time) int64 {
+	elapsedNanoseconds := time.Since(start).Nanoseconds()
+	return elapsedNanoseconds / int64(time.Microsecond)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/value/transformer.go b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/value/transformer.go
new file mode 100644
index 0000000..bad6ed5
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/value/transformer.go
@@ -0,0 +1,164 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+// Package value contains methods for assisting with transformation of values in storage.
+package value
+
+import (
+	"bytes"
+	"fmt"
+	"sync"
+	"time"
+)
+
+func init() {
+	RegisterMetrics()
+}
+
+// Context is additional information that a storage transformation may need to verify the data at rest.
+type Context interface {
+	// AuthenticatedData should return an array of bytes that describes the current value. If the value changes,
+	// the transformer may report the value as unreadable or tampered. This may be nil if no such description exists
+	// or is needed. For additional verification, set this to data that strongly identifies the value, such as
+	// the key and creation version of the stored data.
+	AuthenticatedData() []byte
+}
+
+// Transformer allows a value to be transformed before being read from or written to the underlying store. The methods
+// must be able to undo the transformation caused by the other.
+type Transformer interface {
+	// TransformFromStorage may transform the provided data from its underlying storage representation or return an error.
+	// Stale is true if the object on disk is stale and a write to etcd should be issued, even if the contents of the object
+	// have not changed.
+	TransformFromStorage(data []byte, context Context) (out []byte, stale bool, err error)
+	// TransformToStorage may transform the provided data into the appropriate form in storage or return an error.
+	TransformToStorage(data []byte, context Context) (out []byte, err error)
+}
+
+type identityTransformer struct{}
+
+// IdentityTransformer performs no transformation of the provided data.
+var IdentityTransformer Transformer = identityTransformer{}
+
+func (identityTransformer) TransformFromStorage(b []byte, ctx Context) ([]byte, bool, error) {
+	return b, false, nil
+}
+func (identityTransformer) TransformToStorage(b []byte, ctx Context) ([]byte, error) {
+	return b, nil
+}
+
+// DefaultContext is a simple implementation of Context for a slice of bytes.
+type DefaultContext []byte
+
+// AuthenticatedData returns itself.
+func (c DefaultContext) AuthenticatedData() []byte { return []byte(c) }
+
+// MutableTransformer allows a transformer to be changed safely at runtime.
+type MutableTransformer struct {
+	lock        sync.RWMutex
+	transformer Transformer
+}
+
+// NewMutableTransformer creates a transformer that can be updated at any time by calling Set()
+func NewMutableTransformer(transformer Transformer) *MutableTransformer {
+	return &MutableTransformer{transformer: transformer}
+}
+
+// Set updates the nested transformer.
+func (t *MutableTransformer) Set(transformer Transformer) {
+	t.lock.Lock()
+	t.transformer = transformer
+	t.lock.Unlock()
+}
+
+func (t *MutableTransformer) TransformFromStorage(data []byte, context Context) (out []byte, stale bool, err error) {
+	defer func(start time.Time) {
+		RecordTransformation("from_storage", start, err)
+	}(time.Now())
+	t.lock.RLock()
+	transformer := t.transformer
+	t.lock.RUnlock()
+	return transformer.TransformFromStorage(data, context)
+}
+func (t *MutableTransformer) TransformToStorage(data []byte, context Context) (out []byte, err error) {
+	defer func(start time.Time) {
+		RecordTransformation("to_storage", start, err)
+	}(time.Now())
+	t.lock.RLock()
+	transformer := t.transformer
+	t.lock.RUnlock()
+	return transformer.TransformToStorage(data, context)
+}
+
+// PrefixTransformer holds a transformer interface and the prefix that the transformation is located under.
+type PrefixTransformer struct {
+	Prefix      []byte
+	Transformer Transformer
+}
+
+type prefixTransformers struct {
+	transformers []PrefixTransformer
+	err          error
+}
+
+var _ Transformer = &prefixTransformers{}
+
+// NewPrefixTransformers supports the Transformer interface by checking the incoming data against the provided
+// prefixes in order. The first matching prefix will be used to transform the value (the prefix is stripped
+// before the Transformer interface is invoked). The first provided transformer will be used when writing to
+// the store.
+func NewPrefixTransformers(err error, transformers ...PrefixTransformer) Transformer {
+	if err == nil {
+		err = fmt.Errorf("the provided value does not match any of the supported transformers")
+	}
+	return &prefixTransformers{
+		transformers: transformers,
+		err:          err,
+	}
+}
+
+// TransformFromStorage finds the first transformer with a prefix matching the provided data and returns
+// the result of transforming the value. It will always mark any transformation as stale that is not using
+// the first transformer.
+func (t *prefixTransformers) TransformFromStorage(data []byte, context Context) ([]byte, bool, error) {
+	for i, transformer := range t.transformers {
+		if bytes.HasPrefix(data, transformer.Prefix) {
+			result, stale, err := transformer.Transformer.TransformFromStorage(data[len(transformer.Prefix):], context)
+			// To migrate away from encryption, user can specify an identity transformer higher up
+			// (in the config file) than the encryption transformer. In that scenario, the identity transformer needs to
+			// identify (during reads from disk) whether the data being read is encrypted or not. If the data is encrypted,
+			// it shall throw an error, but that error should not prevent subsequent transformers from being tried.
+			if len(transformer.Prefix) == 0 && err != nil {
+				continue
+			}
+			return result, stale || i != 0, err
+		}
+	}
+	return nil, false, t.err
+}
+
+// TransformToStorage uses the first transformer and adds its prefix to the data.
+func (t *prefixTransformers) TransformToStorage(data []byte, context Context) ([]byte, error) {
+	transformer := t.transformers[0]
+	prefixedData := make([]byte, len(transformer.Prefix), len(data)+len(transformer.Prefix))
+	copy(prefixedData, transformer.Prefix)
+	result, err := transformer.Transformer.TransformToStorage(data, context)
+	if err != nil {
+		return nil, err
+	}
+	prefixedData = append(prefixedData, result...)
+	return prefixedData, nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/storage/watch_cache.go b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/watch_cache.go
new file mode 100644
index 0000000..373e74e
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/storage/watch_cache.go
@@ -0,0 +1,484 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+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.
+*/
+
+package storage
+
+import (
+	"fmt"
+	"sort"
+	"strconv"
+	"sync"
+	"time"
+
+	"k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/api/meta"
+	"k8s.io/apimachinery/pkg/fields"
+	"k8s.io/apimachinery/pkg/labels"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/util/clock"
+	"k8s.io/apimachinery/pkg/watch"
+	utiltrace "k8s.io/apiserver/pkg/util/trace"
+	"k8s.io/client-go/tools/cache"
+)
+
+const (
+	// blockTimeout determines how long we're willing to block the request
+	// to wait for a given resource version to be propagated to cache,
+	// before terminating request and returning Timeout error with retry
+	// after suggestion.
+	blockTimeout = 3 * time.Second
+)
+
+// watchCacheEvent is a single "watch event" that is send to users of
+// watchCache. Additionally to a typical "watch.Event" it contains
+// the previous value of the object to enable proper filtering in the
+// upper layers.
+type watchCacheEvent struct {
+	Type                 watch.EventType
+	Object               runtime.Object
+	ObjLabels            labels.Set
+	ObjFields            fields.Set
+	ObjUninitialized     bool
+	PrevObject           runtime.Object
+	PrevObjLabels        labels.Set
+	PrevObjFields        fields.Set
+	PrevObjUninitialized bool
+	Key                  string
+	ResourceVersion      uint64
+}
+
+// Computing a key of an object is generally non-trivial (it performs
+// e.g. validation underneath). Similarly computing object fields and
+// labels. To avoid computing them multiple times (to serve the event
+// in different List/Watch requests), in the underlying store we are
+// keeping structs (key, object, labels, fields, uninitialized).
+type storeElement struct {
+	Key           string
+	Object        runtime.Object
+	Labels        labels.Set
+	Fields        fields.Set
+	Uninitialized bool
+}
+
+func storeElementKey(obj interface{}) (string, error) {
+	elem, ok := obj.(*storeElement)
+	if !ok {
+		return "", fmt.Errorf("not a storeElement: %v", obj)
+	}
+	return elem.Key, nil
+}
+
+// watchCacheElement is a single "watch event" stored in a cache.
+// It contains the resource version of the object and the object
+// itself.
+type watchCacheElement struct {
+	resourceVersion uint64
+	watchCacheEvent *watchCacheEvent
+}
+
+// watchCache implements a Store interface.
+// However, it depends on the elements implementing runtime.Object interface.
+//
+// watchCache is a "sliding window" (with a limited capacity) of objects
+// observed from a watch.
+type watchCache struct {
+	sync.RWMutex
+
+	// Condition on which lists are waiting for the fresh enough
+	// resource version.
+	cond *sync.Cond
+
+	// Maximum size of history window.
+	capacity int
+
+	// keyFunc is used to get a key in the underlying storage for a given object.
+	keyFunc func(runtime.Object) (string, error)
+
+	// getAttrsFunc is used to get labels and fields of an object.
+	getAttrsFunc func(runtime.Object) (labels.Set, fields.Set, bool, error)
+
+	// cache is used a cyclic buffer - its first element (with the smallest
+	// resourceVersion) is defined by startIndex, its last element is defined
+	// by endIndex (if cache is full it will be startIndex + capacity).
+	// Both startIndex and endIndex can be greater than buffer capacity -
+	// you should always apply modulo capacity to get an index in cache array.
+	cache      []watchCacheElement
+	startIndex int
+	endIndex   int
+
+	// store will effectively support LIST operation from the "end of cache
+	// history" i.e. from the moment just after the newest cached watched event.
+	// It is necessary to effectively allow clients to start watching at now.
+	// NOTE: We assume that <store> is thread-safe.
+	store cache.Store
+
+	// ResourceVersion up to which the watchCache is propagated.
+	resourceVersion uint64
+
+	// This handler is run at the end of every successful Replace() method.
+	onReplace func()
+
+	// This handler is run at the end of every Add/Update/Delete method
+	// and additionally gets the previous value of the object.
+	onEvent func(*watchCacheEvent)
+
+	// for testing timeouts.
+	clock clock.Clock
+}
+
+func newWatchCache(
+	capacity int,
+	keyFunc func(runtime.Object) (string, error),
+	getAttrsFunc func(runtime.Object) (labels.Set, fields.Set, bool, error)) *watchCache {
+	wc := &watchCache{
+		capacity:        capacity,
+		keyFunc:         keyFunc,
+		getAttrsFunc:    getAttrsFunc,
+		cache:           make([]watchCacheElement, capacity),
+		startIndex:      0,
+		endIndex:        0,
+		store:           cache.NewStore(storeElementKey),
+		resourceVersion: 0,
+		clock:           clock.RealClock{},
+	}
+	wc.cond = sync.NewCond(wc.RLocker())
+	return wc
+}
+
+// Add takes runtime.Object as an argument.
+func (w *watchCache) Add(obj interface{}) error {
+	object, resourceVersion, err := objectToVersionedRuntimeObject(obj)
+	if err != nil {
+		return err
+	}
+	event := watch.Event{Type: watch.Added, Object: object}
+
+	f := func(elem *storeElement) error { return w.store.Add(elem) }
+	return w.processEvent(event, resourceVersion, f)
+}
+
+// Update takes runtime.Object as an argument.
+func (w *watchCache) Update(obj interface{}) error {
+	object, resourceVersion, err := objectToVersionedRuntimeObject(obj)
+	if err != nil {
+		return err
+	}
+	event := watch.Event{Type: watch.Modified, Object: object}
+
+	f := func(elem *storeElement) error { return w.store.Update(elem) }
+	return w.processEvent(event, resourceVersion, f)
+}
+
+// Delete takes runtime.Object as an argument.
+func (w *watchCache) Delete(obj interface{}) error {
+	object, resourceVersion, err := objectToVersionedRuntimeObject(obj)
+	if err != nil {
+		return err
+	}
+	event := watch.Event{Type: watch.Deleted, Object: object}
+
+	f := func(elem *storeElement) error { return w.store.Delete(elem) }
+	return w.processEvent(event, resourceVersion, f)
+}
+
+func objectToVersionedRuntimeObject(obj interface{}) (runtime.Object, uint64, error) {
+	object, ok := obj.(runtime.Object)
+	if !ok {
+		return nil, 0, fmt.Errorf("obj does not implement runtime.Object interface: %v", obj)
+	}
+	meta, err := meta.Accessor(object)
+	if err != nil {
+		return nil, 0, err
+	}
+	resourceVersion, err := parseResourceVersion(meta.GetResourceVersion())
+	if err != nil {
+		return nil, 0, err
+	}
+	return object, resourceVersion, nil
+}
+
+func parseResourceVersion(resourceVersion string) (uint64, error) {
+	if resourceVersion == "" {
+		return 0, nil
+	}
+	// Use bitsize being the size of int on the machine.
+	return strconv.ParseUint(resourceVersion, 10, 0)
+}
+
+func (w *watchCache) processEvent(event watch.Event, resourceVersion uint64, updateFunc func(*storeElement) error) error {
+	key, err := w.keyFunc(event.Object)
+	if err != nil {
+		return fmt.Errorf("couldn't compute key: %v", err)
+	}
+	elem := &storeElement{Key: key, Object: event.Object}
+	elem.Labels, elem.Fields, elem.Uninitialized, err = w.getAttrsFunc(event.Object)
+	if err != nil {
+		return err
+	}
+
+	watchCacheEvent := &watchCacheEvent{
+		Type:             event.Type,
+		Object:           elem.Object,
+		ObjLabels:        elem.Labels,
+		ObjFields:        elem.Fields,
+		ObjUninitialized: elem.Uninitialized,
+		Key:              key,
+		ResourceVersion:  resourceVersion,
+	}
+
+	// TODO: We should consider moving this lock below after the watchCacheEvent
+	// is created. In such situation, the only problematic scenario is Replace(
+	// happening after getting object from store and before acquiring a lock.
+	// Maybe introduce another lock for this purpose.
+	w.Lock()
+	defer w.Unlock()
+	previous, exists, err := w.store.Get(elem)
+	if err != nil {
+		return err
+	}
+	if exists {
+		previousElem := previous.(*storeElement)
+		watchCacheEvent.PrevObject = previousElem.Object
+		watchCacheEvent.PrevObjLabels = previousElem.Labels
+		watchCacheEvent.PrevObjFields = previousElem.Fields
+		watchCacheEvent.PrevObjUninitialized = previousElem.Uninitialized
+	}
+
+	if w.onEvent != nil {
+		w.onEvent(watchCacheEvent)
+	}
+	w.updateCache(resourceVersion, watchCacheEvent)
+	w.resourceVersion = resourceVersion
+	w.cond.Broadcast()
+	return updateFunc(elem)
+}
+
+// Assumes that lock is already held for write.
+func (w *watchCache) updateCache(resourceVersion uint64, event *watchCacheEvent) {
+	if w.endIndex == w.startIndex+w.capacity {
+		// Cache is full - remove the oldest element.
+		w.startIndex++
+	}
+	w.cache[w.endIndex%w.capacity] = watchCacheElement{resourceVersion, event}
+	w.endIndex++
+}
+
+// List returns list of pointers to <storeElement> objects.
+func (w *watchCache) List() []interface{} {
+	return w.store.List()
+}
+
+// waitUntilFreshAndBlock waits until cache is at least as fresh as given <resourceVersion>.
+// NOTE: This function acquired lock and doesn't release it.
+// You HAVE TO explicitly call w.RUnlock() after this function.
+func (w *watchCache) waitUntilFreshAndBlock(resourceVersion uint64, trace *utiltrace.Trace) error {
+	startTime := w.clock.Now()
+	go func() {
+		// Wake us up when the time limit has expired.  The docs
+		// promise that time.After (well, NewTimer, which it calls)
+		// will wait *at least* the duration given. Since this go
+		// routine starts sometime after we record the start time, and
+		// it will wake up the loop below sometime after the broadcast,
+		// we don't need to worry about waking it up before the time
+		// has expired accidentally.
+		<-w.clock.After(blockTimeout)
+		w.cond.Broadcast()
+	}()
+
+	w.RLock()
+	if trace != nil {
+		trace.Step("watchCache locked acquired")
+	}
+	for w.resourceVersion < resourceVersion {
+		if w.clock.Since(startTime) >= blockTimeout {
+			// Timeout with retry after 1 second.
+			return errors.NewTimeoutError(fmt.Sprintf("Too large resource version: %v, current: %v", resourceVersion, w.resourceVersion), 1)
+		}
+		w.cond.Wait()
+	}
+	if trace != nil {
+		trace.Step("watchCache fresh enough")
+	}
+	return nil
+}
+
+// WaitUntilFreshAndList returns list of pointers to <storeElement> objects.
+func (w *watchCache) WaitUntilFreshAndList(resourceVersion uint64, trace *utiltrace.Trace) ([]interface{}, uint64, error) {
+	err := w.waitUntilFreshAndBlock(resourceVersion, trace)
+	defer w.RUnlock()
+	if err != nil {
+		return nil, 0, err
+	}
+	return w.store.List(), w.resourceVersion, nil
+}
+
+// WaitUntilFreshAndGet returns a pointers to <storeElement> object.
+func (w *watchCache) WaitUntilFreshAndGet(resourceVersion uint64, key string, trace *utiltrace.Trace) (interface{}, bool, uint64, error) {
+	err := w.waitUntilFreshAndBlock(resourceVersion, trace)
+	defer w.RUnlock()
+	if err != nil {
+		return nil, false, 0, err
+	}
+	value, exists, err := w.store.GetByKey(key)
+	return value, exists, w.resourceVersion, err
+}
+
+func (w *watchCache) ListKeys() []string {
+	return w.store.ListKeys()
+}
+
+// Get takes runtime.Object as a parameter. However, it returns
+// pointer to <storeElement>.
+func (w *watchCache) Get(obj interface{}) (interface{}, bool, error) {
+	object, ok := obj.(runtime.Object)
+	if !ok {
+		return nil, false, fmt.Errorf("obj does not implement runtime.Object interface: %v", obj)
+	}
+	key, err := w.keyFunc(object)
+	if err != nil {
+		return nil, false, fmt.Errorf("couldn't compute key: %v", err)
+	}
+
+	return w.store.Get(&storeElement{Key: key, Object: object})
+}
+
+// GetByKey returns pointer to <storeElement>.
+func (w *watchCache) GetByKey(key string) (interface{}, bool, error) {
+	return w.store.GetByKey(key)
+}
+
+// Replace takes slice of runtime.Object as a parameter.
+func (w *watchCache) Replace(objs []interface{}, resourceVersion string) error {
+	version, err := parseResourceVersion(resourceVersion)
+	if err != nil {
+		return err
+	}
+
+	toReplace := make([]interface{}, 0, len(objs))
+	for _, obj := range objs {
+		object, ok := obj.(runtime.Object)
+		if !ok {
+			return fmt.Errorf("didn't get runtime.Object for replace: %#v", obj)
+		}
+		key, err := w.keyFunc(object)
+		if err != nil {
+			return fmt.Errorf("couldn't compute key: %v", err)
+		}
+		objLabels, objFields, objUninitialized, err := w.getAttrsFunc(object)
+		if err != nil {
+			return err
+		}
+		toReplace = append(toReplace, &storeElement{
+			Key:           key,
+			Object:        object,
+			Labels:        objLabels,
+			Fields:        objFields,
+			Uninitialized: objUninitialized,
+		})
+	}
+
+	w.Lock()
+	defer w.Unlock()
+
+	w.startIndex = 0
+	w.endIndex = 0
+	if err := w.store.Replace(toReplace, resourceVersion); err != nil {
+		return err
+	}
+	w.resourceVersion = version
+	if w.onReplace != nil {
+		w.onReplace()
+	}
+	w.cond.Broadcast()
+	return nil
+}
+
+func (w *watchCache) SetOnReplace(onReplace func()) {
+	w.Lock()
+	defer w.Unlock()
+	w.onReplace = onReplace
+}
+
+func (w *watchCache) SetOnEvent(onEvent func(*watchCacheEvent)) {
+	w.Lock()
+	defer w.Unlock()
+	w.onEvent = onEvent
+}
+
+func (w *watchCache) GetAllEventsSinceThreadUnsafe(resourceVersion uint64) ([]*watchCacheEvent, error) {
+	size := w.endIndex - w.startIndex
+	// if we have no watch events in our cache, the oldest one we can successfully deliver to a watcher
+	// is the *next* event we'll receive, which will be at least one greater than our current resourceVersion
+	oldest := w.resourceVersion + 1
+	if size > 0 {
+		oldest = w.cache[w.startIndex%w.capacity].resourceVersion
+	}
+	if resourceVersion == 0 {
+		// resourceVersion = 0 means that we don't require any specific starting point
+		// and we would like to start watching from ~now.
+		// However, to keep backward compatibility, we additionally need to return the
+		// current state and only then start watching from that point.
+		//
+		// TODO: In v2 api, we should stop returning the current state - #13969.
+		allItems := w.store.List()
+		result := make([]*watchCacheEvent, len(allItems))
+		for i, item := range allItems {
+			elem, ok := item.(*storeElement)
+			if !ok {
+				return nil, fmt.Errorf("not a storeElement: %v", elem)
+			}
+			objLabels, objFields, objUninitialized, err := w.getAttrsFunc(elem.Object)
+			if err != nil {
+				return nil, err
+			}
+			result[i] = &watchCacheEvent{
+				Type:             watch.Added,
+				Object:           elem.Object,
+				ObjLabels:        objLabels,
+				ObjFields:        objFields,
+				ObjUninitialized: objUninitialized,
+				Key:              elem.Key,
+				ResourceVersion:  w.resourceVersion,
+			}
+		}
+		return result, nil
+	}
+	if resourceVersion < oldest-1 {
+		return nil, errors.NewGone(fmt.Sprintf("too old resource version: %d (%d)", resourceVersion, oldest-1))
+	}
+
+	// Binary search the smallest index at which resourceVersion is greater than the given one.
+	f := func(i int) bool {
+		return w.cache[(w.startIndex+i)%w.capacity].resourceVersion > resourceVersion
+	}
+	first := sort.Search(size, f)
+	result := make([]*watchCacheEvent, size-first)
+	for i := 0; i < size-first; i++ {
+		result[i] = w.cache[(w.startIndex+first+i)%w.capacity].watchCacheEvent
+	}
+	return result, nil
+}
+
+func (w *watchCache) GetAllEventsSince(resourceVersion uint64) ([]*watchCacheEvent, error) {
+	w.RLock()
+	defer w.RUnlock()
+	return w.GetAllEventsSinceThreadUnsafe(resourceVersion)
+}
+
+func (w *watchCache) Resync() error {
+	// Nothing to do
+	return nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/util/feature/feature_gate.go b/metrics-server/vendor/k8s.io/apiserver/pkg/util/feature/feature_gate.go
new file mode 100644
index 0000000..6b051a2
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/util/feature/feature_gate.go
@@ -0,0 +1,347 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package feature
+
+import (
+	"fmt"
+	"sort"
+	"strconv"
+	"strings"
+	"sync"
+	"sync/atomic"
+
+	"github.com/golang/glog"
+	"github.com/spf13/pflag"
+)
+
+type Feature string
+
+const (
+	flagName = "feature-gates"
+
+	// allAlphaGate is a global toggle for alpha features. Per-feature key
+	// values override the default set by allAlphaGate. Examples:
+	//   AllAlpha=false,NewFeature=true  will result in newFeature=true
+	//   AllAlpha=true,NewFeature=false  will result in newFeature=false
+	allAlphaGate Feature = "AllAlpha"
+)
+
+var (
+	// The generic features.
+	defaultFeatures = map[Feature]FeatureSpec{
+		allAlphaGate: {Default: false, PreRelease: Alpha},
+	}
+
+	// Special handling for a few gates.
+	specialFeatures = map[Feature]func(known map[Feature]FeatureSpec, enabled map[Feature]bool, val bool){
+		allAlphaGate: setUnsetAlphaGates,
+	}
+
+	// DefaultFeatureGate is a shared global FeatureGate.
+	DefaultFeatureGate FeatureGate = NewFeatureGate()
+)
+
+type FeatureSpec struct {
+	Default    bool
+	PreRelease prerelease
+}
+
+type prerelease string
+
+const (
+	// Values for PreRelease.
+	Alpha = prerelease("ALPHA")
+	Beta  = prerelease("BETA")
+	GA    = prerelease("")
+
+	// Deprecated
+	Deprecated = prerelease("DEPRECATED")
+)
+
+// FeatureGate parses and stores flag gates for known features from
+// a string like feature1=true,feature2=false,...
+type FeatureGate interface {
+	// AddFlag adds a flag for setting global feature gates to the specified FlagSet.
+	AddFlag(fs *pflag.FlagSet)
+	// Set parses and stores flag gates for known features
+	// from a string like feature1=true,feature2=false,...
+	Set(value string) error
+	// SetFromMap stores flag gates for known features from a map[string]bool or returns an error
+	SetFromMap(m map[string]bool) error
+	// Enabled returns true if the key is enabled.
+	Enabled(key Feature) bool
+	// Add adds features to the featureGate.
+	Add(features map[Feature]FeatureSpec) error
+	// KnownFeatures returns a slice of strings describing the FeatureGate's known features.
+	KnownFeatures() []string
+	// DeepCopy returns a deep copy of the FeatureGate object, such that gates can be
+	// set on the copy without mutating the original. This is useful for validating
+	// config against potential feature gate changes before committing those changes.
+	DeepCopy() FeatureGate
+}
+
+// featureGate implements FeatureGate as well as pflag.Value for flag parsing.
+type featureGate struct {
+	special map[Feature]func(map[Feature]FeatureSpec, map[Feature]bool, bool)
+
+	// lock guards writes to known, enabled, and reads/writes of closed
+	lock sync.Mutex
+	// known holds a map[Feature]FeatureSpec
+	known *atomic.Value
+	// enabled holds a map[Feature]bool
+	enabled *atomic.Value
+	// closed is set to true when AddFlag is called, and prevents subsequent calls to Add
+	closed bool
+}
+
+func setUnsetAlphaGates(known map[Feature]FeatureSpec, enabled map[Feature]bool, val bool) {
+	for k, v := range known {
+		if v.PreRelease == Alpha {
+			if _, found := enabled[k]; !found {
+				enabled[k] = val
+			}
+		}
+	}
+}
+
+// Set, String, and Type implement pflag.Value
+var _ pflag.Value = &featureGate{}
+
+func NewFeatureGate() *featureGate {
+	known := map[Feature]FeatureSpec{}
+	for k, v := range defaultFeatures {
+		known[k] = v
+	}
+
+	knownValue := &atomic.Value{}
+	knownValue.Store(known)
+
+	enabled := map[Feature]bool{}
+	enabledValue := &atomic.Value{}
+	enabledValue.Store(enabled)
+
+	f := &featureGate{
+		known:   knownValue,
+		special: specialFeatures,
+		enabled: enabledValue,
+	}
+	return f
+}
+
+// Set parses a string of the form "key1=value1,key2=value2,..." into a
+// map[string]bool of known keys or returns an error.
+func (f *featureGate) Set(value string) error {
+	f.lock.Lock()
+	defer f.lock.Unlock()
+
+	// Copy existing state
+	known := map[Feature]FeatureSpec{}
+	for k, v := range f.known.Load().(map[Feature]FeatureSpec) {
+		known[k] = v
+	}
+	enabled := map[Feature]bool{}
+	for k, v := range f.enabled.Load().(map[Feature]bool) {
+		enabled[k] = v
+	}
+
+	for _, s := range strings.Split(value, ",") {
+		if len(s) == 0 {
+			continue
+		}
+		arr := strings.SplitN(s, "=", 2)
+		k := Feature(strings.TrimSpace(arr[0]))
+		featureSpec, ok := known[k]
+		if !ok {
+			return fmt.Errorf("unrecognized key: %s", k)
+		}
+		if len(arr) != 2 {
+			return fmt.Errorf("missing bool value for %s", k)
+		}
+		v := strings.TrimSpace(arr[1])
+		boolValue, err := strconv.ParseBool(v)
+		if err != nil {
+			return fmt.Errorf("invalid value of %s: %s, err: %v", k, v, err)
+		}
+		enabled[k] = boolValue
+		if boolValue && featureSpec.PreRelease == Deprecated {
+			glog.Warningf("enabling deprecated feature gate %s", k)
+		}
+
+		// Handle "special" features like "all alpha gates"
+		if fn, found := f.special[k]; found {
+			fn(known, enabled, boolValue)
+		}
+	}
+
+	// Persist changes
+	f.known.Store(known)
+	f.enabled.Store(enabled)
+
+	glog.V(1).Infof("feature gates: %v", enabled)
+	return nil
+}
+
+// SetFromMap stores flag gates for known features from a map[string]bool or returns an error
+func (f *featureGate) SetFromMap(m map[string]bool) error {
+	f.lock.Lock()
+	defer f.lock.Unlock()
+
+	// Copy existing state
+	known := map[Feature]FeatureSpec{}
+	for k, v := range f.known.Load().(map[Feature]FeatureSpec) {
+		known[k] = v
+	}
+	enabled := map[Feature]bool{}
+	for k, v := range f.enabled.Load().(map[Feature]bool) {
+		enabled[k] = v
+	}
+
+	for k, v := range m {
+		k := Feature(k)
+		_, ok := known[k]
+		if !ok {
+			return fmt.Errorf("unrecognized key: %s", k)
+		}
+		enabled[k] = v
+		// Handle "special" features like "all alpha gates"
+		if fn, found := f.special[k]; found {
+			fn(known, enabled, v)
+		}
+	}
+
+	// Persist changes
+	f.known.Store(known)
+	f.enabled.Store(enabled)
+
+	glog.V(1).Infof("feature gates: %v", f.enabled)
+	return nil
+}
+
+// String returns a string containing all enabled feature gates, formatted as "key1=value1,key2=value2,...".
+func (f *featureGate) String() string {
+	pairs := []string{}
+	for k, v := range f.enabled.Load().(map[Feature]bool) {
+		pairs = append(pairs, fmt.Sprintf("%s=%t", k, v))
+	}
+	sort.Strings(pairs)
+	return strings.Join(pairs, ",")
+}
+
+func (f *featureGate) Type() string {
+	return "mapStringBool"
+}
+
+// Add adds features to the featureGate.
+func (f *featureGate) Add(features map[Feature]FeatureSpec) error {
+	f.lock.Lock()
+	defer f.lock.Unlock()
+
+	if f.closed {
+		return fmt.Errorf("cannot add a feature gate after adding it to the flag set")
+	}
+
+	// Copy existing state
+	known := map[Feature]FeatureSpec{}
+	for k, v := range f.known.Load().(map[Feature]FeatureSpec) {
+		known[k] = v
+	}
+
+	for name, spec := range features {
+		if existingSpec, found := known[name]; found {
+			if existingSpec == spec {
+				continue
+			}
+			return fmt.Errorf("feature gate %q with different spec already exists: %v", name, existingSpec)
+		}
+
+		known[name] = spec
+	}
+
+	// Persist updated state
+	f.known.Store(known)
+
+	return nil
+}
+
+// Enabled returns true if the key is enabled.
+func (f *featureGate) Enabled(key Feature) bool {
+	if v, ok := f.enabled.Load().(map[Feature]bool)[key]; ok {
+		return v
+	}
+	return f.known.Load().(map[Feature]FeatureSpec)[key].Default
+}
+
+// AddFlag adds a flag for setting global feature gates to the specified FlagSet.
+func (f *featureGate) AddFlag(fs *pflag.FlagSet) {
+	f.lock.Lock()
+	// TODO(mtaufen): Shouldn't we just close it on the first Set/SetFromMap instead?
+	// Not all components expose a feature gates flag using this AddFlag method, and
+	// in the future, all components will completely stop exposing a feature gates flag,
+	// in favor of componentconfig.
+	f.closed = true
+	f.lock.Unlock()
+
+	known := f.KnownFeatures()
+	fs.Var(f, flagName, ""+
+		"A set of key=value pairs that describe feature gates for alpha/experimental features. "+
+		"Options are:\n"+strings.Join(known, "\n"))
+}
+
+// KnownFeatures returns a slice of strings describing the FeatureGate's known features.
+func (f *featureGate) KnownFeatures() []string {
+	var known []string
+	for k, v := range f.known.Load().(map[Feature]FeatureSpec) {
+		pre := ""
+		if v.PreRelease != GA {
+			pre = fmt.Sprintf("%s - ", v.PreRelease)
+		}
+		known = append(known, fmt.Sprintf("%s=true|false (%sdefault=%t)", k, pre, v.Default))
+	}
+	sort.Strings(known)
+	return known
+}
+
+// DeepCopy returns a deep copy of the FeatureGate object, such that gates can be
+// set on the copy without mutating the original. This is useful for validating
+// config against potential feature gate changes before committing those changes.
+func (f *featureGate) DeepCopy() FeatureGate {
+	// Copy existing state.
+	known := map[Feature]FeatureSpec{}
+	for k, v := range f.known.Load().(map[Feature]FeatureSpec) {
+		known[k] = v
+	}
+	enabled := map[Feature]bool{}
+	for k, v := range f.enabled.Load().(map[Feature]bool) {
+		enabled[k] = v
+	}
+
+	// Store copied state in new atomics.
+	knownValue := &atomic.Value{}
+	knownValue.Store(known)
+	enabledValue := &atomic.Value{}
+	enabledValue.Store(enabled)
+
+	// Construct a new featureGate around the copied state.
+	// Note that specialFeatures is treated as immutable by convention,
+	// and we maintain the value of f.closed across the copy.
+	return &featureGate{
+		special: specialFeatures,
+		known:   knownValue,
+		enabled: enabledValue,
+		closed:  f.closed,
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/ciphersuites_flag.go b/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/ciphersuites_flag.go
new file mode 100644
index 0000000..764747c
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/ciphersuites_flag.go
@@ -0,0 +1,105 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package flag
+
+import (
+	"crypto/tls"
+	"fmt"
+
+	"k8s.io/apimachinery/pkg/util/sets"
+)
+
+// ciphers maps strings into tls package cipher constants in
+// https://golang.org/pkg/crypto/tls/#pkg-constants
+var ciphers = map[string]uint16{
+	"TLS_RSA_WITH_RC4_128_SHA":                tls.TLS_RSA_WITH_RC4_128_SHA,
+	"TLS_RSA_WITH_3DES_EDE_CBC_SHA":           tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA,
+	"TLS_RSA_WITH_AES_128_CBC_SHA":            tls.TLS_RSA_WITH_AES_128_CBC_SHA,
+	"TLS_RSA_WITH_AES_256_CBC_SHA":            tls.TLS_RSA_WITH_AES_256_CBC_SHA,
+	"TLS_RSA_WITH_AES_128_CBC_SHA256":         tls.TLS_RSA_WITH_AES_128_CBC_SHA256,
+	"TLS_RSA_WITH_AES_128_GCM_SHA256":         tls.TLS_RSA_WITH_AES_128_GCM_SHA256,
+	"TLS_RSA_WITH_AES_256_GCM_SHA384":         tls.TLS_RSA_WITH_AES_256_GCM_SHA384,
+	"TLS_ECDHE_ECDSA_WITH_RC4_128_SHA":        tls.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,
+	"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA":    tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
+	"TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA":    tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
+	"TLS_ECDHE_RSA_WITH_RC4_128_SHA":          tls.TLS_ECDHE_RSA_WITH_RC4_128_SHA,
+	"TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA":     tls.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,
+	"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA":      tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
+	"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA":      tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
+	"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256": tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
+	"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256":   tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
+	"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256":   tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
+	"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256": tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
+	"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384":   tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
+	"TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384": tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
+	"TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305":    tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
+	"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305":  tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
+}
+
+func TLSCipherPossibleValues() []string {
+	cipherKeys := sets.NewString()
+	for key := range ciphers {
+		cipherKeys.Insert(key)
+	}
+	return cipherKeys.List()
+}
+
+func TLSCipherSuites(cipherNames []string) ([]uint16, error) {
+	if len(cipherNames) == 0 {
+		return nil, nil
+	}
+	ciphersIntSlice := make([]uint16, 0)
+	for _, cipher := range cipherNames {
+		intValue, ok := ciphers[cipher]
+		if !ok {
+			return nil, fmt.Errorf("Cipher suite %s not supported or doesn't exist", cipher)
+		}
+		ciphersIntSlice = append(ciphersIntSlice, intValue)
+	}
+	return ciphersIntSlice, nil
+}
+
+var versions = map[string]uint16{
+	"VersionTLS10": tls.VersionTLS10,
+	"VersionTLS11": tls.VersionTLS11,
+	"VersionTLS12": tls.VersionTLS12,
+}
+
+func TLSPossibleVersions() []string {
+	versionsKeys := sets.NewString()
+	for key := range versions {
+		versionsKeys.Insert(key)
+	}
+	return versionsKeys.List()
+}
+
+func TLSVersion(versionName string) (uint16, error) {
+	if len(versionName) == 0 {
+		return DefaultTLSVersion(), nil
+	}
+	if version, ok := versions[versionName]; ok {
+		return version, nil
+	}
+	return 0, fmt.Errorf("unknown tls version %q", versionName)
+}
+
+func DefaultTLSVersion() uint16 {
+	// Can't use SSLv3 because of POODLE and BEAST
+	// Can't use TLSv1.0 because of POODLE and BEAST using CBC cipher
+	// Can't use TLSv1.1 because of RC4 cipher usage
+	return tls.VersionTLS12
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/colon_separated_multimap_string_string.go b/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/colon_separated_multimap_string_string.go
new file mode 100644
index 0000000..bd2cf5f
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/colon_separated_multimap_string_string.go
@@ -0,0 +1,102 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package flag
+
+import (
+	"fmt"
+	"sort"
+	"strings"
+)
+
+// ColonSeparatedMultimapStringString supports setting a map[string][]string from an encoding
+// that separates keys from values with ':' and separates key-value pairs with ','.
+// A key can be repeated multiple times, in which case the values are appended to a
+// slice of strings associated with that key. Items in the list associated with a given
+// key will appear in the order provided.
+// For example: `a:hello,b:again,c:world,b:beautiful` results in `{"a": ["hello"], "b": ["again", "beautiful"], "c": ["world"]}`
+// The first call to Set will clear the map before adding entries; subsequent calls will simply append to the map.
+// This makes it possible to override default values with a command-line option rather than appending to defaults,
+// while still allowing the distribution of key-value pairs across multiple flag invocations.
+// For example: `--flag "a:hello" --flag "b:again" --flag "b:beautiful" --flag "c:world"` results in `{"a": ["hello"], "b": ["again", "beautiful"], "c": ["world"]}`
+type ColonSeparatedMultimapStringString struct {
+	Multimap    *map[string][]string
+	initialized bool // set to true after the first Set call
+}
+
+// NewColonSeparatedMultimapStringString takes a pointer to a map[string][]string and returns the
+// ColonSeparatedMultimapStringString flag parsing shim for that map.
+func NewColonSeparatedMultimapStringString(m *map[string][]string) *ColonSeparatedMultimapStringString {
+	return &ColonSeparatedMultimapStringString{Multimap: m}
+}
+
+// Set implements github.com/spf13/pflag.Value
+func (m *ColonSeparatedMultimapStringString) Set(value string) error {
+	if m.Multimap == nil {
+		return fmt.Errorf("no target (nil pointer to map[string][]string)")
+	}
+	if !m.initialized || *m.Multimap == nil {
+		// clear default values, or allocate if no existing map
+		*m.Multimap = make(map[string][]string)
+		m.initialized = true
+	}
+	for _, pair := range strings.Split(value, ",") {
+		if len(pair) == 0 {
+			continue
+		}
+		kv := strings.SplitN(pair, ":", 2)
+		if len(kv) != 2 {
+			return fmt.Errorf("malformed pair, expect string:string")
+		}
+		k := strings.TrimSpace(kv[0])
+		v := strings.TrimSpace(kv[1])
+		(*m.Multimap)[k] = append((*m.Multimap)[k], v)
+	}
+	return nil
+}
+
+// String implements github.com/spf13/pflag.Value
+func (m *ColonSeparatedMultimapStringString) String() string {
+	type kv struct {
+		k string
+		v string
+	}
+	kvs := make([]kv, 0, len(*m.Multimap))
+	for k, vs := range *m.Multimap {
+		for i := range vs {
+			kvs = append(kvs, kv{k: k, v: vs[i]})
+		}
+	}
+	// stable sort by keys, order of values should be preserved
+	sort.SliceStable(kvs, func(i, j int) bool {
+		return kvs[i].k < kvs[j].k
+	})
+	pairs := make([]string, 0, len(kvs))
+	for i := range kvs {
+		pairs = append(pairs, fmt.Sprintf("%s:%s", kvs[i].k, kvs[i].v))
+	}
+	return strings.Join(pairs, ",")
+}
+
+// Type implements github.com/spf13/pflag.Value
+func (m *ColonSeparatedMultimapStringString) Type() string {
+	return "colonSeparatedMultimapStringString"
+}
+
+// Empty implements OmitEmpty
+func (m *ColonSeparatedMultimapStringString) Empty() bool {
+	return len(*m.Multimap) == 0
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/configuration_map.go b/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/configuration_map.go
new file mode 100644
index 0000000..911b05e
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/configuration_map.go
@@ -0,0 +1,53 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package flag
+
+import (
+	"fmt"
+	"sort"
+	"strings"
+)
+
+type ConfigurationMap map[string]string
+
+func (m *ConfigurationMap) String() string {
+	pairs := []string{}
+	for k, v := range *m {
+		pairs = append(pairs, fmt.Sprintf("%s=%s", k, v))
+	}
+	sort.Strings(pairs)
+	return strings.Join(pairs, ",")
+}
+
+func (m *ConfigurationMap) Set(value string) error {
+	for _, s := range strings.Split(value, ",") {
+		if len(s) == 0 {
+			continue
+		}
+		arr := strings.SplitN(s, "=", 2)
+		if len(arr) == 2 {
+			(*m)[strings.TrimSpace(arr[0])] = strings.TrimSpace(arr[1])
+		} else {
+			(*m)[strings.TrimSpace(arr[0])] = ""
+		}
+	}
+	return nil
+}
+
+func (*ConfigurationMap) Type() string {
+	return "mapStringString"
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/flags.go b/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/flags.go
new file mode 100644
index 0000000..55a3ed3
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/flags.go
@@ -0,0 +1,54 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package flag
+
+import (
+	goflag "flag"
+	"strings"
+
+	"github.com/golang/glog"
+	"github.com/spf13/pflag"
+)
+
+// WordSepNormalizeFunc changes all flags that contain "_" separators
+func WordSepNormalizeFunc(f *pflag.FlagSet, name string) pflag.NormalizedName {
+	if strings.Contains(name, "_") {
+		return pflag.NormalizedName(strings.Replace(name, "_", "-", -1))
+	}
+	return pflag.NormalizedName(name)
+}
+
+// WarnWordSepNormalizeFunc changes and warns for flags that contain "_" separators
+func WarnWordSepNormalizeFunc(f *pflag.FlagSet, name string) pflag.NormalizedName {
+	if strings.Contains(name, "_") {
+		nname := strings.Replace(name, "_", "-", -1)
+		glog.Warningf("%s is DEPRECATED and will be removed in a future version. Use %s instead.", name, nname)
+
+		return pflag.NormalizedName(nname)
+	}
+	return pflag.NormalizedName(name)
+}
+
+// InitFlags normalizes, parses, then logs the command line flags
+func InitFlags() {
+	pflag.CommandLine.SetNormalizeFunc(WordSepNormalizeFunc)
+	pflag.CommandLine.AddGoFlagSet(goflag.CommandLine)
+	pflag.Parse()
+	pflag.VisitAll(func(flag *pflag.Flag) {
+		glog.V(2).Infof("FLAG: --%s=%q", flag.Name, flag.Value)
+	})
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/langle_separated_map_string_string.go b/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/langle_separated_map_string_string.go
new file mode 100644
index 0000000..bf8dbfb
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/langle_separated_map_string_string.go
@@ -0,0 +1,82 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package flag
+
+import (
+	"fmt"
+	"sort"
+	"strings"
+)
+
+// LangleSeparatedMapStringString can be set from the command line with the format `--flag "string<string"`.
+// Multiple comma-separated key-value pairs in a single invocation are supported. For example: `--flag "a<foo,b<bar"`.
+// Multiple flag invocations are supported. For example: `--flag "a<foo" --flag "b<foo"`.
+type LangleSeparatedMapStringString struct {
+	Map         *map[string]string
+	initialized bool // set to true after first Set call
+}
+
+// NewLangleSeparatedMapStringString takes a pointer to a map[string]string and returns the
+// LangleSeparatedMapStringString flag parsing shim for that map
+func NewLangleSeparatedMapStringString(m *map[string]string) *LangleSeparatedMapStringString {
+	return &LangleSeparatedMapStringString{Map: m}
+}
+
+// String implements github.com/spf13/pflag.Value
+func (m *LangleSeparatedMapStringString) String() string {
+	pairs := []string{}
+	for k, v := range *m.Map {
+		pairs = append(pairs, fmt.Sprintf("%s<%s", k, v))
+	}
+	sort.Strings(pairs)
+	return strings.Join(pairs, ",")
+}
+
+// Set implements github.com/spf13/pflag.Value
+func (m *LangleSeparatedMapStringString) Set(value string) error {
+	if m.Map == nil {
+		return fmt.Errorf("no target (nil pointer to map[string]string)")
+	}
+	if !m.initialized || *m.Map == nil {
+		// clear default values, or allocate if no existing map
+		*m.Map = make(map[string]string)
+		m.initialized = true
+	}
+	for _, s := range strings.Split(value, ",") {
+		if len(s) == 0 {
+			continue
+		}
+		arr := strings.SplitN(s, "<", 2)
+		if len(arr) != 2 {
+			return fmt.Errorf("malformed pair, expect string<string")
+		}
+		k := strings.TrimSpace(arr[0])
+		v := strings.TrimSpace(arr[1])
+		(*m.Map)[k] = v
+	}
+	return nil
+}
+
+// Type implements github.com/spf13/pflag.Value
+func (*LangleSeparatedMapStringString) Type() string {
+	return "mapStringString"
+}
+
+// Empty implements OmitEmpty
+func (m *LangleSeparatedMapStringString) Empty() bool {
+	return len(*m.Map) == 0
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/map_string_bool.go b/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/map_string_bool.go
new file mode 100644
index 0000000..e5a0180
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/map_string_bool.go
@@ -0,0 +1,90 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package flag
+
+import (
+	"fmt"
+	"sort"
+	"strconv"
+	"strings"
+)
+
+// MapStringBool can be set from the command line with the format `--flag "string=bool"`.
+// Multiple comma-separated key-value pairs in a single invocation are supported. For example: `--flag "a=true,b=false"`.
+// Multiple flag invocations are supported. For example: `--flag "a=true" --flag "b=false"`.
+type MapStringBool struct {
+	Map         *map[string]bool
+	initialized bool
+}
+
+// NewMapStringBool takes a pointer to a map[string]string and returns the
+// MapStringBool flag parsing shim for that map
+func NewMapStringBool(m *map[string]bool) *MapStringBool {
+	return &MapStringBool{Map: m}
+}
+
+// String implements github.com/spf13/pflag.Value
+func (m *MapStringBool) String() string {
+	if m == nil || m.Map == nil {
+		return ""
+	}
+	pairs := []string{}
+	for k, v := range *m.Map {
+		pairs = append(pairs, fmt.Sprintf("%s=%t", k, v))
+	}
+	sort.Strings(pairs)
+	return strings.Join(pairs, ",")
+}
+
+// Set implements github.com/spf13/pflag.Value
+func (m *MapStringBool) Set(value string) error {
+	if m.Map == nil {
+		return fmt.Errorf("no target (nil pointer to map[string]bool)")
+	}
+	if !m.initialized || *m.Map == nil {
+		// clear default values, or allocate if no existing map
+		*m.Map = make(map[string]bool)
+		m.initialized = true
+	}
+	for _, s := range strings.Split(value, ",") {
+		if len(s) == 0 {
+			continue
+		}
+		arr := strings.SplitN(s, "=", 2)
+		if len(arr) != 2 {
+			return fmt.Errorf("malformed pair, expect string=bool")
+		}
+		k := strings.TrimSpace(arr[0])
+		v := strings.TrimSpace(arr[1])
+		boolValue, err := strconv.ParseBool(v)
+		if err != nil {
+			return fmt.Errorf("invalid value of %s: %s, err: %v", k, v, err)
+		}
+		(*m.Map)[k] = boolValue
+	}
+	return nil
+}
+
+// Type implements github.com/spf13/pflag.Value
+func (*MapStringBool) Type() string {
+	return "mapStringBool"
+}
+
+// Empty implements OmitEmpty
+func (m *MapStringBool) Empty() bool {
+	return len(*m.Map) == 0
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/map_string_string.go b/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/map_string_string.go
new file mode 100644
index 0000000..129470b
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/map_string_string.go
@@ -0,0 +1,112 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package flag
+
+import (
+	"fmt"
+	"sort"
+	"strings"
+)
+
+// MapStringString can be set from the command line with the format `--flag "string=string"`.
+// Multiple flag invocations are supported. For example: `--flag "a=foo" --flag "b=bar"`. If this is desired
+// to be the only type invocation `NoSplit` should be set to true.
+// Multiple comma-separated key-value pairs in a single invocation are supported if `NoSplit`
+// is set to false. For example: `--flag "a=foo,b=bar"`.
+type MapStringString struct {
+	Map         *map[string]string
+	initialized bool
+	NoSplit     bool
+}
+
+// NewMapStringString takes a pointer to a map[string]string and returns the
+// MapStringString flag parsing shim for that map
+func NewMapStringString(m *map[string]string) *MapStringString {
+	return &MapStringString{Map: m}
+}
+
+// NewMapStringString takes a pointer to a map[string]string and sets `NoSplit`
+// value to `true` and returns the MapStringString flag parsing shim for that map
+func NewMapStringStringNoSplit(m *map[string]string) *MapStringString {
+	return &MapStringString{
+		Map:     m,
+		NoSplit: true,
+	}
+}
+
+// String implements github.com/spf13/pflag.Value
+func (m *MapStringString) String() string {
+	if m == nil || m.Map == nil {
+		return ""
+	}
+	pairs := []string{}
+	for k, v := range *m.Map {
+		pairs = append(pairs, fmt.Sprintf("%s=%s", k, v))
+	}
+	sort.Strings(pairs)
+	return strings.Join(pairs, ",")
+}
+
+// Set implements github.com/spf13/pflag.Value
+func (m *MapStringString) Set(value string) error {
+	if m.Map == nil {
+		return fmt.Errorf("no target (nil pointer to map[string]string)")
+	}
+	if !m.initialized || *m.Map == nil {
+		// clear default values, or allocate if no existing map
+		*m.Map = make(map[string]string)
+		m.initialized = true
+	}
+
+	// account for comma-separated key-value pairs in a single invocation
+	if !m.NoSplit {
+		for _, s := range strings.Split(value, ",") {
+			if len(s) == 0 {
+				continue
+			}
+			arr := strings.SplitN(s, "=", 2)
+			if len(arr) != 2 {
+				return fmt.Errorf("malformed pair, expect string=string")
+			}
+			k := strings.TrimSpace(arr[0])
+			v := strings.TrimSpace(arr[1])
+			(*m.Map)[k] = v
+		}
+		return nil
+	}
+
+	// account for only one key-value pair in a single invocation
+	arr := strings.SplitN(value, "=", 2)
+	if len(arr) != 2 {
+		return fmt.Errorf("malformed pair, expect string=string")
+	}
+	k := strings.TrimSpace(arr[0])
+	v := strings.TrimSpace(arr[1])
+	(*m.Map)[k] = v
+	return nil
+
+}
+
+// Type implements github.com/spf13/pflag.Value
+func (*MapStringString) Type() string {
+	return "mapStringString"
+}
+
+// Empty implements OmitEmpty
+func (m *MapStringString) Empty() bool {
+	return len(*m.Map) == 0
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/namedcertkey_flag.go b/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/namedcertkey_flag.go
new file mode 100644
index 0000000..bc68677
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/namedcertkey_flag.go
@@ -0,0 +1,113 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+package flag
+
+import (
+	"errors"
+	"flag"
+	"strings"
+)
+
+// NamedCertKey is a flag value parsing "certfile,keyfile" and "certfile,keyfile:name,name,name".
+type NamedCertKey struct {
+	Names             []string
+	CertFile, KeyFile string
+}
+
+var _ flag.Value = &NamedCertKey{}
+
+func (nkc *NamedCertKey) String() string {
+	s := nkc.CertFile + "," + nkc.KeyFile
+	if len(nkc.Names) > 0 {
+		s = s + ":" + strings.Join(nkc.Names, ",")
+	}
+	return s
+}
+
+func (nkc *NamedCertKey) Set(value string) error {
+	cs := strings.SplitN(value, ":", 2)
+	var keycert string
+	if len(cs) == 2 {
+		var names string
+		keycert, names = strings.TrimSpace(cs[0]), strings.TrimSpace(cs[1])
+		if names == "" {
+			return errors.New("empty names list is not allowed")
+		}
+		nkc.Names = nil
+		for _, name := range strings.Split(names, ",") {
+			nkc.Names = append(nkc.Names, strings.TrimSpace(name))
+		}
+	} else {
+		nkc.Names = nil
+		keycert = strings.TrimSpace(cs[0])
+	}
+	cs = strings.Split(keycert, ",")
+	if len(cs) != 2 {
+		return errors.New("expected comma separated certificate and key file paths")
+	}
+	nkc.CertFile = strings.TrimSpace(cs[0])
+	nkc.KeyFile = strings.TrimSpace(cs[1])
+	return nil
+}
+
+func (*NamedCertKey) Type() string {
+	return "namedCertKey"
+}
+
+// NamedCertKeyArray is a flag value parsing NamedCertKeys, each passed with its own
+// flag instance (in contrast to comma separated slices).
+type NamedCertKeyArray struct {
+	value   *[]NamedCertKey
+	changed bool
+}
+
+var _ flag.Value = &NamedCertKey{}
+
+// NewNamedKeyCertArray creates a new NamedCertKeyArray with the internal value
+// pointing to p.
+func NewNamedCertKeyArray(p *[]NamedCertKey) *NamedCertKeyArray {
+	return &NamedCertKeyArray{
+		value: p,
+	}
+}
+
+func (a *NamedCertKeyArray) Set(val string) error {
+	nkc := NamedCertKey{}
+	err := nkc.Set(val)
+	if err != nil {
+		return err
+	}
+	if !a.changed {
+		*a.value = []NamedCertKey{nkc}
+		a.changed = true
+	} else {
+		*a.value = append(*a.value, nkc)
+	}
+	return nil
+}
+
+func (a *NamedCertKeyArray) Type() string {
+	return "namedCertKey"
+}
+
+func (a *NamedCertKeyArray) String() string {
+	nkcs := make([]string, 0, len(*a.value))
+	for i := range *a.value {
+		nkcs = append(nkcs, (*a.value)[i].String())
+	}
+	return "[" + strings.Join(nkcs, ";") + "]"
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/noop.go b/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/noop.go
new file mode 100644
index 0000000..03f7f14
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/noop.go
@@ -0,0 +1,41 @@
+/*
+Copyright 2018 The Kubernetes Authors.
+
+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.
+*/
+
+package flag
+
+import (
+	goflag "flag"
+	"github.com/spf13/pflag"
+)
+
+// NoOp implements goflag.Value and plfag.Value,
+// but has a noop Set implementation
+type NoOp struct{}
+
+var _ goflag.Value = NoOp{}
+var _ pflag.Value = NoOp{}
+
+func (NoOp) String() string {
+	return ""
+}
+
+func (NoOp) Set(val string) error {
+	return nil
+}
+
+func (NoOp) Type() string {
+	return "NoOp"
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/omitempty.go b/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/omitempty.go
new file mode 100644
index 0000000..c354754
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/omitempty.go
@@ -0,0 +1,24 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package flag
+
+// OmitEmpty is an interface for flags to report whether their underlying value
+// is "empty." If a flag implements OmitEmpty and returns true for a call to Empty(),
+// it is assumed that flag may be omitted from the command line.
+type OmitEmpty interface {
+	Empty() bool
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/string_flag.go b/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/string_flag.go
new file mode 100644
index 0000000..331bdb6
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/string_flag.go
@@ -0,0 +1,56 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package flag
+
+// StringFlag is a string flag compatible with flags and pflags that keeps track of whether it had a value supplied or not.
+type StringFlag struct {
+	// If Set has been invoked this value is true
+	provided bool
+	// The exact value provided on the flag
+	value string
+}
+
+func NewStringFlag(defaultVal string) StringFlag {
+	return StringFlag{value: defaultVal}
+}
+
+func (f *StringFlag) Default(value string) {
+	f.value = value
+}
+
+func (f StringFlag) String() string {
+	return f.value
+}
+
+func (f StringFlag) Value() string {
+	return f.value
+}
+
+func (f *StringFlag) Set(value string) error {
+	f.value = value
+	f.provided = true
+
+	return nil
+}
+
+func (f StringFlag) Provided() bool {
+	return f.provided
+}
+
+func (f *StringFlag) Type() string {
+	return "string"
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/tristate.go b/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/tristate.go
new file mode 100644
index 0000000..cf16376
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/util/flag/tristate.go
@@ -0,0 +1,83 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package flag
+
+import (
+	"fmt"
+	"strconv"
+)
+
+// Tristate is a flag compatible with flags and pflags that
+// keeps track of whether it had a value supplied or not.
+type Tristate int
+
+const (
+	Unset Tristate = iota // 0
+	True
+	False
+)
+
+func (f *Tristate) Default(value bool) {
+	*f = triFromBool(value)
+}
+
+func (f Tristate) String() string {
+	b := boolFromTri(f)
+	return fmt.Sprintf("%t", b)
+}
+
+func (f Tristate) Value() bool {
+	b := boolFromTri(f)
+	return b
+}
+
+func (f *Tristate) Set(value string) error {
+	boolVal, err := strconv.ParseBool(value)
+	if err != nil {
+		return err
+	}
+
+	*f = triFromBool(boolVal)
+	return nil
+}
+
+func (f Tristate) Provided() bool {
+	if f != Unset {
+		return true
+	}
+	return false
+}
+
+func (f *Tristate) Type() string {
+	return "tristate"
+}
+
+func boolFromTri(t Tristate) bool {
+	if t == True {
+		return true
+	} else {
+		return false
+	}
+}
+
+func triFromBool(b bool) Tristate {
+	if b {
+		return True
+	} else {
+		return False
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/util/flushwriter/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/util/flushwriter/doc.go
new file mode 100644
index 0000000..f81e09a
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/util/flushwriter/doc.go
@@ -0,0 +1,19 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+// Package flushwriter implements a wrapper for a writer that flushes on every
+// write if that writer implements the io.Flusher interface
+package flushwriter // import "k8s.io/apiserver/pkg/util/flushwriter"
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/util/flushwriter/writer.go b/metrics-server/vendor/k8s.io/apiserver/pkg/util/flushwriter/writer.go
new file mode 100644
index 0000000..748bd01
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/util/flushwriter/writer.go
@@ -0,0 +1,53 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package flushwriter
+
+import (
+	"io"
+	"net/http"
+)
+
+// Wrap wraps an io.Writer into a writer that flushes after every write if
+// the writer implements the Flusher interface.
+func Wrap(w io.Writer) io.Writer {
+	fw := &flushWriter{
+		writer: w,
+	}
+	if flusher, ok := w.(http.Flusher); ok {
+		fw.flusher = flusher
+	}
+	return fw
+}
+
+// flushWriter provides wrapper for responseWriter with HTTP streaming capabilities
+type flushWriter struct {
+	flusher http.Flusher
+	writer  io.Writer
+}
+
+// Write is a FlushWriter implementation of the io.Writer that sends any buffered
+// data to the client.
+func (fw *flushWriter) Write(p []byte) (n int, err error) {
+	n, err = fw.writer.Write(p)
+	if err != nil {
+		return
+	}
+	if fw.flusher != nil {
+		fw.flusher.Flush()
+	}
+	return
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/util/logs/logs.go b/metrics-server/vendor/k8s.io/apiserver/pkg/util/logs/logs.go
new file mode 100644
index 0000000..c5ba084
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/util/logs/logs.go
@@ -0,0 +1,69 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+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.
+*/
+
+package logs
+
+import (
+	"flag"
+	"log"
+	"time"
+
+	"github.com/golang/glog"
+	"github.com/spf13/pflag"
+	"k8s.io/apimachinery/pkg/util/wait"
+)
+
+const logFlushFreqFlagName = "log-flush-frequency"
+
+var logFlushFreq = pflag.Duration(logFlushFreqFlagName, 5*time.Second, "Maximum number of seconds between log flushes")
+
+// TODO(thockin): This is temporary until we agree on log dirs and put those into each cmd.
+func init() {
+	flag.Set("logtostderr", "true")
+}
+
+// AddFlags registers this package's flags on arbitrary FlagSets, such that they point to the
+// same value as the global flags.
+func AddFlags(fs *pflag.FlagSet) {
+	fs.AddFlag(pflag.Lookup(logFlushFreqFlagName))
+}
+
+// GlogWriter serves as a bridge between the standard log package and the glog package.
+type GlogWriter struct{}
+
+// Write implements the io.Writer interface.
+func (writer GlogWriter) Write(data []byte) (n int, err error) {
+	glog.Info(string(data))
+	return len(data), nil
+}
+
+// InitLogs initializes logs the way we want for kubernetes.
+func InitLogs() {
+	log.SetOutput(GlogWriter{})
+	log.SetFlags(0)
+	// The default glog flush interval is 5 seconds.
+	go wait.Forever(glog.Flush, *logFlushFreq)
+}
+
+// FlushLogs flushes logs immediately.
+func FlushLogs() {
+	glog.Flush()
+}
+
+// NewLogger creates a new log.Logger which sends logs to glog.Info.
+func NewLogger(prefix string) *log.Logger {
+	return log.New(GlogWriter{}, prefix, 0)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/util/openapi/proto.go b/metrics-server/vendor/k8s.io/apiserver/pkg/util/openapi/proto.go
new file mode 100644
index 0000000..5641d1a
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/util/openapi/proto.go
@@ -0,0 +1,142 @@
+/*
+Copyright 2018 The Kubernetes Authors.
+
+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.
+*/
+
+package openapi
+
+import (
+	"encoding/json"
+	"fmt"
+
+	"github.com/go-openapi/spec"
+	openapi_v2 "github.com/googleapis/gnostic/OpenAPIv2"
+	"github.com/googleapis/gnostic/compiler"
+	yaml "gopkg.in/yaml.v2"
+
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/kube-openapi/pkg/util/proto"
+)
+
+const (
+	// groupVersionKindExtensionKey is the key used to lookup the
+	// GroupVersionKind value for an object definition from the
+	// definition's "extensions" map.
+	groupVersionKindExtensionKey = "x-kubernetes-group-version-kind"
+)
+
+// ToProtoSchema builds the proto formatted schema from an OpenAPI spec
+func ToProtoSchema(openAPIDefinitions *spec.Definitions, gvk schema.GroupVersionKind) (proto.Schema, error) {
+	openAPISpec := newMinimalValidOpenAPISpec()
+	openAPISpec.Definitions = *openAPIDefinitions
+
+	specBytes, err := json.MarshalIndent(openAPISpec, " ", " ")
+	if err != nil {
+		return nil, err
+	}
+
+	var info yaml.MapSlice
+	err = yaml.Unmarshal(specBytes, &info)
+	if err != nil {
+		return nil, err
+	}
+
+	doc, err := openapi_v2.NewDocument(info, compiler.NewContext("$root", nil))
+	if err != nil {
+		return nil, err
+	}
+
+	models, err := proto.NewOpenAPIData(doc)
+	if err != nil {
+		return nil, err
+	}
+
+	for _, modelName := range models.ListModels() {
+		model := models.LookupModel(modelName)
+		if model == nil {
+			return nil, fmt.Errorf("the ListModels function returned a model that can't be looked-up")
+		}
+		gvkList := parseGroupVersionKind(model)
+		for _, modelGVK := range gvkList {
+			if modelGVK == gvk {
+				return model, nil
+			}
+		}
+	}
+
+	return nil, fmt.Errorf("no model found with a %v tag matching %v", groupVersionKindExtensionKey, gvk)
+}
+
+// newMinimalValidOpenAPISpec creates a minimal openapi spec with only the required fields filled in
+func newMinimalValidOpenAPISpec() *spec.Swagger {
+	return &spec.Swagger{
+		SwaggerProps: spec.SwaggerProps{
+			Swagger: "2.0",
+			Info: &spec.Info{
+				InfoProps: spec.InfoProps{
+					Title:   "Kubernetes",
+					Version: "0.0.0",
+				},
+			},
+		},
+	}
+}
+
+// parseGroupVersionKind gets and parses GroupVersionKind from the extension. Returns empty if it doesn't have one.
+func parseGroupVersionKind(s proto.Schema) []schema.GroupVersionKind {
+	extensions := s.GetExtensions()
+
+	gvkListResult := []schema.GroupVersionKind{}
+
+	// Get the extensions
+	gvkExtension, ok := extensions[groupVersionKindExtensionKey]
+	if !ok {
+		return []schema.GroupVersionKind{}
+	}
+
+	// gvk extension must be a list of at least 1 element.
+	gvkList, ok := gvkExtension.([]interface{})
+	if !ok {
+		return []schema.GroupVersionKind{}
+	}
+
+	for _, gvk := range gvkList {
+		// gvk extension list must be a map with group, version, and
+		// kind fields
+		gvkMap, ok := gvk.(map[interface{}]interface{})
+		if !ok {
+			continue
+		}
+		group, ok := gvkMap["group"].(string)
+		if !ok {
+			continue
+		}
+		version, ok := gvkMap["version"].(string)
+		if !ok {
+			continue
+		}
+		kind, ok := gvkMap["kind"].(string)
+		if !ok {
+			continue
+		}
+
+		gvkListResult = append(gvkListResult, schema.GroupVersionKind{
+			Group:   group,
+			Version: version,
+			Kind:    kind,
+		})
+	}
+
+	return gvkListResult
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/util/trace/trace.go b/metrics-server/vendor/k8s.io/apiserver/pkg/util/trace/trace.go
new file mode 100644
index 0000000..b2f31c5
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/util/trace/trace.go
@@ -0,0 +1,89 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+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.
+*/
+
+package trace
+
+import (
+	"bytes"
+	"fmt"
+	"math/rand"
+	"time"
+
+	"github.com/golang/glog"
+)
+
+type traceStep struct {
+	stepTime time.Time
+	msg      string
+}
+
+type Trace struct {
+	name      string
+	startTime time.Time
+	steps     []traceStep
+}
+
+func New(name string) *Trace {
+	return &Trace{name, time.Now(), nil}
+}
+
+func (t *Trace) Step(msg string) {
+	if t.steps == nil {
+		// traces almost always have less than 6 steps, do this to avoid more than a single allocation
+		t.steps = make([]traceStep, 0, 6)
+	}
+	t.steps = append(t.steps, traceStep{time.Now(), msg})
+}
+
+func (t *Trace) Log() {
+	// an explicit logging request should dump all the steps out at the higher level
+	t.logWithStepThreshold(0)
+}
+
+func (t *Trace) logWithStepThreshold(stepThreshold time.Duration) {
+	var buffer bytes.Buffer
+	tracenum := rand.Int31()
+	endTime := time.Now()
+
+	totalTime := endTime.Sub(t.startTime)
+	buffer.WriteString(fmt.Sprintf("Trace[%d]: %q (started: %v) (total time: %v):\n", tracenum, t.name, t.startTime, totalTime))
+	lastStepTime := t.startTime
+	for _, step := range t.steps {
+		stepDuration := step.stepTime.Sub(lastStepTime)
+		if stepThreshold == 0 || stepDuration > stepThreshold || glog.V(4) {
+			buffer.WriteString(fmt.Sprintf("Trace[%d]: [%v] [%v] %v\n", tracenum, step.stepTime.Sub(t.startTime), stepDuration, step.msg))
+		}
+		lastStepTime = step.stepTime
+	}
+	stepDuration := endTime.Sub(lastStepTime)
+	if stepThreshold == 0 || stepDuration > stepThreshold || glog.V(4) {
+		buffer.WriteString(fmt.Sprintf("Trace[%d]: [%v] [%v] END\n", tracenum, endTime.Sub(t.startTime), stepDuration))
+	}
+
+	glog.Info(buffer.String())
+}
+
+func (t *Trace) LogIfLong(threshold time.Duration) {
+	if time.Since(t.startTime) >= threshold {
+		// if any step took more than it's share of the total allowed time, it deserves a higher log level
+		stepThreshold := threshold / time.Duration(len(t.steps)+1)
+		t.logWithStepThreshold(stepThreshold)
+	}
+}
+
+func (t *Trace) TotalTime() time.Duration {
+	return time.Since(t.startTime)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/util/webhook/gencerts.sh b/metrics-server/vendor/k8s.io/apiserver/pkg/util/webhook/gencerts.sh
new file mode 100755
index 0000000..a042ab6
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/util/webhook/gencerts.sh
@@ -0,0 +1,107 @@
+#!/usr/bin/env bash
+
+# Copyright 2017 The Kubernetes Authors.
+#
+# 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.
+
+set -e
+
+# gencerts.sh generates the certificates for the webhook tests.
+#
+# It is not expected to be run often (there is no go generate rule), and mainly
+# exists for documentation purposes.
+
+CN_BASE="webhook_tests"
+
+cat > server.conf << EOF
+[req]
+req_extensions = v3_req
+distinguished_name = req_distinguished_name
+[req_distinguished_name]
+[ v3_req ]
+basicConstraints = CA:FALSE
+keyUsage = nonRepudiation, digitalSignature, keyEncipherment
+extendedKeyUsage = clientAuth, serverAuth
+subjectAltName = @alt_names
+[alt_names]
+IP.1 = 127.0.0.1
+EOF
+
+cat > client.conf << EOF
+[req]
+req_extensions = v3_req
+distinguished_name = req_distinguished_name
+[req_distinguished_name]
+[ v3_req ]
+basicConstraints = CA:FALSE
+keyUsage = nonRepudiation, digitalSignature, keyEncipherment
+extendedKeyUsage = clientAuth, serverAuth
+subjectAltName = @alt_names
+[alt_names]
+IP.1 = 127.0.0.1
+EOF
+
+# Create a certificate authority
+openssl genrsa -out caKey.pem 2048
+openssl req -x509 -new -nodes -key caKey.pem -days 100000 -out caCert.pem -subj "/CN=${CN_BASE}_ca"
+
+# Create a second certificate authority
+openssl genrsa -out badCAKey.pem 2048
+openssl req -x509 -new -nodes -key badCAKey.pem -days 100000 -out badCACert.pem -subj "/CN=${CN_BASE}_ca"
+
+# Create a server certiticate
+openssl genrsa -out serverKey.pem 2048
+openssl req -new -key serverKey.pem -out server.csr -subj "/CN=${CN_BASE}_server" -config server.conf
+openssl x509 -req -in server.csr -CA caCert.pem -CAkey caKey.pem -CAcreateserial -out serverCert.pem -days 100000 -extensions v3_req -extfile server.conf
+
+# Create a client certiticate
+openssl genrsa -out clientKey.pem 2048
+openssl req -new -key clientKey.pem -out client.csr -subj "/CN=${CN_BASE}_client" -config client.conf
+openssl x509 -req -in client.csr -CA caCert.pem -CAkey caKey.pem -CAcreateserial -out clientCert.pem -days 100000 -extensions v3_req -extfile client.conf
+
+outfile=certs_test.go
+
+cat > $outfile << EOF
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+EOF
+
+echo "// This file was generated using openssl by the gencerts.sh script" >> $outfile
+echo "// and holds raw certificates for the webhook tests." >> $outfile
+echo "" >> $outfile
+echo "package webhook" >> $outfile
+for file in caKey caCert badCAKey badCACert serverKey serverCert clientKey clientCert; do
+	data=$(cat ${file}.pem)
+	echo "" >> $outfile
+	echo "var $file = []byte(\`$data\`)" >> $outfile
+done
+
+# Clean up after we're done.
+rm *.pem
+rm *.csr
+rm *.srl
+rm *.conf
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/util/webhook/webhook.go b/metrics-server/vendor/k8s.io/apiserver/pkg/util/webhook/webhook.go
new file mode 100755
index 0000000..3b03fd3
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/util/webhook/webhook.go
@@ -0,0 +1,120 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+// Package webhook implements a generic HTTP webhook plugin.
+package webhook
+
+import (
+	"fmt"
+	"time"
+
+	apierrors "k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apimachinery/pkg/runtime/serializer"
+	"k8s.io/apimachinery/pkg/util/net"
+	"k8s.io/apimachinery/pkg/util/wait"
+	"k8s.io/client-go/rest"
+	"k8s.io/client-go/tools/clientcmd"
+)
+
+// defaultRequestTimeout is set for all webhook request. This is the absolute
+// timeout of the HTTP request, including reading the response body.
+const defaultRequestTimeout = 30 * time.Second
+
+type GenericWebhook struct {
+	RestClient     *rest.RESTClient
+	initialBackoff time.Duration
+}
+
+// NewGenericWebhook creates a new GenericWebhook from the provided kubeconfig file.
+func NewGenericWebhook(scheme *runtime.Scheme, codecFactory serializer.CodecFactory, kubeConfigFile string, groupVersions []schema.GroupVersion, initialBackoff time.Duration) (*GenericWebhook, error) {
+	return newGenericWebhook(scheme, codecFactory, kubeConfigFile, groupVersions, initialBackoff, defaultRequestTimeout)
+}
+
+func newGenericWebhook(scheme *runtime.Scheme, codecFactory serializer.CodecFactory, kubeConfigFile string, groupVersions []schema.GroupVersion, initialBackoff, requestTimeout time.Duration) (*GenericWebhook, error) {
+	for _, groupVersion := range groupVersions {
+		if !scheme.IsVersionRegistered(groupVersion) {
+			return nil, fmt.Errorf("webhook plugin requires enabling extension resource: %s", groupVersion)
+		}
+	}
+
+	loadingRules := clientcmd.NewDefaultClientConfigLoadingRules()
+	loadingRules.ExplicitPath = kubeConfigFile
+	loader := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, &clientcmd.ConfigOverrides{})
+
+	clientConfig, err := loader.ClientConfig()
+	if err != nil {
+		return nil, err
+	}
+
+	// Kubeconfigs can't set a timeout, this can only be set through a command line flag.
+	//
+	// https://github.com/kubernetes/client-go/blob/master/tools/clientcmd/overrides.go
+	//
+	// Set this to something reasonable so request to webhooks don't hang forever.
+	clientConfig.Timeout = requestTimeout
+
+	codec := codecFactory.LegacyCodec(groupVersions...)
+	clientConfig.ContentConfig.NegotiatedSerializer = serializer.NegotiatedSerializerWrapper(runtime.SerializerInfo{Serializer: codec})
+
+	restClient, err := rest.UnversionedRESTClientFor(clientConfig)
+	if err != nil {
+		return nil, err
+	}
+
+	return &GenericWebhook{restClient, initialBackoff}, nil
+}
+
+// WithExponentialBackoff will retry webhookFn() up to 5 times with exponentially increasing backoff when
+// it returns an error for which apierrors.SuggestsClientDelay() or apierrors.IsInternalError() returns true.
+func (g *GenericWebhook) WithExponentialBackoff(webhookFn func() rest.Result) rest.Result {
+	var result rest.Result
+	WithExponentialBackoff(g.initialBackoff, func() error {
+		result = webhookFn()
+		return result.Error()
+	})
+	return result
+}
+
+// WithExponentialBackoff will retry webhookFn() up to 5 times with exponentially increasing backoff when
+// it returns an error for which apierrors.SuggestsClientDelay() or apierrors.IsInternalError() returns true.
+func WithExponentialBackoff(initialBackoff time.Duration, webhookFn func() error) error {
+	backoff := wait.Backoff{
+		Duration: initialBackoff,
+		Factor:   1.5,
+		Jitter:   0.2,
+		Steps:    5,
+	}
+
+	var err error
+	wait.ExponentialBackoff(backoff, func() (bool, error) {
+		err = webhookFn()
+		// these errors indicate a transient error that should be retried.
+		if net.IsConnectionReset(err) || apierrors.IsInternalError(err) || apierrors.IsTimeout(err) || apierrors.IsTooManyRequests(err) {
+			return false, nil
+		}
+		// if the error sends the Retry-After header, we respect it as an explicit confirmation we should retry.
+		if _, shouldRetry := apierrors.SuggestsClientDelay(err); shouldRetry {
+			return false, nil
+		}
+		if err != nil {
+			return false, err
+		}
+		return true, nil
+	})
+	return err
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/util/wsstream/conn.go b/metrics-server/vendor/k8s.io/apiserver/pkg/util/wsstream/conn.go
new file mode 100644
index 0000000..6f26b22
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/util/wsstream/conn.go
@@ -0,0 +1,352 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+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.
+*/
+
+package wsstream
+
+import (
+	"encoding/base64"
+	"fmt"
+	"io"
+	"net/http"
+	"regexp"
+	"strings"
+	"time"
+
+	"github.com/golang/glog"
+	"golang.org/x/net/websocket"
+
+	"k8s.io/apimachinery/pkg/util/runtime"
+)
+
+// The Websocket subprotocol "channel.k8s.io" prepends each binary message with a byte indicating
+// the channel number (zero indexed) the message was sent on. Messages in both directions should
+// prefix their messages with this channel byte. When used for remote execution, the channel numbers
+// are by convention defined to match the POSIX file-descriptors assigned to STDIN, STDOUT, and STDERR
+// (0, 1, and 2). No other conversion is performed on the raw subprotocol - writes are sent as they
+// are received by the server.
+//
+// Example client session:
+//
+//    CONNECT http://server.com with subprotocol "channel.k8s.io"
+//    WRITE []byte{0, 102, 111, 111, 10} # send "foo\n" on channel 0 (STDIN)
+//    READ  []byte{1, 10}                # receive "\n" on channel 1 (STDOUT)
+//    CLOSE
+//
+const ChannelWebSocketProtocol = "channel.k8s.io"
+
+// The Websocket subprotocol "base64.channel.k8s.io" base64 encodes each message with a character
+// indicating the channel number (zero indexed) the message was sent on. Messages in both directions
+// should prefix their messages with this channel char. When used for remote execution, the channel
+// numbers are by convention defined to match the POSIX file-descriptors assigned to STDIN, STDOUT,
+// and STDERR ('0', '1', and '2'). The data received on the server is base64 decoded (and must be
+// be valid) and data written by the server to the client is base64 encoded.
+//
+// Example client session:
+//
+//    CONNECT http://server.com with subprotocol "base64.channel.k8s.io"
+//    WRITE []byte{48, 90, 109, 57, 118, 67, 103, 111, 61} # send "foo\n" (base64: "Zm9vCgo=") on channel '0' (STDIN)
+//    READ  []byte{49, 67, 103, 61, 61} # receive "\n" (base64: "Cg==") on channel '1' (STDOUT)
+//    CLOSE
+//
+const Base64ChannelWebSocketProtocol = "base64.channel.k8s.io"
+
+type codecType int
+
+const (
+	rawCodec codecType = iota
+	base64Codec
+)
+
+type ChannelType int
+
+const (
+	IgnoreChannel ChannelType = iota
+	ReadChannel
+	WriteChannel
+	ReadWriteChannel
+)
+
+var (
+	// connectionUpgradeRegex matches any Connection header value that includes upgrade
+	connectionUpgradeRegex = regexp.MustCompile("(^|.*,\\s*)upgrade($|\\s*,)")
+)
+
+// IsWebSocketRequest returns true if the incoming request contains connection upgrade headers
+// for WebSockets.
+func IsWebSocketRequest(req *http.Request) bool {
+	if !strings.EqualFold(req.Header.Get("Upgrade"), "websocket") {
+		return false
+	}
+	return connectionUpgradeRegex.MatchString(strings.ToLower(req.Header.Get("Connection")))
+}
+
+// IgnoreReceives reads from a WebSocket until it is closed, then returns. If timeout is set, the
+// read and write deadlines are pushed every time a new message is received.
+func IgnoreReceives(ws *websocket.Conn, timeout time.Duration) {
+	defer runtime.HandleCrash()
+	var data []byte
+	for {
+		resetTimeout(ws, timeout)
+		if err := websocket.Message.Receive(ws, &data); err != nil {
+			return
+		}
+	}
+}
+
+// handshake ensures the provided user protocol matches one of the allowed protocols. It returns
+// no error if no protocol is specified.
+func handshake(config *websocket.Config, req *http.Request, allowed []string) error {
+	protocols := config.Protocol
+	if len(protocols) == 0 {
+		protocols = []string{""}
+	}
+
+	for _, protocol := range protocols {
+		for _, allow := range allowed {
+			if allow == protocol {
+				config.Protocol = []string{protocol}
+				return nil
+			}
+		}
+	}
+
+	return fmt.Errorf("requested protocol(s) are not supported: %v; supports %v", config.Protocol, allowed)
+}
+
+// ChannelProtocolConfig describes a websocket subprotocol with channels.
+type ChannelProtocolConfig struct {
+	Binary   bool
+	Channels []ChannelType
+}
+
+// NewDefaultChannelProtocols returns a channel protocol map with the
+// subprotocols "", "channel.k8s.io", "base64.channel.k8s.io" and the given
+// channels.
+func NewDefaultChannelProtocols(channels []ChannelType) map[string]ChannelProtocolConfig {
+	return map[string]ChannelProtocolConfig{
+		"": {Binary: true, Channels: channels},
+		ChannelWebSocketProtocol:       {Binary: true, Channels: channels},
+		Base64ChannelWebSocketProtocol: {Binary: false, Channels: channels},
+	}
+}
+
+// Conn supports sending multiple binary channels over a websocket connection.
+type Conn struct {
+	protocols        map[string]ChannelProtocolConfig
+	selectedProtocol string
+	channels         []*websocketChannel
+	codec            codecType
+	ready            chan struct{}
+	ws               *websocket.Conn
+	timeout          time.Duration
+}
+
+// NewConn creates a WebSocket connection that supports a set of channels. Channels begin each
+// web socket message with a single byte indicating the channel number (0-N). 255 is reserved for
+// future use. The channel types for each channel are passed as an array, supporting the different
+// duplex modes. Read and Write refer to whether the channel can be used as a Reader or Writer.
+//
+// The protocols parameter maps subprotocol names to ChannelProtocols. The empty string subprotocol
+// name is used if websocket.Config.Protocol is empty.
+func NewConn(protocols map[string]ChannelProtocolConfig) *Conn {
+	return &Conn{
+		ready:     make(chan struct{}),
+		protocols: protocols,
+	}
+}
+
+// SetIdleTimeout sets the interval for both reads and writes before timeout. If not specified,
+// there is no timeout on the connection.
+func (conn *Conn) SetIdleTimeout(duration time.Duration) {
+	conn.timeout = duration
+}
+
+// Open the connection and create channels for reading and writing. It returns
+// the selected subprotocol, a slice of channels and an error.
+func (conn *Conn) Open(w http.ResponseWriter, req *http.Request) (string, []io.ReadWriteCloser, error) {
+	go func() {
+		defer runtime.HandleCrash()
+		defer conn.Close()
+		websocket.Server{Handshake: conn.handshake, Handler: conn.handle}.ServeHTTP(w, req)
+	}()
+	<-conn.ready
+	rwc := make([]io.ReadWriteCloser, len(conn.channels))
+	for i := range conn.channels {
+		rwc[i] = conn.channels[i]
+	}
+	return conn.selectedProtocol, rwc, nil
+}
+
+func (conn *Conn) initialize(ws *websocket.Conn) {
+	negotiated := ws.Config().Protocol
+	conn.selectedProtocol = negotiated[0]
+	p := conn.protocols[conn.selectedProtocol]
+	if p.Binary {
+		conn.codec = rawCodec
+	} else {
+		conn.codec = base64Codec
+	}
+	conn.ws = ws
+	conn.channels = make([]*websocketChannel, len(p.Channels))
+	for i, t := range p.Channels {
+		switch t {
+		case ReadChannel:
+			conn.channels[i] = newWebsocketChannel(conn, byte(i), true, false)
+		case WriteChannel:
+			conn.channels[i] = newWebsocketChannel(conn, byte(i), false, true)
+		case ReadWriteChannel:
+			conn.channels[i] = newWebsocketChannel(conn, byte(i), true, true)
+		case IgnoreChannel:
+			conn.channels[i] = newWebsocketChannel(conn, byte(i), false, false)
+		}
+	}
+
+	close(conn.ready)
+}
+
+func (conn *Conn) handshake(config *websocket.Config, req *http.Request) error {
+	supportedProtocols := make([]string, 0, len(conn.protocols))
+	for p := range conn.protocols {
+		supportedProtocols = append(supportedProtocols, p)
+	}
+	return handshake(config, req, supportedProtocols)
+}
+
+func (conn *Conn) resetTimeout() {
+	if conn.timeout > 0 {
+		conn.ws.SetDeadline(time.Now().Add(conn.timeout))
+	}
+}
+
+// Close is only valid after Open has been called
+func (conn *Conn) Close() error {
+	<-conn.ready
+	for _, s := range conn.channels {
+		s.Close()
+	}
+	conn.ws.Close()
+	return nil
+}
+
+// handle implements a websocket handler.
+func (conn *Conn) handle(ws *websocket.Conn) {
+	defer conn.Close()
+	conn.initialize(ws)
+
+	for {
+		conn.resetTimeout()
+		var data []byte
+		if err := websocket.Message.Receive(ws, &data); err != nil {
+			if err != io.EOF {
+				glog.Errorf("Error on socket receive: %v", err)
+			}
+			break
+		}
+		if len(data) == 0 {
+			continue
+		}
+		channel := data[0]
+		if conn.codec == base64Codec {
+			channel = channel - '0'
+		}
+		data = data[1:]
+		if int(channel) >= len(conn.channels) {
+			glog.V(6).Infof("Frame is targeted for a reader %d that is not valid, possible protocol error", channel)
+			continue
+		}
+		if _, err := conn.channels[channel].DataFromSocket(data); err != nil {
+			glog.Errorf("Unable to write frame to %d: %v\n%s", channel, err, string(data))
+			continue
+		}
+	}
+}
+
+// write multiplexes the specified channel onto the websocket
+func (conn *Conn) write(num byte, data []byte) (int, error) {
+	conn.resetTimeout()
+	switch conn.codec {
+	case rawCodec:
+		frame := make([]byte, len(data)+1)
+		frame[0] = num
+		copy(frame[1:], data)
+		if err := websocket.Message.Send(conn.ws, frame); err != nil {
+			return 0, err
+		}
+	case base64Codec:
+		frame := string('0'+num) + base64.StdEncoding.EncodeToString(data)
+		if err := websocket.Message.Send(conn.ws, frame); err != nil {
+			return 0, err
+		}
+	}
+	return len(data), nil
+}
+
+// websocketChannel represents a channel in a connection
+type websocketChannel struct {
+	conn *Conn
+	num  byte
+	r    io.Reader
+	w    io.WriteCloser
+
+	read, write bool
+}
+
+// newWebsocketChannel creates a pipe for writing to a websocket. Do not write to this pipe
+// prior to the connection being opened. It may be no, half, or full duplex depending on
+// read and write.
+func newWebsocketChannel(conn *Conn, num byte, read, write bool) *websocketChannel {
+	r, w := io.Pipe()
+	return &websocketChannel{conn, num, r, w, read, write}
+}
+
+func (p *websocketChannel) Write(data []byte) (int, error) {
+	if !p.write {
+		return len(data), nil
+	}
+	return p.conn.write(p.num, data)
+}
+
+// DataFromSocket is invoked by the connection receiver to move data from the connection
+// into a specific channel.
+func (p *websocketChannel) DataFromSocket(data []byte) (int, error) {
+	if !p.read {
+		return len(data), nil
+	}
+
+	switch p.conn.codec {
+	case rawCodec:
+		return p.w.Write(data)
+	case base64Codec:
+		dst := make([]byte, len(data))
+		n, err := base64.StdEncoding.Decode(dst, data)
+		if err != nil {
+			return 0, err
+		}
+		return p.w.Write(dst[:n])
+	}
+	return 0, nil
+}
+
+func (p *websocketChannel) Read(data []byte) (int, error) {
+	if !p.read {
+		return 0, io.EOF
+	}
+	return p.r.Read(data)
+}
+
+func (p *websocketChannel) Close() error {
+	return p.w.Close()
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/util/wsstream/doc.go b/metrics-server/vendor/k8s.io/apiserver/pkg/util/wsstream/doc.go
new file mode 100644
index 0000000..694ce81
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/util/wsstream/doc.go
@@ -0,0 +1,21 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+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.
+*/
+
+// Package wsstream contains utilities for streaming content over WebSockets.
+// The Conn type allows callers to multiplex multiple read/write channels over
+// a single websocket. The Reader type allows an io.Reader to be copied over
+// a websocket channel as binary content.
+package wsstream // import "k8s.io/apiserver/pkg/util/wsstream"
diff --git a/metrics-server/vendor/k8s.io/apiserver/pkg/util/wsstream/stream.go b/metrics-server/vendor/k8s.io/apiserver/pkg/util/wsstream/stream.go
new file mode 100644
index 0000000..9dd165b
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/pkg/util/wsstream/stream.go
@@ -0,0 +1,177 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+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.
+*/
+
+package wsstream
+
+import (
+	"encoding/base64"
+	"io"
+	"net/http"
+	"sync"
+	"time"
+
+	"golang.org/x/net/websocket"
+
+	"k8s.io/apimachinery/pkg/util/runtime"
+)
+
+// The WebSocket subprotocol "binary.k8s.io" will only send messages to the
+// client and ignore messages sent to the server. The received messages are
+// the exact bytes written to the stream. Zero byte messages are possible.
+const binaryWebSocketProtocol = "binary.k8s.io"
+
+// The WebSocket subprotocol "base64.binary.k8s.io" will only send messages to the
+// client and ignore messages sent to the server. The received messages are
+// a base64 version of the bytes written to the stream. Zero byte messages are
+// possible.
+const base64BinaryWebSocketProtocol = "base64.binary.k8s.io"
+
+// ReaderProtocolConfig describes a websocket subprotocol with one stream.
+type ReaderProtocolConfig struct {
+	Binary bool
+}
+
+// NewDefaultReaderProtocols returns a stream protocol map with the
+// subprotocols "", "channel.k8s.io", "base64.channel.k8s.io".
+func NewDefaultReaderProtocols() map[string]ReaderProtocolConfig {
+	return map[string]ReaderProtocolConfig{
+		"": {Binary: true},
+		binaryWebSocketProtocol:       {Binary: true},
+		base64BinaryWebSocketProtocol: {Binary: false},
+	}
+}
+
+// Reader supports returning an arbitrary byte stream over a websocket channel.
+type Reader struct {
+	err              chan error
+	r                io.Reader
+	ping             bool
+	timeout          time.Duration
+	protocols        map[string]ReaderProtocolConfig
+	selectedProtocol string
+
+	handleCrash func() // overridable for testing
+}
+
+// NewReader creates a WebSocket pipe that will copy the contents of r to a provided
+// WebSocket connection. If ping is true, a zero length message will be sent to the client
+// before the stream begins reading.
+//
+// The protocols parameter maps subprotocol names to StreamProtocols. The empty string
+// subprotocol name is used if websocket.Config.Protocol is empty.
+func NewReader(r io.Reader, ping bool, protocols map[string]ReaderProtocolConfig) *Reader {
+	return &Reader{
+		r:           r,
+		err:         make(chan error),
+		ping:        ping,
+		protocols:   protocols,
+		handleCrash: func() { runtime.HandleCrash() },
+	}
+}
+
+// SetIdleTimeout sets the interval for both reads and writes before timeout. If not specified,
+// there is no timeout on the reader.
+func (r *Reader) SetIdleTimeout(duration time.Duration) {
+	r.timeout = duration
+}
+
+func (r *Reader) handshake(config *websocket.Config, req *http.Request) error {
+	supportedProtocols := make([]string, 0, len(r.protocols))
+	for p := range r.protocols {
+		supportedProtocols = append(supportedProtocols, p)
+	}
+	return handshake(config, req, supportedProtocols)
+}
+
+// Copy the reader to the response. The created WebSocket is closed after this
+// method completes.
+func (r *Reader) Copy(w http.ResponseWriter, req *http.Request) error {
+	go func() {
+		defer r.handleCrash()
+		websocket.Server{Handshake: r.handshake, Handler: r.handle}.ServeHTTP(w, req)
+	}()
+	return <-r.err
+}
+
+// handle implements a WebSocket handler.
+func (r *Reader) handle(ws *websocket.Conn) {
+	// Close the connection when the client requests it, or when we finish streaming, whichever happens first
+	closeConnOnce := &sync.Once{}
+	closeConn := func() {
+		closeConnOnce.Do(func() {
+			ws.Close()
+		})
+	}
+
+	negotiated := ws.Config().Protocol
+	r.selectedProtocol = negotiated[0]
+	defer close(r.err)
+	defer closeConn()
+
+	go func() {
+		defer runtime.HandleCrash()
+		// This blocks until the connection is closed.
+		// Client should not send anything.
+		IgnoreReceives(ws, r.timeout)
+		// Once the client closes, we should also close
+		closeConn()
+	}()
+
+	r.err <- messageCopy(ws, r.r, !r.protocols[r.selectedProtocol].Binary, r.ping, r.timeout)
+}
+
+func resetTimeout(ws *websocket.Conn, timeout time.Duration) {
+	if timeout > 0 {
+		ws.SetDeadline(time.Now().Add(timeout))
+	}
+}
+
+func messageCopy(ws *websocket.Conn, r io.Reader, base64Encode, ping bool, timeout time.Duration) error {
+	buf := make([]byte, 2048)
+	if ping {
+		resetTimeout(ws, timeout)
+		if base64Encode {
+			if err := websocket.Message.Send(ws, ""); err != nil {
+				return err
+			}
+		} else {
+			if err := websocket.Message.Send(ws, []byte{}); err != nil {
+				return err
+			}
+		}
+	}
+	for {
+		resetTimeout(ws, timeout)
+		n, err := r.Read(buf)
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		if n > 0 {
+			if base64Encode {
+				if err := websocket.Message.Send(ws, base64.StdEncoding.EncodeToString(buf[:n])); err != nil {
+					return err
+				}
+			} else {
+				if err := websocket.Message.Send(ws, buf[:n]); err != nil {
+					return err
+				}
+			}
+		}
+	}
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/plugin/pkg/audit/buffered/buffered.go b/metrics-server/vendor/k8s.io/apiserver/plugin/pkg/audit/buffered/buffered.go
new file mode 100644
index 0000000..f50e5ad
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/plugin/pkg/audit/buffered/buffered.go
@@ -0,0 +1,284 @@
+/*
+Copyright 2018 The Kubernetes Authors.
+
+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.
+*/
+
+package buffered
+
+import (
+	"fmt"
+	"sync"
+	"time"
+
+	"k8s.io/apimachinery/pkg/util/runtime"
+	"k8s.io/apimachinery/pkg/util/wait"
+	auditinternal "k8s.io/apiserver/pkg/apis/audit"
+	"k8s.io/apiserver/pkg/audit"
+	"k8s.io/client-go/util/flowcontrol"
+)
+
+// PluginName is the name reported in error metrics.
+const PluginName = "buffered"
+
+const (
+	// Default configuration values for ModeBatch.
+	defaultBatchBufferSize = 10000            // Buffer up to 10000 events before starting discarding.
+	defaultBatchMaxSize    = 400              // Only send up to 400 events at a time.
+	defaultBatchMaxWait    = 30 * time.Second // Send events at least twice a minute.
+
+	defaultBatchThrottleQPS   = 10 // Limit the send rate by 10 QPS.
+	defaultBatchThrottleBurst = 15 // Allow up to 15 QPS burst.
+)
+
+// BatchConfig represents batching delegate audit backend configuration.
+type BatchConfig struct {
+	// BufferSize defines a size of the buffering queue.
+	BufferSize int
+	// MaxBatchSize defines maximum size of a batch.
+	MaxBatchSize int
+	// MaxBatchWait indicates the maximum interval between two batches.
+	MaxBatchWait time.Duration
+
+	// ThrottleEnable defines whether throttling will be applied to the batching process.
+	ThrottleEnable bool
+	// ThrottleQPS defines the allowed rate of batches per second sent to the delegate backend.
+	ThrottleQPS float32
+	// ThrottleBurst defines the maximum number of requests sent to the delegate backend at the same moment in case
+	// the capacity defined by ThrottleQPS was not utilized.
+	ThrottleBurst int
+}
+
+// NewDefaultBatchConfig returns new Config objects populated by default values.
+func NewDefaultBatchConfig() BatchConfig {
+	return BatchConfig{
+		BufferSize:   defaultBatchBufferSize,
+		MaxBatchSize: defaultBatchMaxSize,
+		MaxBatchWait: defaultBatchMaxWait,
+
+		ThrottleEnable: true,
+		ThrottleQPS:    defaultBatchThrottleQPS,
+		ThrottleBurst:  defaultBatchThrottleBurst,
+	}
+}
+
+type bufferedBackend struct {
+	// The delegate backend that actually exports events.
+	delegateBackend audit.Backend
+
+	// Channel to buffer events before sending to the delegate backend.
+	buffer chan *auditinternal.Event
+	// Maximum number of events in a batch sent to the delegate backend.
+	maxBatchSize int
+	// Amount of time to wait after sending a batch to the delegate backend before sending another one.
+	//
+	// Receiving maxBatchSize events will always trigger sending a batch, regardless of the amount of time passed.
+	maxBatchWait time.Duration
+
+	// Channel to signal that the batching routine has processed all remaining events and exited.
+	// Once `shutdownCh` is closed no new events will be sent to the delegate backend.
+	shutdownCh chan struct{}
+
+	// WaitGroup to control the concurrency of sending batches to the delegate backend.
+	// Worker routine calls Add before sending a batch and
+	// then spawns a routine that calls Done after batch was processed by the delegate backend.
+	// This WaitGroup is used to wait for all sending routines to finish before shutting down audit backend.
+	wg sync.WaitGroup
+
+	// Limits the number of batches sent to the delegate backend per second.
+	throttle flowcontrol.RateLimiter
+}
+
+var _ audit.Backend = &bufferedBackend{}
+
+// NewBackend returns a buffered audit backend that wraps delegate backend.
+// Buffered backend automatically runs and shuts down the delegate backend.
+func NewBackend(delegate audit.Backend, config BatchConfig) audit.Backend {
+	var throttle flowcontrol.RateLimiter
+	if config.ThrottleEnable {
+		throttle = flowcontrol.NewTokenBucketRateLimiter(config.ThrottleQPS, config.ThrottleBurst)
+	}
+	return &bufferedBackend{
+		delegateBackend: delegate,
+		buffer:          make(chan *auditinternal.Event, config.BufferSize),
+		maxBatchSize:    config.MaxBatchSize,
+		maxBatchWait:    config.MaxBatchWait,
+		shutdownCh:      make(chan struct{}),
+		wg:              sync.WaitGroup{},
+		throttle:        throttle,
+	}
+}
+
+func (b *bufferedBackend) Run(stopCh <-chan struct{}) error {
+	go func() {
+		// Signal that the working routine has exited.
+		defer close(b.shutdownCh)
+
+		b.processIncomingEvents(stopCh)
+
+		// Handle the events that were received after the last buffer
+		// scraping and before this line. Since the buffer is closed, no new
+		// events will come through.
+		allEventsProcessed := false
+		timer := make(chan time.Time)
+		for !allEventsProcessed {
+			allEventsProcessed = func() bool {
+				// Recover from any panic in order to try to process all remaining events.
+				// Note, that in case of a panic, the return value will be false and
+				// the loop execution will continue.
+				defer runtime.HandleCrash()
+
+				events := b.collectEvents(timer, wait.NeverStop)
+				b.processEvents(events)
+				return len(events) == 0
+			}()
+		}
+	}()
+	return b.delegateBackend.Run(stopCh)
+}
+
+// Shutdown blocks until stopCh passed to the Run method is closed and all
+// events added prior to that moment are batched and sent to the delegate backend.
+func (b *bufferedBackend) Shutdown() {
+	// Wait until the routine spawned in Run method exits.
+	<-b.shutdownCh
+
+	// Wait until all sending routines exit.
+	//
+	// - When b.shutdownCh is closed, we know that the goroutine in Run has terminated.
+	// - This means that processIncomingEvents has terminated.
+	// - Which means that b.buffer is closed and cannot accept any new events anymore.
+	// - Because processEvents is called synchronously from the Run goroutine, the waitgroup has its final value.
+	// Hence wg.Wait will not miss any more outgoing batches.
+	b.wg.Wait()
+
+	b.delegateBackend.Shutdown()
+}
+
+// processIncomingEvents runs a loop that collects events from the buffer. When
+// b.stopCh is closed, processIncomingEvents stops and closes the buffer.
+func (b *bufferedBackend) processIncomingEvents(stopCh <-chan struct{}) {
+	defer close(b.buffer)
+	t := time.NewTimer(b.maxBatchWait)
+	defer t.Stop()
+
+	for {
+		func() {
+			// Recover from any panics caused by this function so a panic in the
+			// goroutine can't bring down the main routine.
+			defer runtime.HandleCrash()
+
+			t.Reset(b.maxBatchWait)
+			b.processEvents(b.collectEvents(t.C, stopCh))
+		}()
+
+		select {
+		case <-stopCh:
+			return
+		default:
+		}
+	}
+}
+
+// collectEvents attempts to collect some number of events in a batch.
+//
+// The following things can cause collectEvents to stop and return the list
+// of events:
+//
+//   * Maximum number of events for a batch.
+//   * Timer has passed.
+//   * Buffer channel is closed and empty.
+//   * stopCh is closed.
+func (b *bufferedBackend) collectEvents(timer <-chan time.Time, stopCh <-chan struct{}) []*auditinternal.Event {
+	var events []*auditinternal.Event
+
+L:
+	for i := 0; i < b.maxBatchSize; i++ {
+		select {
+		case ev, ok := <-b.buffer:
+			// Buffer channel was closed and no new events will follow.
+			if !ok {
+				break L
+			}
+			events = append(events, ev)
+		case <-timer:
+			// Timer has expired. Send currently accumulated batch.
+			break L
+		case <-stopCh:
+			// Backend has been stopped. Send currently accumulated batch.
+			break L
+		}
+	}
+
+	return events
+}
+
+// processEvents process the batch events in a goroutine using delegateBackend's ProcessEvents.
+func (b *bufferedBackend) processEvents(events []*auditinternal.Event) {
+	if len(events) == 0 {
+		return
+	}
+
+	// TODO(audit): Should control the number of active goroutines
+	// if one goroutine takes 5 seconds to finish, the number of goroutines can be 5 * defaultBatchThrottleQPS
+	if b.throttle != nil {
+		b.throttle.Accept()
+	}
+
+	b.wg.Add(1)
+	go func() {
+		defer b.wg.Done()
+		defer runtime.HandleCrash()
+
+		// Execute the real processing in a goroutine to keep it from blocking.
+		// This lets the batching routine continue draining the queue immediately.
+		b.delegateBackend.ProcessEvents(events...)
+	}()
+}
+
+func (b *bufferedBackend) ProcessEvents(ev ...*auditinternal.Event) {
+	// The following mechanism is in place to support the situation when audit
+	// events are still coming after the backend was stopped.
+	var sendErr error
+	var evIndex int
+
+	// If the delegateBackend was shutdown and the buffer channel was closed, an
+	// attempt to add an event to it will result in panic that we should
+	// recover from.
+	defer func() {
+		if err := recover(); err != nil {
+			sendErr = fmt.Errorf("audit backend shut down")
+		}
+		if sendErr != nil {
+			audit.HandlePluginError(PluginName, sendErr, ev[evIndex:]...)
+		}
+	}()
+
+	for i, e := range ev {
+		evIndex = i
+		// Per the audit.Backend interface these events are reused after being
+		// sent to the Sink. Deep copy and send the copy to the queue.
+		event := e.DeepCopy()
+
+		select {
+		case b.buffer <- event:
+		default:
+			sendErr = fmt.Errorf("audit buffer queue blocked")
+			return
+		}
+	}
+}
+
+func (b *bufferedBackend) String() string {
+	return fmt.Sprintf("%s<%s>", PluginName, b.delegateBackend)
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/plugin/pkg/audit/buffered/doc.go b/metrics-server/vendor/k8s.io/apiserver/plugin/pkg/audit/buffered/doc.go
new file mode 100644
index 0000000..a82599e
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/plugin/pkg/audit/buffered/doc.go
@@ -0,0 +1,19 @@
+/*
+Copyright 2018 The Kubernetes Authors.
+
+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.
+*/
+
+// Package buffered provides an implementation for the audit.Backend interface
+// that batches incoming audit events and sends batches to the delegate audit.Backend.
+package buffered // import "k8s.io/apiserver/plugin/pkg/audit/buffered"
diff --git a/metrics-server/vendor/k8s.io/apiserver/plugin/pkg/audit/log/backend.go b/metrics-server/vendor/k8s.io/apiserver/plugin/pkg/audit/log/backend.go
new file mode 100644
index 0000000..293cdd3
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/plugin/pkg/audit/log/backend.go
@@ -0,0 +1,100 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+package log
+
+import (
+	"fmt"
+	"io"
+	"strings"
+
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	auditinternal "k8s.io/apiserver/pkg/apis/audit"
+	"k8s.io/apiserver/pkg/audit"
+)
+
+const (
+	// FormatLegacy saves event in 1-line text format.
+	FormatLegacy = "legacy"
+	// FormatJson saves event in structured json format.
+	FormatJson = "json"
+
+	// PluginName is the name of this plugin, to be used in help and logs.
+	PluginName = "log"
+)
+
+// AllowedFormats are the formats known by log backend.
+var AllowedFormats = []string{
+	FormatLegacy,
+	FormatJson,
+}
+
+type backend struct {
+	out          io.Writer
+	format       string
+	groupVersion schema.GroupVersion
+}
+
+var _ audit.Backend = &backend{}
+
+func NewBackend(out io.Writer, format string, groupVersion schema.GroupVersion) audit.Backend {
+	return &backend{
+		out:          out,
+		format:       format,
+		groupVersion: groupVersion,
+	}
+}
+
+func (b *backend) ProcessEvents(events ...*auditinternal.Event) {
+	for _, ev := range events {
+		b.logEvent(ev)
+	}
+}
+
+func (b *backend) logEvent(ev *auditinternal.Event) {
+	line := ""
+	switch b.format {
+	case FormatLegacy:
+		line = audit.EventString(ev) + "\n"
+	case FormatJson:
+		bs, err := runtime.Encode(audit.Codecs.LegacyCodec(b.groupVersion), ev)
+		if err != nil {
+			audit.HandlePluginError(PluginName, err, ev)
+			return
+		}
+		line = string(bs[:])
+	default:
+		audit.HandlePluginError(PluginName, fmt.Errorf("log format %q is not in list of known formats (%s)",
+			b.format, strings.Join(AllowedFormats, ",")), ev)
+		return
+	}
+	if _, err := fmt.Fprint(b.out, line); err != nil {
+		audit.HandlePluginError(PluginName, err, ev)
+	}
+}
+
+func (b *backend) Run(stopCh <-chan struct{}) error {
+	return nil
+}
+
+func (b *backend) Shutdown() {
+	// Nothing to do here.
+}
+
+func (b *backend) String() string {
+	return PluginName
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/plugin/pkg/audit/truncate/doc.go b/metrics-server/vendor/k8s.io/apiserver/plugin/pkg/audit/truncate/doc.go
new file mode 100644
index 0000000..9392ac3
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/plugin/pkg/audit/truncate/doc.go
@@ -0,0 +1,19 @@
+/*
+Copyright 2018 The Kubernetes Authors.
+
+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.
+*/
+
+// Package truncate provides an implementation for the audit.Backend interface
+// that truncates audit events and sends them to the delegate audit.Backend.
+package truncate // import "k8s.io/apiserver/plugin/pkg/audit/truncate"
diff --git a/metrics-server/vendor/k8s.io/apiserver/plugin/pkg/audit/truncate/truncate.go b/metrics-server/vendor/k8s.io/apiserver/plugin/pkg/audit/truncate/truncate.go
new file mode 100644
index 0000000..e06f1f2
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/plugin/pkg/audit/truncate/truncate.go
@@ -0,0 +1,158 @@
+/*
+Copyright 2018 The Kubernetes Authors.
+
+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.
+*/
+
+package truncate
+
+import (
+	"fmt"
+
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	utilerrors "k8s.io/apimachinery/pkg/util/errors"
+	auditinternal "k8s.io/apiserver/pkg/apis/audit"
+	"k8s.io/apiserver/pkg/audit"
+)
+
+const (
+	// PluginName is the name reported in error metrics.
+	PluginName = "truncate"
+
+	// annotationKey defines the name of the annotation used to indicate truncation.
+	annotationKey = "audit.k8s.io/truncated"
+	// annotationValue defines the value of the annotation used to indicate truncation.
+	annotationValue = "true"
+)
+
+// Config represents truncating backend configuration.
+type Config struct {
+	// MaxEventSize defines max allowed size of the event. If the event is larger,
+	// truncating will be performed.
+	MaxEventSize int64
+
+	// MaxBatchSize defined max allowed size of the batch of events, passed to the backend.
+	// If the total size of the batch is larger than this number, batch will be split. Actual
+	// size of the serialized request might be slightly higher, on the order of hundreds of bytes.
+	MaxBatchSize int64
+}
+
+type backend struct {
+	// The delegate backend that actually exports events.
+	delegateBackend audit.Backend
+
+	// Configuration used for truncation.
+	c Config
+
+	// Encoder used to calculate audit event sizes.
+	e runtime.Encoder
+}
+
+var _ audit.Backend = &backend{}
+
+// NewBackend returns a new truncating backend, using configuration passed in the parameters.
+// Truncate backend automatically runs and shut downs the delegate backend.
+func NewBackend(delegateBackend audit.Backend, config Config, groupVersion schema.GroupVersion) audit.Backend {
+	return &backend{
+		delegateBackend: delegateBackend,
+		c:               config,
+		e:               audit.Codecs.LegacyCodec(groupVersion),
+	}
+}
+
+func (b *backend) ProcessEvents(events ...*auditinternal.Event) {
+	var errors []error
+	var impacted []*auditinternal.Event
+	var batch []*auditinternal.Event
+	var batchSize int64
+	for _, event := range events {
+		size, err := b.calcSize(event)
+		// If event was correctly serialized, but the size is more than allowed
+		// and it makes sense to do trimming, i.e. there's a request and/or
+		// response present, try to strip away request and response.
+		if err == nil && size > b.c.MaxEventSize && event.Level.GreaterOrEqual(auditinternal.LevelRequest) {
+			event = truncate(event)
+			size, err = b.calcSize(event)
+		}
+		if err != nil {
+			errors = append(errors, err)
+			impacted = append(impacted, event)
+			continue
+		}
+		if size > b.c.MaxEventSize {
+			errors = append(errors, fmt.Errorf("event is too large even after truncating"))
+			impacted = append(impacted, event)
+			continue
+		}
+
+		if len(batch) > 0 && batchSize+size > b.c.MaxBatchSize {
+			b.delegateBackend.ProcessEvents(batch...)
+			batch = []*auditinternal.Event{}
+			batchSize = 0
+		}
+
+		batchSize += size
+		batch = append(batch, event)
+	}
+
+	if len(batch) > 0 {
+		b.delegateBackend.ProcessEvents(batch...)
+	}
+
+	if len(impacted) > 0 {
+		audit.HandlePluginError(PluginName, utilerrors.NewAggregate(errors), impacted...)
+	}
+}
+
+// truncate removed request and response objects from the audit events,
+// to try and keep at least metadata.
+func truncate(e *auditinternal.Event) *auditinternal.Event {
+	// Make a shallow copy to avoid copying response/request objects.
+	newEvent := &auditinternal.Event{}
+	*newEvent = *e
+
+	newEvent.RequestObject = nil
+	newEvent.ResponseObject = nil
+	audit.LogAnnotation(newEvent, annotationKey, annotationValue)
+	return newEvent
+}
+
+func (b *backend) Run(stopCh <-chan struct{}) error {
+	return b.delegateBackend.Run(stopCh)
+}
+
+func (b *backend) Shutdown() {
+	b.delegateBackend.Shutdown()
+}
+
+func (b *backend) calcSize(e *auditinternal.Event) (int64, error) {
+	s := &sizer{}
+	if err := b.e.Encode(e, s); err != nil {
+		return 0, err
+	}
+	return s.Size, nil
+}
+
+func (b *backend) String() string {
+	return fmt.Sprintf("%s<%s>", PluginName, b.delegateBackend)
+}
+
+type sizer struct {
+	Size int64
+}
+
+func (s *sizer) Write(p []byte) (n int, err error) {
+	s.Size += int64(len(p))
+	return len(p), nil
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/plugin/pkg/audit/webhook/webhook.go b/metrics-server/vendor/k8s.io/apiserver/plugin/pkg/audit/webhook/webhook.go
new file mode 100644
index 0000000..80b4842
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/plugin/pkg/audit/webhook/webhook.go
@@ -0,0 +1,88 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+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.
+*/
+
+// Package webhook implements the audit.Backend interface using HTTP webhooks.
+package webhook
+
+import (
+	"time"
+
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	auditinternal "k8s.io/apiserver/pkg/apis/audit"
+	"k8s.io/apiserver/pkg/apis/audit/install"
+	"k8s.io/apiserver/pkg/audit"
+	"k8s.io/apiserver/pkg/util/webhook"
+	"k8s.io/client-go/rest"
+)
+
+const (
+	// PluginName is the name of this plugin, to be used in help and logs.
+	PluginName = "webhook"
+
+	// DefaultInitialBackoff is the default amount of time to wait before
+	// retrying sending audit events through a webhook.
+	DefaultInitialBackoff = 10 * time.Second
+)
+
+func init() {
+	install.Install(audit.Scheme)
+}
+
+func loadWebhook(configFile string, groupVersion schema.GroupVersion, initialBackoff time.Duration) (*webhook.GenericWebhook, error) {
+	return webhook.NewGenericWebhook(audit.Scheme, audit.Codecs, configFile,
+		[]schema.GroupVersion{groupVersion}, initialBackoff)
+}
+
+type backend struct {
+	w *webhook.GenericWebhook
+}
+
+// NewBackend returns an audit backend that sends events over HTTP to an external service.
+func NewBackend(kubeConfigFile string, groupVersion schema.GroupVersion, initialBackoff time.Duration) (audit.Backend, error) {
+	w, err := loadWebhook(kubeConfigFile, groupVersion, initialBackoff)
+	if err != nil {
+		return nil, err
+	}
+	return &backend{w}, nil
+}
+
+func (b *backend) Run(stopCh <-chan struct{}) error {
+	return nil
+}
+
+func (b *backend) Shutdown() {
+	// nothing to do here
+}
+
+func (b *backend) ProcessEvents(ev ...*auditinternal.Event) {
+	if err := b.processEvents(ev...); err != nil {
+		audit.HandlePluginError(PluginName, err, ev...)
+	}
+}
+
+func (b *backend) processEvents(ev ...*auditinternal.Event) error {
+	var list auditinternal.EventList
+	for _, e := range ev {
+		list.Items = append(list.Items, *e)
+	}
+	return b.w.WithExponentialBackoff(func() rest.Result {
+		return b.w.RestClient.Post().Body(&list).Do()
+	}).Error()
+}
+
+func (b *backend) String() string {
+	return PluginName
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/webhook/webhook.go b/metrics-server/vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/webhook/webhook.go
new file mode 100644
index 0000000..7aa1c0c
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/plugin/pkg/authenticator/token/webhook/webhook.go
@@ -0,0 +1,139 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+// Package webhook implements the authenticator.Token interface using HTTP webhooks.
+package webhook
+
+import (
+	"time"
+
+	"github.com/golang/glog"
+
+	authentication "k8s.io/api/authentication/v1beta1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apimachinery/pkg/util/cache"
+	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
+	"k8s.io/apiserver/pkg/authentication/authenticator"
+	"k8s.io/apiserver/pkg/authentication/user"
+	"k8s.io/apiserver/pkg/util/webhook"
+	"k8s.io/client-go/kubernetes/scheme"
+	authenticationclient "k8s.io/client-go/kubernetes/typed/authentication/v1beta1"
+)
+
+var (
+	groupVersions = []schema.GroupVersion{authentication.SchemeGroupVersion}
+)
+
+const retryBackoff = 500 * time.Millisecond
+
+// Ensure WebhookTokenAuthenticator implements the authenticator.Token interface.
+var _ authenticator.Token = (*WebhookTokenAuthenticator)(nil)
+
+type WebhookTokenAuthenticator struct {
+	tokenReview    authenticationclient.TokenReviewInterface
+	responseCache  *cache.LRUExpireCache
+	ttl            time.Duration
+	initialBackoff time.Duration
+}
+
+// NewFromInterface creates a webhook authenticator using the given tokenReview client
+func NewFromInterface(tokenReview authenticationclient.TokenReviewInterface, ttl time.Duration) (*WebhookTokenAuthenticator, error) {
+	return newWithBackoff(tokenReview, ttl, retryBackoff)
+}
+
+// New creates a new WebhookTokenAuthenticator from the provided kubeconfig file.
+func New(kubeConfigFile string, ttl time.Duration) (*WebhookTokenAuthenticator, error) {
+	tokenReview, err := tokenReviewInterfaceFromKubeconfig(kubeConfigFile)
+	if err != nil {
+		return nil, err
+	}
+	return newWithBackoff(tokenReview, ttl, retryBackoff)
+}
+
+// newWithBackoff allows tests to skip the sleep.
+func newWithBackoff(tokenReview authenticationclient.TokenReviewInterface, ttl, initialBackoff time.Duration) (*WebhookTokenAuthenticator, error) {
+	return &WebhookTokenAuthenticator{tokenReview, cache.NewLRUExpireCache(1024), ttl, initialBackoff}, nil
+}
+
+// AuthenticateToken implements the authenticator.Token interface.
+func (w *WebhookTokenAuthenticator) AuthenticateToken(token string) (user.Info, bool, error) {
+	r := &authentication.TokenReview{
+		Spec: authentication.TokenReviewSpec{Token: token},
+	}
+	if entry, ok := w.responseCache.Get(r.Spec); ok {
+		r.Status = entry.(authentication.TokenReviewStatus)
+	} else {
+		var (
+			result *authentication.TokenReview
+			err    error
+		)
+		webhook.WithExponentialBackoff(w.initialBackoff, func() error {
+			result, err = w.tokenReview.Create(r)
+			return err
+		})
+		if err != nil {
+			// An error here indicates bad configuration or an outage. Log for debugging.
+			glog.Errorf("Failed to make webhook authenticator request: %v", err)
+			return nil, false, err
+		}
+		r.Status = result.Status
+		w.responseCache.Add(r.Spec, result.Status, w.ttl)
+	}
+	if !r.Status.Authenticated {
+		return nil, false, nil
+	}
+
+	var extra map[string][]string
+	if r.Status.User.Extra != nil {
+		extra = map[string][]string{}
+		for k, v := range r.Status.User.Extra {
+			extra[k] = v
+		}
+	}
+
+	return &user.DefaultInfo{
+		Name:   r.Status.User.Username,
+		UID:    r.Status.User.UID,
+		Groups: r.Status.User.Groups,
+		Extra:  extra,
+	}, true, nil
+}
+
+// tokenReviewInterfaceFromKubeconfig builds a client from the specified kubeconfig file,
+// and returns a TokenReviewInterface that uses that client. Note that the client submits TokenReview
+// requests to the exact path specified in the kubeconfig file, so arbitrary non-API servers can be targeted.
+func tokenReviewInterfaceFromKubeconfig(kubeConfigFile string) (authenticationclient.TokenReviewInterface, error) {
+	localScheme := runtime.NewScheme()
+	scheme.AddToScheme(localScheme)
+	utilruntime.Must(localScheme.SetVersionPriority(groupVersions...))
+
+	gw, err := webhook.NewGenericWebhook(localScheme, scheme.Codecs, kubeConfigFile, groupVersions, 0)
+	if err != nil {
+		return nil, err
+	}
+	return &tokenReviewClient{gw}, nil
+}
+
+type tokenReviewClient struct {
+	w *webhook.GenericWebhook
+}
+
+func (t *tokenReviewClient) Create(tokenReview *authentication.TokenReview) (*authentication.TokenReview, error) {
+	result := &authentication.TokenReview{}
+	err := t.w.RestClient.Post().Body(tokenReview).Do().Into(result)
+	return result, err
+}
diff --git a/metrics-server/vendor/k8s.io/apiserver/plugin/pkg/authorizer/webhook/gencerts.sh b/metrics-server/vendor/k8s.io/apiserver/plugin/pkg/authorizer/webhook/gencerts.sh
new file mode 100755
index 0000000..1e5fb1f
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/plugin/pkg/authorizer/webhook/gencerts.sh
@@ -0,0 +1,102 @@
+#!/usr/bin/env bash
+
+# Copyright 2016 The Kubernetes Authors.
+#
+# 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.
+
+set -e
+
+# gencerts.sh generates the certificates for the webhook authz plugin tests.
+# 
+# It is not expected to be run often (there is no go generate rule), and mainly
+# exists for documentation purposes.
+
+cat > server.conf << EOF
+[req]
+req_extensions = v3_req
+distinguished_name = req_distinguished_name
+[req_distinguished_name]
+[ v3_req ]
+basicConstraints = CA:FALSE
+keyUsage = nonRepudiation, digitalSignature, keyEncipherment
+extendedKeyUsage = serverAuth
+subjectAltName = @alt_names
+[alt_names]
+IP.1 = 127.0.0.1
+EOF
+
+cat > client.conf << EOF
+[req]
+req_extensions = v3_req
+distinguished_name = req_distinguished_name
+[req_distinguished_name]
+[ v3_req ]
+basicConstraints = CA:FALSE
+keyUsage = nonRepudiation, digitalSignature, keyEncipherment
+extendedKeyUsage = clientAuth
+EOF
+
+# Create a certificate authority
+openssl genrsa -out caKey.pem 2048
+openssl req -x509 -new -nodes -key caKey.pem -days 100000 -out caCert.pem -subj "/CN=webhook_authz_ca"
+
+# Create a second certificate authority
+openssl genrsa -out badCAKey.pem 2048
+openssl req -x509 -new -nodes -key badCAKey.pem -days 100000 -out badCACert.pem -subj "/CN=webhook_authz_ca"
+
+# Create a server certiticate
+openssl genrsa -out serverKey.pem 2048
+openssl req -new -key serverKey.pem -out server.csr -subj "/CN=webhook_authz_server" -config server.conf
+openssl x509 -req -in server.csr -CA caCert.pem -CAkey caKey.pem -CAcreateserial -out serverCert.pem -days 100000 -extensions v3_req -extfile server.conf
+
+# Create a client certiticate
+openssl genrsa -out clientKey.pem 2048
+openssl req -new -key clientKey.pem -out client.csr -subj "/CN=webhook_authz_client" -config client.conf
+openssl x509 -req -in client.csr -CA caCert.pem -CAkey caKey.pem -CAcreateserial -out clientCert.pem -days 100000 -extensions v3_req -extfile client.conf
+
+outfile=certs_test.go
+
+cat > $outfile << EOF
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+EOF
+
+echo "// This file was generated using openssl by the gencerts.sh script" >> $outfile
+echo "// and holds raw certificates for the webhook tests." >> $outfile
+echo "" >> $outfile
+echo "package webhook" >> $outfile
+for file in caKey caCert badCAKey badCACert serverKey serverCert clientKey clientCert; do
+	data=$(cat ${file}.pem)
+	echo "" >> $outfile
+	echo "var $file = []byte(\`$data\`)" >> $outfile
+done
+
+# Clean up after we're done.
+rm *.pem
+rm *.csr
+rm *.srl
+rm *.conf
diff --git a/metrics-server/vendor/k8s.io/apiserver/plugin/pkg/authorizer/webhook/webhook.go b/metrics-server/vendor/k8s.io/apiserver/plugin/pkg/authorizer/webhook/webhook.go
new file mode 100644
index 0000000..83157c4
--- /dev/null
+++ b/metrics-server/vendor/k8s.io/apiserver/plugin/pkg/authorizer/webhook/webhook.go
@@ -0,0 +1,260 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+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.
+*/
+
+// Package webhook implements the authorizer.Authorizer interface using HTTP webhooks.
+package webhook
+
+import (
+	"encoding/json"
+	"fmt"
+	"time"
+
+	"github.com/golang/glog"
+
+	authorization "k8s.io/api/authorization/v1beta1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apimachinery/pkg/util/cache"
+	"k8s.io/apiserver/pkg/authentication/user"
+	"k8s.io/apiserver/pkg/authorization/authorizer"
+	"k8s.io/apiserver/pkg/util/webhook"
+	"k8s.io/client-go/kubernetes/scheme"
+	authorizationclient "k8s.io/client-go/kubernetes/typed/authorization/v1beta1"
+)
+
+var (
+	groupVersions = []schema.GroupVersion{authorization.SchemeGroupVersion}
+)
+
+const retryBackoff = 500 * time.Millisecond
+
+// Ensure Webhook implements the authorizer.Authorizer interface.
+var _ authorizer.Authorizer = (*WebhookAuthorizer)(nil)
+
+type WebhookAuthorizer struct {
+	subjectAccessReview authorizationclient.SubjectAccessReviewInterface
+	responseCache       *cache.LRUExpireCache
+	authorizedTTL       time.Duration
+	unauthorizedTTL     time.Duration
+	initialBackoff      time.Duration
+	decisionOnError     authorizer.Decision
+}
+
+// NewFromInterface creates a WebhookAuthorizer using the given subjectAccessReview client
+func NewFromInterface(subjectAccessReview authorizationclient.SubjectAccessReviewInterface, authorizedTTL, unauthorizedTTL time.Duration) (*WebhookAuthorizer, error) {
+	return newWithBackoff(subjectAccessReview, authorizedTTL, unauthorizedTTL, retryBackoff)
+}
+
+// New creates a new WebhookAuthorizer from the provided kubeconfig file.
+//
+// The config's cluster field is used to refer to the remote service, user refers to the returned authorizer.
+//
+//     # clusters refers to the remote service.
+//     clusters:
+//     - name: name-of-remote-authz-service
+//       cluster:
+//         certificate-authority: /path/to/ca.pem      # CA for verifying the remote service.
+//         server: https://authz.example.com/authorize # URL of remote service to query. Must use 'https'.
+//
+//     # users refers to the API server's webhook configuration.
+//     users:
+//     - name: name-of-api-server
+//       user:
+//         client-certificate: /path/to/cert.pem # cert for the webhook plugin to use
+//         client-key: /path/to/key.pem          # key matching the cert
+//
+// For additional HTTP configuration, refer to the kubeconfig documentation
+// https://kubernetes.io/docs/user-guide/kubeconfig-file/.
+func New(kubeConfigFile string, authorizedTTL, unauthorizedTTL time.Duration) (*WebhookAuthorizer, error) {
+	subjectAccessReview, err := subjectAccessReviewInterfaceFromKubeconfig(kubeConfigFile)
+	if err != nil {
+		return nil, err
+	}
+	return newWithBackoff(subjectAccessReview, authorizedTTL, unauthorizedTTL, retryBackoff)
+}
+
+// newWithBackoff allows tests to skip the sleep.
+func newWithBackoff(subjectAccessReview authorizationclient.SubjectAccessReviewInterface, authorizedTTL, unauthorizedTTL, initialBackoff time.Duration) (*WebhookAuthorizer, error) {
+	return &WebhookAuthorizer{
+		subjectAccessReview: subjectAccessReview,
+		responseCache:       cache.NewLRUExpireCache(1024),
+		authorizedTTL:       authorizedTTL,
+		unauthorizedTTL:     unauthorizedTTL,
+		initialBackoff:      initialBackoff,
+		decisionOnError:     authorizer.DecisionNoOpinion,
+	}, nil
+}
+
+// Authorize makes a REST request to the remote service describing the attempted action as a JSON
+// serialized api.authorization.v1beta1.SubjectAccessReview object. An example request body is
+// provided below.
+//
+//     {
+//       "apiVersion": "authorization.k8s.io/v1beta1",
+//       "kind": "SubjectAccessReview",
+//       "spec": {
+//         "resourceAttributes": {
+//           "namespace": "kittensandponies",
+//           "verb": "GET",
+//           "group": "group3",
+//           "resource": "pods"
+//         },
+//         "user": "jane",
+//         "group": [
+//           "group1",
+//           "group2"
+//         ]
+//       }
+//     }
+//
+// The remote service is expected to fill the SubjectAccessReviewStatus field to either allow or
+// disallow access. A permissive response would return:
+//
+//     {
+//       "apiVersion": "authorization.k8s.io/v1beta1",
+//       "kind": "SubjectAccessReview",
+//       "status": {
+//         "allowed": true
+//       }
+//     }
+//
+// To disallow access, the remote service would return:
+//
+//     {
+//       "apiVersion": "authorization.k8s.io/v1beta1",
+//       "kind": "SubjectAccessReview",
+//       "status": {
+//         "allowed": false,
+//         "reason": "user does not have read access to the namespace"
+//       }
+//     }
+//
+// TODO(mikedanese): We should eventually support failing closed when we
+// encounter an error. We are failing open now to preserve backwards compatible
+// behavior.
+func (w *WebhookAuthorizer) Authorize(attr authorizer.Attributes) (decision authorizer.Decision, reason string, err error) {
+	r := &authorization.SubjectAccessReview{}
+	if user := attr.GetUser(); user != nil {
+		r.Spec = authorization.SubjectAccessReviewSpec{
+			User:   user.GetName(),
+			UID:    user.GetUID(),
+			Groups: user.GetGroups(),
+			Extra:  convertToSARExtra(user.GetExtra()),
+		}
+	}
+
+	if attr.IsResourceRequest() {
+		r.Spec.ResourceAttributes = &authorization.ResourceAttributes{
+			Namespace:   attr.GetNamespace(),
+			Verb:        attr.GetVerb(),
+			Group:       attr.GetAPIGroup(),
+			Version:     attr.GetAPIVersion(),
+			Resource:    attr.GetResource(),
+			Subresource: attr.GetSubresource(),
+			Name:        attr.GetName(),
+		}
+	} else {
+		r.Spec.NonResourceAttributes = &authorization.NonResourceAttributes{
+			Path: attr.GetPath(),
+			Verb: attr.GetVerb(),
+		}
+	}
+	key, err := json.Marshal(r.Spec)
+	if err != nil {
+		return w.decisionOnError, "", err
+	}
+	if entry, ok := w.responseCache.Get(string(key)); ok {
+		r.Status = entry.(authorization.SubjectAccessReviewStatus)
+	} else {
+		var (
+			result *authorization.SubjectAccessReview
+			err    error
+		)
+		webhook.WithExponentialBackoff(w.initialBackoff, func() error {
+			result, err = w.subjectAccessReview.Create(r)
+			return err
+		})
+		if err != nil {
+			// An error here indicates bad configuration or an outage. Log for debugging.
+			glog.Errorf("Failed to make webhook authorizer request: %v", err)
+			return w.decisionOnError, "", err
+		}
+		r.Status = result.Status
+		if r.Status.Allowed {
+			w.responseCache.Add(string(key), r.Status, w.authorizedTTL)
+		} else {
+			w.responseCache.Add(string(key), r.Status, w.unauthorizedTTL)
+		}
+	}
+	switch {
+	case r.Status.Denied && r.Status.Allowed:
+		return authorizer.DecisionDeny, r.Status.Reason, fmt.Errorf("webhook subject access review returned both allow and deny response")
+	case r.Status.Denied:
+		return authorizer.DecisionDeny, r.Status.Reason, nil
+	case r.Status.Allowed:
+		return authorizer.DecisionAllow, r.Status.Reason, nil
+	default:
+		return authorizer.DecisionNoOpinion, r.Status.Reason, nil
+	}
+
+}
+
+//TODO: need to finish the method to get the rules when using webhook mode
+func (w *WebhookAuthorizer) RulesFor(user user.Info, namespace string) ([]authorizer.ResourceRuleInfo, []authorizer.NonResourceRuleInfo, bool, error) {
+	var (
+		resourceRules    []authorizer.ResourceRuleInfo
+		nonResourceRules []authorizer.NonResourceRuleInfo
+	)
+	incomplete := true
+	return resourceRules, nonResourceRules, incomplete, fmt.Errorf("webhook authorizer does not support user rule resolution")
+}
+
+func convertToSARExtra(extra map[string][]string) map[string]authorization.ExtraValue {
+	if extra == nil {
+		return nil
+	}
+	ret := map[string]authorization.ExtraValue{}
+	for k, v := range extra {
+		ret[k] = authorization.ExtraValue(v)
+	}
+
+	return ret
+}
+
+// subjectAccessReviewInterfaceFromKubeconfig builds a client from the specified kubeconfig file,
+// and returns a SubjectAccessReviewInterface that uses that client. Note that the client submits SubjectAccessReview
+// requests to the exact path specified in the kubeconfig file, so arbitrary non-API servers can be targeted.
+func subjectAccessReviewInterfaceFromKubeconfig(kubeConfigFile string) (authorizationclient.SubjectAccessReviewInterface, error) {
+	localScheme := runtime.NewScheme()
+	scheme.AddToScheme(localScheme)
+	localScheme.SetVersionPriority(groupVersions...)
+
+	gw, err := webhook.NewGenericWebhook(localScheme, scheme.Codecs, kubeConfigFile, groupVersions, 0)
+	if err != nil {
+		return nil, err
+	}
+	return &subjectAccessReviewClient{gw}, nil
+}
+
+type subjectAccessReviewClient struct {
+	w *webhook.GenericWebhook
+}
+
+func (t *subjectAccessReviewClient) Create(subjectAccessReview *authorization.SubjectAccessReview) (*authorization.SubjectAccessReview, error) {
+	result := &authorization.SubjectAccessReview{}
+	err := t.w.RestClient.Post().Body(subjectAccessReview).Do().Into(result)
+	return result, err
+}
